printfT( "\nmain thread received signal %d\n",signo );
#endif
prepareAbort();
// durch's Abbrechen gibt es manchmal einen SIGSEGV der sub-threads, da sie
// z.B. auf eine Datei zugreifen, die schon geschlossen wurde.
// die Kinder müssen zuerst gekillt werden (aber wie??)
// Holzhammer: die Threads brechen bei SIGSEGV ab. Die Sockets werden auf
// NONBLOCK gestellt und lösen ein SIGUSR1 aus, wenn abgebrochen werden soll
//
areas.mailException(); // otherwise semaphors could block forever
areas.mailPrintf1( 1,"\n*** signal %d received ***\n\n",signo );
stopTimerEtc( EXIT_FAILURE );
areas.forceMail(); // generate status mail in case of signal reception
areas.closeAll();
if ( !readOnly)
newsrc.writeFile();
exit( EXIT_FAILURE ); // wird ein raise() gemacht, so werden die exit-Routinen nicht aufgerufen (z.B. files löschen)
} // signalHandler
int main( int argc, char **argv )
{
int retcode = EXIT_SUCCESS;
char *s;
#ifdef DEBUG
setvbuf( stdout,NULL,_IONBF,0 );
#endif
#ifdef OS2
if (_osmode != OS2_MODE) {
hprintfT( STDERR_FILENO,"sorry, DOS not sufficient...\n" );
exit( EXIT_FAILURE );
}
#endif
signal(SIGINT, signalHandler ); // ^C
signal(SIGBREAK, signalHandler ); // ^Break
signal(SIGHUP, signalHandler ); // hang up
signal(SIGPIPE, signalHandler ); // broken pipe
signal(SIGTERM, signalHandler ); // kill (läßt der sich doch catchen?)
signal(SIGUSR1, SIG_IGN ); // ignore this signal in the main thread (which should not be aborted...)
progname = strrchr(argv[0], '\\');
if (progname == NULL)
progname = argv[0];
else
++progname;
//
// get some environment vars (HOME, NNTPSERVER)
//
parseCmdLine(argc, argv, 0); // only get doIni (-i)
#ifdef OS2
if (doIni)
readTcpIni();
#endif
if ((homeDir = getenv("HOME")) == NULL)
homeDir = ".";
if ((s = getenv("NNTPSERVER")) != NULL)
getUrlInfo( getenv("NNTPSERVER"), nntpInfo );
setFiles();
parseCmdLine(argc, argv, 1);
assert( _heapchk() == _HEAPOK );
//
// check the number of free file handles
//
#ifndef HANDLEERR
if (mode == RECEIVE && doNews) {
int h = nhandles(150); // maximum 150 handles
#ifdef DEBUG_ALL
printfT( "nhandles() returned %d\n", h );
#endif
if (2*maxNntpThreads+8 > h) {
if (threadCntGiven)
areas.mailPrintf1( 1,"%s: not enough file handles for %d connected threads\n",
progname, maxNntpThreads );
maxNntpThreads = (h-8) / 2;
if (threadCntGiven)
areas.mailPrintf1( 1,"%s: number of threads cut to %d (increase the -h setting in the EMXOPT\n\tenvironment variable in CONFIG.SYS, e.g. 'SET EMXOPT=-h40')\n",
progname,maxNntpThreads );
if (maxNntpThreads < 1)
exit( EXIT_FAILURE );
}
}
#endif
openAreasAndStartTimer(argc,argv);
#if defined(OS2) && defined(__MT__)
BEGINTHREAD( checkTransfer, NULL );
#endif
switch (mode) {
case RECEIVE:
if (doMail) {
if ( !getMail( pop3Info.host,pop3Info.user,pop3Info.passwd,pop3Info.port ))