mirror of
https://github.com/donl/rmilter.git
synced 2026-06-30 06:12:17 -06:00
* Try to fix compatibility issues with sendmail and FreeBSD 4
This commit is contained in:
parent
36cf542697
commit
a5d9ff7a08
5 changed files with 74 additions and 6 deletions
14
configure
vendored
14
configure
vendored
|
|
@ -9,7 +9,7 @@ OS=""
|
|||
LOCALBASE=/usr/local
|
||||
PREFIX=$LOCALBASE
|
||||
|
||||
VERSION=1.5.16
|
||||
VERSION=1.5.17
|
||||
DCC_VER=1.2.74
|
||||
COMPAT_DIR="./compat"
|
||||
|
||||
|
|
@ -31,6 +31,7 @@ DEPS="awl.h cfg_file.h libclamc.h libspamd.h memcached.h radix.h ratelimit.h reg
|
|||
EXEC=rmilter
|
||||
USER=postfix
|
||||
GROUP=postfix
|
||||
SENDMAIL=no
|
||||
INSTALL="/usr/bin/install -v"
|
||||
MKDIR="/usr/bin/install -v -d"
|
||||
MANPATH="${PREFIX}/share/man"
|
||||
|
|
@ -220,6 +221,7 @@ check_os()
|
|||
MANPATH="${PREFIX}/man"
|
||||
case `uname -r` in
|
||||
4.*)
|
||||
CFLAGS="$CFLAGS -DFREEBSD_LEGACY"
|
||||
PTHREAD_CFLAGS="$PTHREAD_CFLAGS -pthread" PTHREAD_LDFLAGS="-lc_r" ;;
|
||||
5.*)
|
||||
PTHREAD_CFLAGS="$PTHREAD_CFLAGS -pthread" PTHREAD_LDFLAGS="-lpthread" ;;
|
||||
|
|
@ -360,6 +362,7 @@ do
|
|||
--enable-dcc) dcc=yes ;;
|
||||
--enable-debug) CFLAGS="$CFLAGS -DWITH_DEBUG" OPT_FLAGS="" ;;
|
||||
--enable-opt) OPT_FLAGS="-O3 -pipe" ;;
|
||||
--enable-sendmail) SENDMAIL=yes ;;
|
||||
*)
|
||||
echo "$0: error: invalid option \"$option\""
|
||||
exit 1
|
||||
|
|
@ -377,12 +380,21 @@ if [ "F$help" = "Fyes" ] ; then
|
|||
--enable-debug turn on extra debug messages
|
||||
--enable-opt turn on extra optimization
|
||||
--enable-auth-strict turn on strict check for authenticated users
|
||||
--enable-sendmail build rmilter for using with sendmail MTA
|
||||
--user=USER set user to use
|
||||
--group=GROUP set group to use
|
||||
END
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "F$SENDMAIL" = "Fyes" ] ; then
|
||||
CFLAGS="$CFLAGS -DSENDMAIL"
|
||||
if [ "F$USER" = "Fpostfix" ] ; then
|
||||
USER="mailnull"
|
||||
GROUP="mailnull"
|
||||
fi
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS -I$PREFIX/include"
|
||||
LDFLAGS="$LDFLAGS -L$PREFIX/lib"
|
||||
|
||||
|
|
|
|||
6
main.c
6
main.c
|
|
@ -67,14 +67,14 @@ reload_thread (void *unused)
|
|||
signals.sa_handler = sig_usr1_handler;
|
||||
sigaction (SIGUSR1, &signals, NULL);
|
||||
|
||||
msg_info ("(reload_thread) starting...");
|
||||
msg_info ("reload_thread: starting...");
|
||||
|
||||
/* lock on mutex until we got SIGUSR1 that unlocks mutex */
|
||||
while (1) {
|
||||
pthread_mutex_lock(&cfg_reload_mtx);
|
||||
pthread_cond_wait(&cfg_cond, &cfg_reload_mtx);
|
||||
pthread_mutex_unlock(&cfg_reload_mtx);
|
||||
msg_warn ("(reload_thread) reloading...");
|
||||
msg_warn ("reload_thread: reloading...");
|
||||
/* lock for writing */
|
||||
CFG_WLOCK();
|
||||
f = fopen (cfg->cfg_name, "r");
|
||||
|
|
@ -172,7 +172,7 @@ main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
openlog("rmilter", LOG_PID, LOG_MAIL);
|
||||
msg_warn ("(main) starting...");
|
||||
msg_warn ("main: starting rmilter version %s", MVERSION);
|
||||
|
||||
cfg = (struct config_file*) malloc (sizeof (struct config_file));
|
||||
if (cfg == NULL) {
|
||||
|
|
|
|||
|
|
@ -289,7 +289,12 @@ memc_read (memcached_ctx_t *ctx, const char *cmd, memcached_param_t *params, siz
|
|||
}
|
||||
|
||||
if (datalen != params[i].bufsize) {
|
||||
#ifndef FREEBSD_LEGACY
|
||||
memc_log (ctx, __LINE__, "memc_read: user's buffer is too small: %zd, %zd required", params[i].bufsize, datalen);
|
||||
#else
|
||||
memc_log (ctx, __LINE__, "memc_read: user's buffer is too small: %ld, %ld required", (long int)params[i].bufsize,
|
||||
(long int)datalen);
|
||||
#endif
|
||||
return WRONG_LENGTH;
|
||||
}
|
||||
|
||||
|
|
@ -389,7 +394,11 @@ memc_write (memcached_ctx_t *ctx, const char *cmd, memcached_param_t *params, si
|
|||
header.req_id = ctx->count;
|
||||
}
|
||||
|
||||
#ifndef FREEBSD_LEGACY
|
||||
r = snprintf (read_buf, READ_BUFSIZ, "%s %s 0 %d %zu" CRLF, cmd, params[i].key, expire, params[i].bufsize);
|
||||
#else
|
||||
r = snprintf (read_buf, READ_BUFSIZ, "%s %s 0 %d %lu" CRLF, cmd, params[i].key, expire, (unsigned long int)params[i].bufsize);
|
||||
#endif
|
||||
memc_log (ctx, __LINE__, "memc_write: send write request to memcached: %s", read_buf);
|
||||
/* Set socket blocking */
|
||||
ofl = fcntl(ctx->sock, F_GETFL, 0);
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ check_specific_limit (struct mlfi_priv *priv, struct config_file *cfg, enum keyt
|
|||
msg_debug ("check_specific_limit: write limit for key: '%s', count: %.1f, time: %.1f", cur_param.key, b.count, b.tm);
|
||||
if (mctx.sock != -1) {
|
||||
s = 1;
|
||||
if (memc_set (&mctx, &cur_param, &s, EXPIRE_TIME) != OK) {
|
||||
if ((r = memc_set (&mctx, &cur_param, &s, EXPIRE_TIME)) != OK) {
|
||||
msg_info ("check_specific_limit: got error on 'set' command from memcached server(%s): %s, key: %s", inet_ntoa(selected->addr[0]), memc_strerror (r), cur_param.key);
|
||||
memc_close_ctx (&mctx);
|
||||
upstream_fail (&selected->up, floor (tm));
|
||||
|
|
|
|||
49
rmilter.c
49
rmilter.c
|
|
@ -83,7 +83,7 @@ struct smfiDesc smfilter =
|
|||
mlfi_eom, /* end of message */
|
||||
mlfi_abort, /* message aborted */
|
||||
mlfi_close, /* connection cleanup */
|
||||
#if (SMFI_PROT_VERSION > 4)
|
||||
#if (SMFI_PROT_VERSION >= 4)
|
||||
NULL, /* unknown situation */
|
||||
mlfi_data, /* SMTP DATA callback */
|
||||
NULL /* Negotiation callback */
|
||||
|
|
@ -549,6 +549,17 @@ mlfi_connect(SMFICTX * ctx, char *hostname, _SOCK_ADDR * addr)
|
|||
return SMFIS_TEMPFAIL;
|
||||
}
|
||||
|
||||
#ifdef SENDMAIL
|
||||
strlcpy (priv->priv_ip, "NULL", sizeof(priv->priv_ip));
|
||||
if ((addr == NULL) || (&(((struct sockaddr_in *)(addr))->sin_addr) == NULL)) {
|
||||
msg_warn ("mlfi_connect: hostaddr is NULL");
|
||||
}
|
||||
else {
|
||||
(void)inet_ntop(AF_INET, &((struct sockaddr_in *)(addr))->sin_addr, priv->priv_ip, sizeof (priv->priv_ip));
|
||||
memcpy (&priv->priv_addr, addr, sizeof (struct sockaddr_in));
|
||||
}
|
||||
#endif
|
||||
|
||||
smfi_setpriv(ctx, priv);
|
||||
/* Cannot set reply here, so delay processing of connect stage */
|
||||
return SMFIS_CONTINUE;
|
||||
|
|
@ -597,6 +608,7 @@ mlfi_envfrom(SMFICTX *ctx, char **envfrom)
|
|||
priv->priv_from[i] = '\0';
|
||||
msg_debug ("mlfi_envfrom: got from value: %s", priv->priv_from);
|
||||
|
||||
#ifndef SENDMAIL
|
||||
/* Extract IP and hostname */
|
||||
tmpfrom = smfi_getsymval(ctx, "{client_addr}");
|
||||
if (tmpfrom != NULL) {
|
||||
|
|
@ -613,6 +625,7 @@ mlfi_envfrom(SMFICTX *ctx, char **envfrom)
|
|||
else {
|
||||
strlcpy (priv->priv_hostname, "unknown", sizeof (priv->priv_hostname));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef STRICT_AUTH
|
||||
tmpfrom = smfi_getsymval(ctx, "{auth_authen}");
|
||||
|
|
@ -870,6 +883,36 @@ mlfi_eom(SMFICTX * ctx)
|
|||
}
|
||||
|
||||
CFG_RLOCK();
|
||||
#if (SMFI_PROT_VERSION < 4)
|
||||
/* Do greylisting here if DATA callback is not available */
|
||||
if (priv->priv_ip[0] != '\0' && *priv->priv_rcpt != '\0' && cfg->memcached_servers_grey_num > 0 &&
|
||||
cfg->greylisting_timeout > 0 && cfg->greylisting_expire > 0 && priv->strict != 0) {
|
||||
|
||||
msg_debug ("mlfi_data: %s: checking greylisting", priv->mlfi_id);
|
||||
r = check_greylisting (priv);
|
||||
switch (r) {
|
||||
case GREY_GREYLISTED:
|
||||
if (smfi_setreply (ctx, RCODE_LATER, XCODE_TEMPFAIL, (char *)"Try again later") != MI_SUCCESS) {
|
||||
msg_err("mlfi_data: %s: smfi_setreply failed", priv->mlfi_id);
|
||||
}
|
||||
CFG_UNLOCK();
|
||||
(void)mlfi_cleanup (ctx, false);
|
||||
return SMFIS_TEMPFAIL;
|
||||
break;
|
||||
case GREY_ERROR:
|
||||
if (smfi_setreply (ctx, RCODE_TEMPFAIL, XCODE_TEMPFAIL, (char *)"Service unavailable") != MI_SUCCESS) {
|
||||
msg_err("mlfi_data: %s: smfi_setreply failed", priv->mlfi_id);
|
||||
}
|
||||
CFG_UNLOCK();
|
||||
(void)mlfi_cleanup (ctx, false);
|
||||
break;
|
||||
case GREY_WHITELISTED:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (cfg->serial == priv->serial) {
|
||||
msg_debug ("mlfi_eom: %s: checking regexp rules", priv->mlfi_id);
|
||||
|
|
@ -918,7 +961,11 @@ mlfi_eom(SMFICTX * ctx)
|
|||
return mlfi_cleanup (ctx, true);
|
||||
}
|
||||
else if (cfg->sizelimit != 0 && sb.st_size > cfg->sizelimit) {
|
||||
#ifndef FREEBSD_LEGACY
|
||||
msg_warn ("mlfi_eom: %s: message size(%zd) exceeds limit(%zd), not scanned, %s", priv->mlfi_id, (size_t)sb.st_size, cfg->sizelimit, priv->file);
|
||||
#else
|
||||
msg_warn ("mlfi_eom: %s: message size(%ld) exceeds limit(%ld), not scanned, %s", priv->mlfi_id, (long int)sb.st_size, (long int)cfg->sizelimit, priv->file);
|
||||
#endif
|
||||
CFG_UNLOCK();
|
||||
return mlfi_cleanup (ctx, true);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue