/* highscore_rpc-server.c -- The hiscore server using SunRPC. Created on: 2009/01/09 01:31:49 ~yas/dsys/highscore/rpc/highscore_rpc-server.c */ #include /* stderr, fprintf() */ #include /* strtol() */ #include /* memcpy() */ #include "highscore_rpc.h" /* Hiscore data in memory */ static score_record_t hiscore_records[HIGHSCORE_MAX_RECORDS]; static int hiscore_nelements; static void hiscore_server( int portno ); static void hiscore_request_reply( int com ); static int insert_score( score_record_t records[], int len, int nelement, int score, char *user ); static int find_posision( score_record_t records[], int len, int nelement, int score ); get_highscore_result_t * get_highscore_1_svc( int *argp, struct svc_req *rqstp ) { static get_highscore_result_t result; int len,i,n ; xdr_free( (xdrproc_t)xdr_get_highscore_result_t, (char *)&result ); len = *argp; if( len > HIGHSCORE_MAX_RECORDS ) len = HIGHSCORE_MAX_RECORDS; n = len < hiscore_nelements ? len : hiscore_nelements ; /* return n and hiscore_records[0..n-1] to client. */ result.records.records_len = n ; result.records.records_val = malloc( sizeof(score_record_t)*n ); if( result.records.records_val == NULL ) { fprintf( stderr,"highscore_rpc-server: no memory\n" ); result.records.records_len = 0; goto error0; } for( i=0 ; iscore, argp->name ); return( &result ); } static int insert_score( score_record_t records[], int len, int nelement, int score, char *user ) { int pos, copy_records; pos = find_posision( records, len, nelement, score ); if( pos < 0 ) return( -1 ); if( nelement == len ) copy_records = nelement - pos - 1; else copy_records = nelement - pos ; memcpy( &records[pos+1], &records[pos], copy_records*sizeof(score_record_t) ); memset( &records[pos], 0, sizeof(score_record_t) ); records[pos].score = score ; snprintf( records[pos].name, HIGHSCORE_NAME_LEN, "%s", user ); return( nelement == len ? nelement : nelement+1 ); } static int find_posision( score_record_t records[], int len, int nelement, int score ) { score_record_t *pos; int i; for( i=0; i