Mercurial > noffle
diff outgoing.c @ 0:04124a4423d4 noffle
[svn] Initial revision
author | enz |
---|---|
date | Tue, 04 Jan 2000 11:35:42 +0000 |
parents | |
children | 526a4c34ee2e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/outgoing.c Tue Jan 04 11:35:42 2000 +0000 @@ -0,0 +1,121 @@ +/* + outgoing.c + + $Id: outgoing.c 3 2000-01-04 11:35:42Z enz $ +*/ + +#include "outgoing.h" + +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> +#include "config.h" +#include "log.h" +#include "util.h" + +struct Outgoing +{ + DIR *dir; + Str serv; +} outgoing = { NULL, "" }; + +static void +fileOutgoing( Str file, const char *serv, const char *msgId ) +{ + snprintf( file, MAXCHAR, "%s/outgoing/%s/%s", + Cfg_spoolDir(), serv, msgId ); +} + +static void +createDir( const char *serv ) +{ + Str dir; + int r; + + snprintf( dir, MAXCHAR, "%s/outgoing/%s", Cfg_spoolDir(), serv ); + r = mkdir( dir, 0755 ); + if ( r != 0 ) + Log_dbg( "mkdir: %s", strerror( errno ) ); +} + +Bool +Out_add( const char *serv, const Str msgId, const DynStr *artTxt ) +{ + Str file; + FILE *f; + + fileOutgoing( file, serv, msgId ); + if ( ! ( f = fopen( file, "w" ) ) ) + { + createDir( serv ); + if ( ! ( f = fopen( file, "w" ) ) ) + { + Log_err( "Cannot open %s", file ); + return FALSE; + } + } + fprintf( f, "%s", DynStr_str( artTxt ) ); + fclose( f ); + return TRUE; +} + +Bool +Out_first( const char *serv, Str msgId, DynStr *artTxt ) +{ + Str file; + + snprintf( file, MAXCHAR, "%s/outgoing/%s", Cfg_spoolDir(), serv ); + if ( ! ( outgoing.dir = opendir( file ) ) ) + { + Log_dbg( "Cannot open %s", file ); + return FALSE; + } + Utl_cpyStr( outgoing.serv, serv ); + Out_next( NULL, NULL ); /* "." */ + Out_next( NULL, NULL ); /* ".." */ + return Out_next( msgId, artTxt ); +} + +Bool +Out_next( Str msgId, DynStr *artTxt ) +{ + struct dirent *d; + FILE *f; + Str file, line; + + ASSERT( outgoing.dir ); + if ( ! ( d = readdir( outgoing.dir ) ) ) + { + closedir( outgoing.dir ); + outgoing.dir = NULL; + return FALSE; + } + if ( artTxt == NULL ) + return ( d->d_name != NULL ); + fileOutgoing( file, outgoing.serv, d->d_name ); + if ( ! ( f = fopen( file, "r" ) ) ) + { + Log_err( "Cannot open %s for read", file ); + return FALSE; + } + DynStr_clear( artTxt ); + while ( fgets( line, MAXCHAR, f ) ) + DynStr_app( artTxt, line ); + Utl_cpyStr( msgId, d->d_name ); + fclose( f ); + return TRUE; +} + +void +Out_remove( const char *serv, Str msgId ) +{ + Str file; + + fileOutgoing( file, serv, msgId ); + if ( unlink( file ) != 0 ) + Log_err( "Cannot remove %s", file ); +}