Mercurial > noffle
view 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 source
/* 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 ); }