diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 | 
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildrop/maildrop.C | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'maildrop/maildrop.C')
| -rw-r--r-- | maildrop/maildrop.C | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/maildrop/maildrop.C b/maildrop/maildrop.C new file mode 100644 index 0000000..10a0c01 --- /dev/null +++ b/maildrop/maildrop.C @@ -0,0 +1,113 @@ +#include "config.h" +/* +** Copyright 1998 - 2006 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#include	"maildrop.h" +#include	"exittrap.h" +#include	<signal.h> +#include	<sysexits.h> +#include	<errno.h> +#if SYSLOG_LOGGING +#include	<syslog.h> +#endif + +extern void killprocgroup(); + + +int Maildrop::sigfpe; + +static RETSIGTYPE sig_fpe(int) +{ +	maildrop.sigfpe=1; +	signal (SIGFPE, sig_fpe); +#if RETSIGTYPE != void +	return (0); +#endif +} + +void Maildrop::cleanup() +{ +	ExitTrap::onexit(); +	killprocgroup(); +} + +RETSIGTYPE Maildrop::bye(int n) +{ +static const char msg[]="maildrop: signal 0x"; +static const char hex[]="0123456789ABCDEF"; + +	cleanup(); +	if (write(2, msg, sizeof(msg)-1) < 0 || +	    write(2, hex+ ((n / 16) & 0x0F), 1) < 0 || +	    write(2, hex+ (n & 0x0F), 1) < 0 || +	    write(2, "\n", 1) < 0) +		; /* gcc shut up */ + +	_exit(EX_TEMPFAIL); + +#if RETSIGTYPE != void +	return (0); +#endif +} + +int Maildrop::trap(int (*func)(int, char *[]), int argc, char *argv[]) +{ +int	n; + +	for (n=0; n<NSIG; n++) +		signal(n, bye); +	signal(SIGPIPE, SIG_IGN); +#ifdef SIGWINCH +	signal(SIGWINCH, SIG_IGN); +#endif +	signal(SIGCHLD, SIG_DFL); +	signal(SIGFPE,  sig_fpe); + +#if SYSLOG_LOGGING +	openlog("maildrop", LOG_PID, LOG_MAIL); +#endif + +	try +	{ +	int	r=(*func)(argc, argv); + +		cleanup(); +		return (r); +	} +	catch (const char *p) +	{ +		merr << argv[0] << ": " << p << "\n"; +#if SYSLOG_LOGGING +		syslog(LOG_INFO, p); +#endif +		cleanup(); +		return (EX_TEMPFAIL); +	} +#if NEED_NONCONST_EXCEPTIONS +	catch (char *p) +	{ +		merr << argv[0] << ": " << p << "\n"; +#if SYSLOG_LOGGING +		syslog(LOG_INFO, p); +#endif +		cleanup(); +		return (EX_TEMPFAIL); +	} +#endif +	catch (int n) +	{ +		cleanup(); +		return (n); +	} +	catch (...) +	{ +		merr << argv[0] << ": Internal error.\n"; +#if SYSLOG_LOGGING +		syslog(LOG_INFO, "Internal error."); +#endif +		cleanup(); +		return (EX_TEMPFAIL); +	} +} | 
