* Try to fix compatibility issues with sendmail and FreeBSD 4

This commit is contained in:
Vsevolod Stakhov 2009-02-12 18:49:50 +03:00
parent 36cf542697
commit a5d9ff7a08
5 changed files with 74 additions and 6 deletions

14
configure vendored
View file

@ -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
View file

@ -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) {

View file

@ -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);

View file

@ -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));

View file

@ -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);
}