Mercurial > noffle
diff src/request.c @ 281:5eece4dfd945 noffle
[svn] * src/log.c,src/log.h: Add Log_fatal() for reporting fatal errors
and exiting, Log_gdbm_fatal() for the the same but specifically as
a GDBM error reporting function, and a new log debug level AUTH for
a forthcoming authentication mechanism.
* src/database.c,src/group.c: Provide new gdbm error function to all
gdbm opens.
* src/noffle.c: Add atexit() to always close databases on a program-
inspired exit.
* src/content.c,src/dynamicstring.c,src/fetchlist.c,src/filter.c,
src/itemlist.c,src/log.c,src/log.h,src/over.c,src/protocol.h,
src/request.c,src/util.c: Use Log_fatal where appropriate.
author | bears |
---|---|
date | Fri, 27 Dec 2002 21:48:25 +0000 |
parents | 0340b9c17edc |
children | 6f99218719e4 |
line wrap: on
line diff
--- a/src/request.c Tue Dec 24 09:08:59 2002 +0000 +++ b/src/request.c Fri Dec 27 21:48:25 2002 +0000 @@ -3,7 +3,7 @@ Collection of articles that are marked for download. - $Id: request.c 381 2002-05-14 14:25:45Z mirkol $ + $Id: request.c 413 2002-12-27 21:48:25Z bears $ */ #if HAVE_CONFIG_H @@ -34,19 +34,19 @@ typedef struct Reqserv Reqserv; struct Reqserv { - char* serv; /* Server the messages are to be requested - from */ - char** reql; /* List of message IDs of requested - messages. Some entries (that have been - deleted) may be NULL */ - int reql_length; /* Number of string pointers in reql, - including NULL entries */ - int reql_capacity; /* maximum number of string pointers reql - can hold */ - Bool dirty; /* whether the request list needs to be - rewritten to disk */ - Reqserv* next; /* next Reqserv in list */ - time_t mtime; /* last modification time of request file */ + char* serv; /* Server the messages are to be requested + from */ + char** reql; /* List of message IDs of requested + messages. Some entries (that have been + deleted) may be NULL */ + int reql_length; /* Number of string pointers in reql, + including NULL entries */ + int reql_capacity; /* maximum number of string pointers reql + can hold */ + Bool dirty; /* whether the request list needs to be + rewritten to disk */ + Reqserv* next; /* next Reqserv in list */ + time_t mtime; /* last modification time of request file */ }; /* List of servers */ @@ -61,39 +61,46 @@ /* local functions */ -static Reqserv* newReqserv (const char* serv); -static Bool getReqserv (const char* serv, Reqserv** rsz); -static void fileRequest (Str file, const char *serv); -static char** searchMsgId (const Reqserv * rs, const char *msgId); -static Bool storeMsgId (Reqserv* rs, const char* msgId); -static Bool readRequestfile (const char* serv, Reqserv** rsz); -static time_t get_mtime (const char* serv); +static Reqserv* newReqserv ( const char* serv ); +static Bool getReqserv ( const char* serv, Reqserv** rsz ); +static void fileRequest ( Str file, const char *serv ); +static char** searchMsgId ( const Reqserv * rs, const char *msgId ); +static Bool storeMsgId ( Reqserv* rs, const char* msgId ); +static Bool readRequestfile ( const char* serv, Reqserv** rsz ); +static time_t get_mtime ( const char* serv ); /* read modification time of request file */ -static time_t get_mtime(const char* serv) +static time_t +get_mtime( const char* serv ) { - Str filename; - struct stat stat1; + Str filename; + struct stat stat1; - fileRequest(filename, serv); - stat(filename, &stat1); - return stat1.st_mtime; + fileRequest( filename, serv ); + stat( filename, &stat1 ); + return stat1.st_mtime; } /* create new Reqserv and queue it */ -static Reqserv* newReqserv(const char* serv) +static Reqserv* +newReqserv( const char* serv ) { - Reqserv* rs = malloc(sizeof(Reqserv)); - rs->serv = strcpy(malloc(strlen(serv)+1), serv); - rs->reql = 0; - rs->reql_length = 0; - rs->reql_capacity = 0; - rs->next = reqserv; - rs->dirty = FALSE; - rs->mtime = 0; - reqserv = rs; - return rs; + Reqserv *rs; + + rs = malloc( sizeof( Reqserv ) ); + if ( rs == NULL ) + Log_fatal( "Malloc of Reqserv failed." ); + + Utl_allocAndCpy( &(rs->serv), serv ); + rs->reql = 0; + rs->reql_length = 0; + rs->reql_capacity = 0; + rs->next = reqserv; + rs->dirty = FALSE; + rs->mtime = 0; + reqserv = rs; + return rs; } @@ -101,15 +108,18 @@ necessary. Return TRUE on success. Otherwise log errors and return FALSE. (details in errno) */ -static Bool getReqserv(const char* serv, Reqserv** rsz) +static Bool +getReqserv( const char* serv, Reqserv** rsz ) { - Reqserv* rs; - for (rs = reqserv; rs; rs = rs->next) - if (!strcmp(serv, rs->serv)) { - *rsz = rs; - return TRUE; - } - return readRequestfile(serv, rsz); + Reqserv* rs; + + for ( rs = reqserv; rs; rs = rs->next ) + if ( !strcmp( serv, rs->serv ) ) + { + *rsz = rs; + return TRUE; + } + return readRequestfile( serv, rsz ); } @@ -117,94 +127,96 @@ static void cleanupReqserv( void ) { - Reqserv *rs, *prev, *next; + Reqserv *rs, *prev, *next; - rs = reqserv; - prev = NULL; - while ( rs != NULL ) - { - ASSERT( ! rs->dirty ); - next = rs->next; - if ( get_mtime( rs->serv ) != rs->mtime ) - { - if ( prev != NULL ) - prev->next = next; - else - reqserv = next; - free( rs->serv ); - rs->serv = NULL; - free( rs->reql ); - rs->reql = NULL; - free( rs ); - } - prev = rs; - rs = next; - } + rs = reqserv; + prev = NULL; + while ( rs != NULL ) + { + ASSERT( ! rs->dirty ); + next = rs->next; + if ( get_mtime( rs->serv ) != rs->mtime ) + { + if ( prev != NULL ) + prev->next = next; + else + reqserv = next; + free( rs->serv ); + rs->serv = NULL; + free( rs->reql ); + rs->reql = NULL; + free( rs ); + } + prev = rs; + rs = next; + } } /* Save name of file storing requests from server "serv" in "file" */ -static void fileRequest( Str file, const char *serv) +static void +fileRequest( Str file, const char *serv ) { - snprintf( file, MAXCHAR, "%s/requested/%s", Cfg_spoolDir(), serv); + snprintf( file, MAXCHAR, "%s/requested/%s", Cfg_spoolDir(), serv); } /* Search for msgid in Reqserv. Return pointer to list entry. Return 0 if list does not contain msgid. */ -static char** searchMsgId(const Reqserv * rs, const char *msgId ) +static char** +searchMsgId( const Reqserv * rs, const char *msgId ) { - char** rz; - ASSERT(rs != 0); + char** rz; + ASSERT( rs != 0 ); - if (!rs->reql) + if ( !rs->reql ) + return 0; + + for ( rz = rs->reql; rz < rs->reql + rs->reql_length; rz++ ) + if ( *rz && !strcmp( *rz, msgId ) ) + return rz; + return 0; - - for (rz = rs->reql; rz < rs->reql + rs->reql_length; rz++) - if (*rz && !strcmp(*rz, msgId)) - return rz; - - return 0; } Bool -Req_contains(const char *serv, const char *msgId) +Req_contains( const char *serv, const char *msgId ) { - Reqserv* rs; - ASSERT( is_open ); - if (getReqserv(serv, &rs) == FALSE) - return FALSE; - return searchMsgId(rs, msgId) ? TRUE : FALSE; + Reqserv *rs; + ASSERT( is_open ); + if (getReqserv( serv, &rs ) == FALSE) + return FALSE; + return ( searchMsgId( rs, msgId ) != NULL ); } -static Bool storeMsgId(Reqserv* rs, const char* msgId) +static Bool +storeMsgId( Reqserv* rs, const char* msgId ) { - char* msgid; + char *msgid; - if (searchMsgId(rs, msgId)) - /* already recorded */ - return FALSE; + if ( searchMsgId( rs, msgId ) ) + /* already recorded */ + return FALSE; - msgid = strcpy(malloc(strlen(msgId)+1), msgId); + Utl_allocAndCpy( &msgid, msgId ); - if (rs->reql_length >= rs->reql_capacity) { - int c1 = rs->reql_capacity*2 + 10; - if ( ! ( rs->reql = (char**) realloc(rs->reql, c1*sizeof(char*) ) ) ) + if ( rs->reql_length >= rs->reql_capacity ) { - Log_err( "Could not realloc requests." ); - exit( EXIT_FAILURE ); + int c1 = rs->reql_capacity * 2 + 10; + rs->reql = ( char ** ) realloc( rs->reql, c1 * sizeof( char * ) ); + if ( rs->reql == NULL ) + Log_fatal( "Could not realloc requests." ); + rs->reql_capacity = c1; } - rs->reql_capacity = c1; - } - *(rs->reql + rs->reql_length++) = msgid; - rs->dirty = TRUE; - return TRUE; + *( rs->reql + rs->reql_length++ ) = msgid; + rs->dirty = TRUE; + return TRUE; } static Bool -appRequest (Reqserv* rs, const char *msgId) +appRequest( Reqserv* rs, const char *msgId ) { Str filename; FILE* file; @@ -213,19 +225,19 @@ Log_dbg( LOG_DBG_REQUESTS, "appending to request file %s", filename ); if (Log_check((file = fopen(filename, "a")) != 0, - "could not open %s for appending: %s", - filename, strerror(errno))) - return FALSE; + "could not open %s for appending: %s", + filename, strerror(errno))) + return FALSE; if (Log_check( fputs(msgId, file) != EOF - && fputs("\n", file) != EOF, - "write error: %s", strerror(errno))) - return FALSE; + && fputs("\n", file) != EOF, + "write error: %s", strerror(errno))) + return FALSE; if (Log_check(fclose(file) != EOF, - "could not close %s properly: %s\n", - filename, strerror(errno))) - return FALSE; + "could not close %s properly: %s\n", + filename, strerror(errno))) + return FALSE; return TRUE; } @@ -234,16 +246,17 @@ /* Add request for message "msgIg" from server "serv". Return TRUE iff successful. */ -Bool Req_add(const char *serv, const char *msgId) +Bool +Req_add( const char *serv, const char *msgId ) { Reqserv* rs; ASSERT( is_open ); Log_dbg( LOG_DBG_REQUESTS, "Marking %s on %s for download", msgId, serv ); - if (getReqserv(serv, &rs) == FALSE) - return FALSE; - if (storeMsgId(rs, msgId) == FALSE) /* already recorded */ - return TRUE; + if ( ! getReqserv( serv, &rs ) ) + return FALSE; + if ( ! storeMsgId(rs, msgId) ) /* already recorded */ + return TRUE; return appRequest(rs, msgId); } @@ -264,81 +277,86 @@ "rsz" and return TRUE on success. Returns FALSE on failure, see errno. If the file doesn't exist, an empty Reqserv is returned. */ -static Bool readRequestfile(const char* serv, Reqserv** rsz) +static Bool +readRequestfile( const char* serv, Reqserv** rsz ) { - Str filename; - Str line; - FILE* file; - Reqserv* rs; + Str filename; + Str line; + FILE* file; + Reqserv* rs; + + fileRequest( filename, serv ); + Log_dbg( LOG_DBG_REQUESTS, "reading request file %s", filename ); - fileRequest(filename, serv); - Log_dbg( LOG_DBG_REQUESTS, "reading request file %s", filename ); + file = fopen( filename, "r" ); + if ( !file && ( errno == ENOENT ) ) + { + *rsz = newReqserv( serv ); + (*rsz)->mtime = get_mtime( serv ); + return TRUE; + } + if ( Log_check( file != 0, + "could not open %s for reading: %s", + filename, strerror( errno ) ) ) + return FALSE; + + rs = *rsz = newReqserv( serv ); - file = fopen(filename, "r"); - if (!file && (errno == ENOENT)) { - *rsz = newReqserv(serv); - (*rsz)->mtime = get_mtime(serv); + while( readLn( line, file ) ) + { + char *line1 = Utl_stripWhiteSpace( line ); + if ( *line1 ) + storeMsgId( rs, line1 ); + } + + rs->dirty = FALSE; + + if ( Log_check( fclose( file ) != EOF, + "could not close %s properly: %s\n", + filename, strerror( errno ) ) ) + return FALSE; + return TRUE; - } - if (Log_check(file != 0, - "could not open %s for reading: %s", - filename, strerror(errno))) - return FALSE; - - rs = *rsz = newReqserv(serv); - - while( readLn(line, file) == TRUE) { - char* line1 = Utl_stripWhiteSpace(line); - if (*line1) - storeMsgId(rs, line1); - } - - rs->dirty = FALSE; - - if (Log_check(fclose(file) != EOF, - "could not close %s properly: %s\n", - filename, strerror(errno))) - return FALSE; - - return TRUE; } /* Write out request file for given Reqserv. Return TRUE on success. If an I/O error occurs, it is logged, and FALSE is returned. */ -static Bool writeRequestfile(Reqserv* rs) +static Bool +writeRequestfile( Reqserv* rs ) { - Str filename; - FILE* file; - char** z; + Str filename; + FILE* file; + char** z; - fileRequest(filename, rs->serv); - Log_dbg( LOG_DBG_REQUESTS, "writing request file %s", filename ); + fileRequest( filename, rs->serv ); + Log_dbg( LOG_DBG_REQUESTS, "writing request file %s", filename ); - if (Log_check((file = fopen(filename, "w")) != 0, - "could not open %s for writing: %s", - filename, strerror(errno))) - return FALSE; + if ( Log_check( ( file = fopen( filename, "w" ) ) != 0, + "could not open %s for writing: %s", + filename, strerror( errno ) ) ) + return FALSE; - if (rs->reql) - for (z = rs->reql; z < rs->reql+rs->reql_length; z++) - if (*z) { - if (Log_check( fputs(*z, file) != EOF - && fputs("\n", file) != EOF, - "write error: %s", strerror(errno))) - return FALSE; - } + if ( rs->reql ) + for ( z = rs->reql; z < rs->reql+rs->reql_length; z++ ) + if ( *z ) + { + if ( Log_check( fputs( *z, file ) != EOF + && fputs( "\n", file ) != EOF, + "write error: %s", strerror( errno ) ) ) + return FALSE; + } - if (Log_check(fclose(file) != EOF, - "could not close %s properly: %s\n", - filename, strerror(errno))) - return FALSE; + if ( Log_check( fclose( file ) != EOF, + "could not close %s properly: %s\n", + filename, strerror( errno ) ) ) + return FALSE; - rs->dirty = FALSE; - rs->mtime = get_mtime(rs->serv); + rs->dirty = FALSE; + rs->mtime = get_mtime( rs->serv ); - return TRUE; + return TRUE; } @@ -351,14 +369,14 @@ ASSERT( is_open ); Log_dbg( LOG_DBG_REQUESTS, "Req_remove(\"%s\", \"%s\")", serv, msgId ); - if (getReqserv(serv, &rs) == FALSE) + if ( !getReqserv(serv, &rs) ) return; - z = searchMsgId(rs, msgId); + z = searchMsgId( rs, msgId ); if ( ! z ) return; - free(*z); + free( *z ); *z = 0; rs->dirty = TRUE; } @@ -367,45 +385,47 @@ Bool Req_first( const char *serv, Str msgId ) { - Reqserv* rs; + Reqserv* rs; - ASSERT( is_open ); - ASSERT( !iterator && !iterator_end ); + ASSERT( is_open ); + ASSERT( !iterator && !iterator_end ); - if (getReqserv(serv, &rs) == FALSE) - return FALSE; + if ( !getReqserv( serv, &rs ) ) + return FALSE; - if (!rs->reql) - return FALSE; + if ( !rs->reql ) + return FALSE; - iterator = rs->reql - 1; - iterator_end = rs->reql + rs->reql_length; + iterator = rs->reql - 1; + iterator_end = rs->reql + rs->reql_length; - return Req_next(msgId); + return Req_next( msgId ); } Bool Req_next( Str msgId ) { - ASSERT( is_open ); - ASSERT(iterator && iterator_end); + ASSERT( is_open ); + ASSERT( iterator && iterator_end ); - if (iterator >= iterator_end) - return FALSE; - iterator++; + if ( iterator >= iterator_end ) + return FALSE; + iterator++; - while (iterator < iterator_end) { - if (!*iterator) - iterator++; - else { - Utl_cpyStr(msgId, *iterator); - return TRUE; + while ( iterator < iterator_end ) + { + if ( !*iterator ) + iterator++; + else + { + Utl_cpyStr( msgId, *iterator ); + return TRUE; + } } - } - iterator = iterator_end = 0; - return FALSE; + iterator = iterator_end = 0; + return FALSE; } @@ -414,32 +434,36 @@ changed recently, from cache. These files will be reread on demand. */ Bool -Req_open(void) +Req_open( void ) { - Log_dbg( LOG_DBG_REQUESTS, "opening request database" ); - ASSERT(is_open == FALSE); - cleanupReqserv(); - is_open = TRUE; - return TRUE; + Log_dbg( LOG_DBG_REQUESTS, "opening request database" ); + ASSERT( !is_open ); + + cleanupReqserv(); + is_open = TRUE; + return TRUE; } /* Do not occupy the request files any longer. Write any changes to disk. Return TRUE on success, FALSE if an IO error occurs. */ -void Req_close(void) +void +Req_close(void) { - Bool ret = TRUE; - Reqserv* rs; - Log_dbg( LOG_DBG_REQUESTS, - "closing request database, writing changes to disk" ); - ASSERT(is_open == TRUE); + Bool ret = TRUE; + Reqserv* rs; + Log_dbg( LOG_DBG_REQUESTS, + "closing request database, writing changes to disk" ); + ASSERT( is_open ); - for (rs = reqserv; rs; rs = rs->next) { - if (rs->dirty == TRUE) { - if (!writeRequestfile(rs)) - ret = FALSE; + for ( rs = reqserv; rs; rs = rs->next ) + { + if ( rs->dirty ) + { + if ( !writeRequestfile( rs ) ) + ret = FALSE; + } } - } - is_open = FALSE; + is_open = FALSE; }