#include <sys/stat.h> #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" VOTE_DATA * first_poll; VOTE_DATA * last_poll; /* local routines */ void fread_poll args( ( VOTE_DATA *poll, FILE *fp ) ); bool load_poll_file args( ( char *pollfile ) ); void write_poll_list args( ( void ) ); void write_poll_list( ) { VOTE_DATA *tpoll; FILE *fpout; char player[256]; sprintf( player, "%s%s", VOTE_DIR, VOTE_LIST ); fpout = fopen( player, "w" ); if ( !fpout ) { bug( "FATAL: cannot open vote.lst for writing!\n\r", 0 ); return; } for ( tpoll = first_poll; tpoll; tpoll = tpoll->next ) fprintf( fpout, "%s\n", tpoll->player ); fprintf( fpout, "$\n" ); fclose( fpout ); } /* * Save a poll's data to its data file */ void save_poll( VOTE_DATA *poll ) { FILE *fp; char player[256]; char buf[MAX_STRING_LENGTH]; if ( !poll ) { bug( "save_poll: null poll pointer!", 0 ); return; } if ( !poll->player || poll->player[0] == '\0' ) return; sprintf( player, "%s%s", VOTE_DIR, poll->player ); fclose( fpReserve ); if ( ( fp = fopen( player, "w" ) ) == NULL ) { bug( "save_poll: fopen", 0 ); perror( player ); } else { fprintf( fp, "#VOTE\n" ); fprintf( fp, "Player %s~\n", poll->player ); fprintf( fp, "Type %d\n", poll->type ); fprintf( fp, "Infavour %d\n", poll->in_favour ); fprintf( fp, "Against %d\n", poll->against ); fprintf( fp, "Timeofvote %s~\n", poll->time_of_vote ); fprintf( fp, "Iplist %s~\n", poll->ip_list ); fprintf( fp, "Namelist %s~\n", poll->name_list ); fprintf( fp, "End\n\n" ); fprintf( fp, "#END\n" ); } fclose( fp ); fpReserve = fopen( NULL_FILE, "r" ); return; } /* * Read in actual poll data. */ #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void fread_poll( VOTE_DATA *poll, FILE *fp ) { char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Against", poll->against, fread_number( fp ) ); break; case 'E': if ( !str_cmp( word, "End" ) ) { if (!poll->time_of_vote) poll->time_of_vote = STRALLOC( "" ); if (!poll->ip_list) poll->ip_list = STRALLOC( "" ); if (!poll->name_list) poll->name_list = STRALLOC( "" ); return; } break; case 'I': KEY( "Infavour", poll->in_favour, fread_number( fp ) ); KEY( "Iplist", poll->ip_list, fread_string( fp ) ); break; case 'N': KEY( "Namelist", poll->name_list, fread_string( fp ) ); break; case 'P': KEY( "Player", poll->player, fread_string( fp ) ); break; case 'T': KEY( "Timeofvote", poll->time_of_vote, fread_string( fp ) ); KEY( "Type", poll->type, fread_number( fp ) ); break; } if ( !fMatch ) { sprintf( buf, "Fread_poll: no match: %s", word ); bug( buf, 0 ); } } } /* * Load a poll file */ bool load_poll_file( char *pollfile ) { char player[256]; VOTE_DATA *poll; FILE *fp; bool found; CREATE( poll, VOTE_DATA, 1 ); found = FALSE; sprintf( player, "%s%s", VOTE_DIR, pollfile ); if ( ( fp = fopen( player, "r" ) ) != NULL ) { found = TRUE; for ( ; ; ) { char letter; char *word; letter = fread_letter( fp ); if ( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter != '#' ) { bug( "Load_poll_file: # not found.", 0 ); break; } word = fread_word( fp ); if ( !str_cmp( word, "VOTE" ) ) { fread_poll( poll, fp ); break; } else if ( !str_cmp( word, "END" ) ) break; else { char buf[MAX_STRING_LENGTH]; sprintf( buf, "Load_poll_file: bad section: %s.", word ); bug( buf, 0 ); break; } } fclose( fp ); } if ( found ) { LINK( poll, first_poll, last_poll, next, prev ); return found; } else DISPOSE( poll ); return found; } /* * Load in all the poll files. */ void load_polls( ) { FILE *fpList; char *player; char polllist[256]; char buf[MAX_STRING_LENGTH]; first_poll = NULL; last_poll = NULL; log_string( "Loading polls..." ); sprintf( polllist, "%s%s", VOTE_DIR, VOTE_LIST ); fclose( fpReserve ); if ( ( fpList = fopen( polllist, "r" ) ) == NULL ) { perror( polllist ); exit( 1 ); } for ( ; ; ) { player = feof( fpList ) ? "$" : fread_word( fpList ); log_string( player ); if ( player[0] == '$' ) break; if ( !load_poll_file( player ) ) { sprintf( buf, "Cannot load poll file: %s", player ); bug( buf, 0 ); } } fclose( fpList ); log_string(" Done polls\n\r" ); fpReserve = fopen( NULL_FILE, "r" ); return; }