diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | common/smtppass.c | 41 | ||||
-rw-r--r-- | common/sppriv.h | 1 | ||||
-rw-r--r-- | doc/clamsmtpd.conf.5 | 11 |
4 files changed, 40 insertions, 14 deletions
@@ -1,5 +1,6 @@ 0.9.1 - Fixed problems with the select zeroing out timeouts. + - Added support for setting the PidFile from the config file 0.9 - Don't quit when too many threads created diff --git a/common/smtppass.c b/common/smtppass.c index 468991a..22dc06e 100644 --- a/common/smtppass.c +++ b/common/smtppass.c @@ -142,6 +142,7 @@ spthread_t; #define CFG_TRANSPARENT "TransparentProxy" #define CFG_DIRECTORY "TempDirectory" #define CFG_USER "User" +#define CFG_PIDFILE "PidFile" /* ----------------------------------------------------------------------- * DEFAULT SETTINGS @@ -168,7 +169,7 @@ pthread_mutexattr_t g_mtxattr; static void on_quit(int signal); static void drop_privileges(); -static void pid_file(const char* pidfile, int write); +static void pid_file(int write); static void connection_loop(int sock); static void* thread_main(void* arg); static int smtp_passthru(spctx_t* ctx); @@ -224,6 +225,7 @@ int sp_run(const char* configfile, const char* pidfile, int dbg_level) if(!(dbg_level == -1 || dbg_level <= LOG_DEBUG)) errx(2, "invalid debug log level (must be between 1 and 4)"); g_state.debug_level = dbg_level; + g_state.pidfile = pidfile; /* Now parse the configuration file */ if(parse_config_file(configfile) == -1) @@ -306,15 +308,13 @@ int sp_run(const char* configfile, const char* pidfile, int dbg_level) siginterrupt(SIGINT, 1); siginterrupt(SIGTERM, 1); - if(pidfile) - pid_file(pidfile, 1); + pid_file(1); sp_messagex(NULL, LOG_DEBUG, "accepting connections"); connection_loop(sock); - if(pidfile) - pid_file(pidfile, 0); + pid_file(0); /* Our listen socket */ close(sock); @@ -390,33 +390,36 @@ static void drop_privileges() } -static void pid_file(const char* pidfile, int write) +static void pid_file(int write) { + if(!g_state.pidfile) + return; + if(write) { - FILE* f = fopen(pidfile, "w"); + FILE* f = fopen(g_state.pidfile, "w"); if(f == NULL) { - sp_message(NULL, LOG_ERR, "couldn't open pid file: %s", pidfile); + sp_message(NULL, LOG_ERR, "couldn't open pid file: %s", g_state.pidfile); } else { fprintf(f, "%d\n", (int)getpid()); if(ferror(f)) - sp_message(NULL, LOG_ERR, "couldn't write to pid file: %s", pidfile); + sp_message(NULL, LOG_ERR, "couldn't write to pid file: %s", g_state.pidfile); if(fclose(f) == EOF) - sp_message(NULL, LOG_ERR, "couldn't write to pid file: %s", pidfile); + sp_message(NULL, LOG_ERR, "couldn't write to pid file: %s", g_state.pidfile); } - sp_messagex(NULL, LOG_DEBUG, "wrote pid file: %s", pidfile); + sp_messagex(NULL, LOG_DEBUG, "wrote pid file: %s", g_state.pidfile); } else { - unlink(pidfile); - sp_messagex(NULL, LOG_DEBUG, "removed pid file: %s", pidfile); + unlink(g_state.pidfile); + sp_messagex(NULL, LOG_DEBUG, "removed pid file: %s", g_state.pidfile); } } @@ -1587,6 +1590,18 @@ int sp_parse_option(const char* name, const char* value) ret = 1; } + else if(strcasecmp(CFG_PIDFILE, name) == 0) + { + if(g_state.pidfile != NULL) + sp_messagex(NULL, LOG_WARNING, "ignoring pid file specified on the command line. "); + + if(strlen(value) == 0) + g_state.pidfile = NULL; + else + g_state.pidfile = value; + ret = 1; + } + /* Always pass through to program */ if(cb_parse_option(name, value) == 1) ret = 1; diff --git a/common/sppriv.h b/common/sppriv.h index 30686f9..cc6590a 100644 --- a/common/sppriv.h +++ b/common/sppriv.h @@ -50,6 +50,7 @@ typedef struct spstate int transparent; /* Transparent proxying */ const char* directory; /* The temp directory */ const char* user; /* User to run as */ + const char* pidfile; /* The pid file for daemon */ struct sockaddr_any outaddr; /* The outgoing address */ const char* outname; diff --git a/doc/clamsmtpd.conf.5 b/doc/clamsmtpd.conf.5 index f528eb9..e481af9 100644 --- a/doc/clamsmtpd.conf.5 +++ b/doc/clamsmtpd.conf.5 @@ -86,6 +86,14 @@ on. See syntax of addresses below. The address and port to listen for SMTP connections on. See syntax of addresses below. [ Default: port 10025 on all local IP addresses ] +.It Ar PidFile +Specifies a location for the a process id file to be written to. This file +contains the process id of +.Nm +and can be used to stop the daemon. If the +.Fl p +argument is passed on the command line, then this setting will be ignored. +[ Default: none ] .It Ar Quarantine Quarantine files that contain viruses by leaving them in the .Ar TempDirectory @@ -101,7 +109,7 @@ also needs to be setup to accept at least this number of connections. .It Ar ScanHeader A header to add to scanned messages. Put an empty value to supress adding a header. -[ Default: 'X-AV-Checked: ClamAV using ClamSMTP' ] +[ Default: 'X-Virus-Scanned: ClamAV using ClamSMTP' ] .It Ar OutAddress The address of the SMTP server to send email to once it's been scanned. See syntax of addreses below. @@ -133,6 +141,7 @@ This is a command to run when a virus is found. See the VIRUS ACTION section in .Xr clamsmtpd 8 for a discussion of this option. +[ Default: off ] .El .Sh ADDRESSES Addresses can be specified in multiple formats: |