// Leto changed a type cast from string to string *
#define MONITOR_TIME 900
#define WHO find_living( "asdfral" )
#define TELL(x) if(WHO) message( "debug", "MSG: " + x+ "\n", WHO );
#include <uid.h>
#include <mailer.h>
#include <net/macros.h>
static void monitor_mesgs();
string *remain;
string mesg;
static int idx1, idx2;
static
void increment_idx() {
if( ++idx1 > 9 ) {
idx1 = 0 ;
if( ++idx2 > 9 ) idx2 = 0;
}
}
static
void refresh() {
mesg = 0;
remain = ({ });
}
static
int restore_mesg( int id ) {
string file;
refresh();
file = mail_mesg_file( id );
if( !file_exists( file + __SAVE_EXTENSION__ ) ) return 0;
return restore_object( file );
}
int save_mesg( int id ) {
int ret;
string file;
if( !id ) return 0;
if( file = mail_mesg_file( id ) ) {
if( !sizeof( remain ) )
rm( file + __SAVE_EXTENSION__ );
else
ret = save_object( file );
}
return ret;
}
int
valid_access( string frm ) {
string accessor, *owner;
if( geteuid( previous_object() ) == ROOT_UID )
return 1;
accessor = base_name( previous_object() );
if( member_array( accessor, TRUSTED_MAILERS ) > -1 )
return 1;
} // valid_access
string
get_mesg( int id ) {
if( !restore_mesg( id ) )
printf( "Unable to restore %d.\n", id );
if( !mesg || mesg == "" ) mesg = "Empty or lost message!\n";
return mesg;
}
int add_mesg( string *local_to, string msg ) {
int idx;
refresh();
idx = time();
// We have to have a unique savefile, or else we have problems later.
while( file_exists( mail_mesg_file( idx ) + __SAVE_EXTENSION__ ) )
--idx;
remain = uniq_array( local_to );
mesg = msg;
save_mesg( idx );
return idx;
}
int
delete_mesg( int id, string user ) {
refresh();
if( !restore_mesg( id ) ) return 0;
if( !stringp( user ) || !strlen( user ) ) return -1;
if( member_array( user, remain ) < 0 ) return -2;
remain -= ({ user });
save_mesg( id );
return 1;
}
void
create() {
seteuid( ROOT_UID );
idx1 = 0;
idx2 = 0;
// Mobydick disarmed the following line, cause I'm not sure it needs to
// be running unless we do a purge, and it does a lot of file access
// (read slow). We should probably put this on a switch of some kind
// so that we can launch it right after we do a purge, or a lot of people
// despoool their mail, or some such.
// call_out( "monitor_mesgs", 100 );
refresh();
} // create
static
void monitor_mesgs() {
int i;
string *mesgs;
increment_idx();
mesgs = get_dir( MESGDIR + idx1 + "/" + idx2 + "/*" __SAVE_EXTENSION__ );
i = sizeof( mesgs );
while( i-- ) {
sscanf( mesgs[i], "%s" __SAVE_EXTENSION__, mesgs[i] );
call_out( "monitor_mesg2", 5 + (10*i), mesgs[i] );
}
call_out( "monitor_mesgs", MONITOR_TIME );
return;
}
static
void monitor_mesg2( string mesg ) {
int i, j, id;
string *tmp, *tmp2;
tmp = ({ });
tmp2 = ({ });
TELL( "Verify: " + mesg );
restore_mesg( id = to_int( mesg ) );
remain = uniq_array( remain );
tmp = (string *) MAILBOX_D -> verify_mbox( copy( remain ), id ); //Leto
j = sizeof( tmp );
while( j-- )
if( user_exists( tmp[j] ) ) tmp2 += ({ tmp[j] });
if( sizeof( remain ) == sizeof( tmp2 ) ) return;
remain = tmp2;
save_mesg( id );
}
/* EOF */