--- milter-regex-1.5/milter-regex.c.orig Fri Mar 19 20:21:40 2004 +++ milter-regex-1.5/milter-regex.c Wed May 26 01:06:21 2004 @@ -52,11 +52,21 @@ #include #include "eval.h" +#include "local.h" extern int parse_ruleset(const char *, struct ruleset **, char *, size_t); -static const char *rule_file_name = "/etc/milter-regex.conf"; +#ifndef CONF +#define CONF "/etc/mail/milter-regex.conf" +#endif + +#ifndef VERSION +#define VERSION "milter-regex 1.5" +#endif + +static const char *rule_file_name = CONF ; static int debug = 0; +static int nflag = 0; /* Don't add a X-Milter header */ struct context { struct ruleset *rs; @@ -85,21 +95,26 @@ static void usage(const char *); static void msg(int, struct context *, const char *, ...); +#ifndef USER #define USER "_milter-regex" -#define OCONN "unix:/var/spool/milter-regex/sock" +#endif +#ifndef OCONN +#define OCONN "unix:/var/milter/milter-regex.sock" +#endif #define RCODE_REJECT "554" #define RCODE_TEMPFAIL "451" #define XCODE_REJECT "5.7.1" #define XCODE_TEMPFAIL "4.7.1" #define MAXRS 16 -#if __linux__ || __sun__ +#if defined(__linux__) || defined(__sun__) || defined(__sun) #define ST_MTIME st_mtime extern size_t strlcpy(char *, const char *, size_t); #else #define ST_MTIME st_mtimespec #endif +/* defined in libresolv #ifdef __sun__ int daemon(int nochdir, int noclose) @@ -133,28 +148,29 @@ return (0); } #endif +*/ static sfsistat setreply(SMFICTX *ctx, struct context *context, const struct action *action) { switch (action->type) { case SMFIS_REJECT: - msg(LOG_NOTICE, context, "REJECT: %s, From: %s, To: %s, " + msg(LOG_DEBUG, context, "REJECT: %s, From: %s, To: %s, " "Subject: %s", action->msg, context->hdr_from, context->hdr_to, context->hdr_subject); break; case SMFIS_TEMPFAIL: - msg(LOG_NOTICE, context, "TEMPFAIL: %s, From: %s, To: %s, " + msg(LOG_DEBUG, context, "TEMPFAIL: %s, From: %s, To: %s, " "Subject: %s", action->msg, context->hdr_from, context->hdr_to, context->hdr_subject); break; case SMFIS_DISCARD: - msg(LOG_NOTICE, context, "DISCARD, From: %s, To: %s, " + msg(LOG_DEBUG, context, "DISCARD: From: %s, To: %s, " "Subject: %s", context->hdr_from, context->hdr_to, context->hdr_subject); break; case SMFIS_ACCEPT: - msg(LOG_INFO, context, "ACCEPT, From: %s, To: %s, " + msg(LOG_DEBUG, context, "ACCEPT, From: %s, To: %s, " "Subject: %s", context->hdr_from, context->hdr_to, context->hdr_subject); return (action->type); @@ -173,7 +189,7 @@ static struct ruleset * get_ruleset(void) { - static struct ruleset *rs[MAXRS] = {}; + static struct ruleset *rs[MAXRS]; static int cur = 0; static time_t last_check = 0; static struct stat sbo; @@ -188,7 +204,7 @@ last_check = t; memset(&sb, 0, sizeof(sb)); if (stat(rule_file_name, &sb)) - msg(LOG_ERR, NULL, "get_ruleset: stat: %s: %s", + msg(LOG_CRIT, NULL, "get_ruleset: stat: %s: %s", rule_file_name, strerror(errno)); else if (memcmp(&sb.ST_MTIME, &sbo.ST_MTIME, sizeof(sb.ST_MTIME))) { @@ -201,7 +217,7 @@ int i; char err[8192]; - msg(LOG_DEBUG, NULL, "loading new configuration file"); + msg(LOG_NOTICE, NULL, "loading new configuration file"); for (i = 0; i < MAXRS; ++i) if (rs[i] != NULL && rs[i]->refcnt == 0) { msg(LOG_DEBUG, NULL, "freeing unused ruleset " @@ -213,13 +229,13 @@ if (rs[i] == NULL) break; if (i == MAXRS) - msg(LOG_ERR, NULL, "all rulesets are in use, cannot " + msg(LOG_WARNING, NULL, "all rulesets are in use, cannot " "load new one", MAXRS); else if (parse_ruleset(rule_file_name, &rs[i], err, sizeof(err)) || rs[i] == NULL) - msg(LOG_ERR, NULL, "parse_ruleset: %s", err); + msg(LOG_CRIT, NULL, "parse_ruleset: %s", err); else { - msg(LOG_INFO, NULL, "configuration file %s loaded " + msg(LOG_NOTICE, NULL, "configuration file %s loaded " "successfully", rule_file_name); cur = i; } @@ -446,11 +462,16 @@ msg(LOG_DEBUG, context, "cb_eom()"); if ((action = eval_end(context->rs, context->res, COND_BODY)) != NULL) + { + if(!nflag) { + smfi_addheader(ctx, "X-Milter", VERSION); + } return (setreply(ctx, context, action)); - else + } else { msg(LOG_DEBUG, context, "ACCEPT, From: %s, To: %s, " "Subject: %s", context->hdr_from, context->hdr_to, context->hdr_subject); + } return (SMFIS_CONTINUE); } @@ -488,7 +509,7 @@ struct smfiDesc smfilter = { "milter-regex", /* filter name */ SMFI_VERSION, /* version code -- do not change */ - SMFIF_ADDHDRS|SMFIF_CHGHDRS|SMFIF_ADDRCPT|SMFIF_DELRCPT, /* flags */ + SMFIF_ADDHDRS, /* flags */ cb_connect, /* connection info filter */ cb_helo, /* SMTP HELO command filter */ cb_envfrom, /* envelope sender filter */ @@ -505,17 +526,17 @@ msg(int priority, struct context *context, const char *fmt, ...) { va_list ap; - char msg[8192]; + char msg[16384]; + if ((priority == LOG_DEBUG) && !debug) { + return; + } va_start(ap, fmt); if (context != NULL) snprintf(msg, sizeof(msg), "%s: ", context->addr); else msg[0] = 0; vsnprintf(msg + strlen(msg), sizeof(msg) - strlen(msg), fmt, ap); - if (debug) - printf("syslog: %s\n", msg); - else syslog(priority, "%s", msg); va_end(ap); } @@ -548,9 +569,9 @@ const char *ofile = NULL; tzset(); - openlog("milter-regex", LOG_PID | LOG_NDELAY, LOG_DAEMON); + openlog("milter-regex", LOG_PID | LOG_NDELAY, LOG_MAIL); - while ((ch = getopt(argc, argv, "c:dp:u:")) != -1) { + while ((ch = getopt(argc, argv, "c:dnp:u:")) != -1) { switch (ch) { case 'c': rule_file_name = optarg; @@ -558,6 +579,10 @@ case 'd': debug = 1; break; + case 'n': + nflag++; + smfilter.xxfi_flags &= ~SMFIF_ADDHDRS; + break; case 'p': oconn = optarg; break; @@ -596,7 +621,7 @@ return (1); } if ( -#if ! ( __linux__ || __sun__ ) +#if ! ( __linux__ || __sun__ || __sun ) seteuid(pw->pw_uid) || #endif setuid(pw->pw_uid)) { @@ -621,18 +646,19 @@ } /* daemonize (detach from controlling terminal) */ - if (!debug && daemon(0, 0)) { - fprintf(stderr, "daemon: %s\n", strerror(errno)); + if (daemon(0, 0)) { + r = errno; + fprintf(stderr, "daemon: %s\n", strerror(r)); goto done; } umask(0177); - msg(LOG_INFO, NULL, "started: %s", rcsid); + msg(LOG_NOTICE, NULL, "started: %s", VERSION); r = smfi_main(); if (r != MI_SUCCESS) msg(LOG_ERR, NULL, "smfi_main: terminating due to error"); else - msg(LOG_INFO, NULL, "smfi_main: terminating without error"); + msg(LOG_NOTICE, NULL, "smfi_main: terminating without error"); done: return (r);