int main( int argc, char ** argv ) { Scope global; EventLoop::setup(); const char * error = 0; bool ok = true; if ( argc != 5 ) { error = "Wrong number of arguments"; ok = false; } uint port = 0; if ( ok ) { port = EString( argv[1] ).number( &ok ); if ( !ok ) error = "Could not parse own port number"; } if ( ok ) { Listener<RecorderServer> * l4 = new Listener<RecorderServer>( Endpoint( "0.0.0.0", port ), "recording relay/4" ); Allocator::addEternal( l4, "recording listener" ); Listener<RecorderServer> * l6 = new Listener<RecorderServer>( Endpoint( "::", port ), "recording relay/6" ); Allocator::addEternal( l6, "recording listener" ); if ( l4->state() != Connection::Listening && l6->state() != Connection::Listening ) error = "Could not listen for connections"; } if ( ok ) { port = EString( argv[3] ).number( &ok ); if ( !ok ) error = "Could not parse server's port number"; } if ( ok ) { EStringList l = Resolver::resolve( argv[2] ); if ( l.isEmpty() ) { ok = false; error = (EString("Cannot resolve ") + argv[2] + ": " + Resolver::errors().join( ", " ) ).cstr(); } else { ep = new Endpoint( *l.first(), port ); Allocator::addEternal( ep, "target server endpoint" ); } if ( ep && !ep->valid() ) { ok = false; error = "Invalid server address"; } } if ( !ok ) { fprintf( stderr, "Error: %s\n" "Usage: recorder port address port filebase\n" " First port: The recorder's own port.\n" " Address: The IP address of the server to forward to.\n" " Second port: The server port to forward to.\n" " Filebase: The filename base (.<blah> is added).\n", error ); exit( 1 ); } ::base = new EString( argv[4] ); Allocator::addEternal( ::base, "base of recorded file names" ); global.setLog( new Log ); EventLoop::global()->start(); }
void POP::parse() { Buffer *b = readBuffer(); while ( b->size() > 0 ) { if ( !d->reader ) { if ( d->reserved ) break; EString * s = b->removeLine( 255 ); if ( !s && b->size() < 255 ) return; if ( !s ) { log( "Connection closed due to overlong line (" + fn( b->size() ) + " bytes)", Log::Error ); err( "Line too long. Closing connection." ); Connection::setState( Closing ); return; } bool unknown = false; EStringList * args = EStringList::split( ' ', *s ); EString cmd = args->take( args->first() )->lower(); if ( d->sawUser && !( cmd == "quit" || cmd == "pass" ) ) { d->sawUser = false; unknown = true; } else if ( cmd == "quit" && args->isEmpty() ) { newCommand( d->commands, this, PopCommand::Quit ); } else if ( cmd == "capa" && args->isEmpty() ) { newCommand( d->commands, this, PopCommand::Capa ); } else if ( d->state == Authorization ) { if ( cmd == "stls" ) { if ( hasTls() ) err( "Nested STLS" ); else newCommand( d->commands, this, PopCommand::Stls ); } else if ( cmd == "auth" ) { newCommand( d->commands, this, PopCommand::Auth, args ); } else if ( cmd == "user" && args->count() == 1 ) { d->sawUser = true; newCommand( d->commands, this, PopCommand::User, args ); } else if ( d->sawUser && cmd == "pass" && args->count() >= 1 ) { d->sawUser = false; newCommand( d->commands, this, PopCommand::Pass, args ); } else if ( cmd == "apop" && args->count() == 2 ) { newCommand( d->commands, this, PopCommand::Apop, args ); } else { unknown = true; } } else if ( d->state == Transaction ) { if ( cmd == "stat" && args->isEmpty() ) { newCommand( d->commands, this, PopCommand::Stat ); } else if ( cmd == "list" && args->count() < 2 ) { newCommand( d->commands, this, PopCommand::List, args ); } else if ( cmd == "top" && args->count() == 2 ) { newCommand( d->commands, this, PopCommand::Top, args ); } else if ( cmd == "retr" && args->count() == 1 ) { newCommand( d->commands, this, PopCommand::Retr, args ); } else if ( cmd == "dele" && args->count() == 1 ) { newCommand( d->commands, this, PopCommand::Dele, args ); } else if ( cmd == "noop" && args->isEmpty() ) { newCommand( d->commands, this, PopCommand::Noop ); } else if ( cmd == "rset" && args->isEmpty() ) { newCommand( d->commands, this, PopCommand::Rset ); } else if ( cmd == "uidl" && args->count() < 2 ) { newCommand( d->commands, this, PopCommand::Uidl, args ); } else { unknown = true; } } else { unknown = true; } if ( unknown ) { err( "Bad command" ); recordSyntaxError(); } } else { d->reader->read(); } runCommands(); } }