summaryrefslogtreecommitdiffstats
path: root/src/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon.c')
-rw-r--r--src/daemon.c94
1 files changed, 48 insertions, 46 deletions
diff --git a/src/daemon.c b/src/daemon.c
index d6b3f49..7fe819f 100644
--- a/src/daemon.c
+++ b/src/daemon.c
@@ -32,7 +32,7 @@ SM_RCSID("@(#)$Id: daemon.c,v 8.698 2013-11-22 20:51:55 ca Exp $")
#endif /* defined(USE_SOCK_STREAM) */
#if STARTTLS
-# include <openssl/rand.h>
+# include <openssl/rand.h>
#endif /* STARTTLS */
#include <sm/time.h>
@@ -517,14 +517,12 @@ getrequests(e)
macdefine(&BlankEnvelope.e_macro, A_PERM,
macid("{daemon_family}"), "unspec");
break;
-#if _FFR_DAEMON_NETUNIX
-# if NETUNIX
+#if NETUNIX
case AF_UNIX:
macdefine(&BlankEnvelope.e_macro, A_PERM,
macid("{daemon_family}"), "local");
break;
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
#if NETINET
case AF_INET:
macdefine(&BlankEnvelope.e_macro, A_PERM,
@@ -827,6 +825,17 @@ getrequests(e)
OutChannel = outchannel;
DisConnected = false;
+#if _FFR_XCNCT
+ t = xconnect(inchannel);
+ if (t <= 0)
+ {
+ clrbitn(D_XCNCT, Daemons[curdaemon].d_flags);
+ clrbitn(D_XCNCT_M, Daemons[curdaemon].d_flags);
+ }
+ else
+ setbitn(t, Daemons[curdaemon].d_flags);
+
+#endif /* _FFR_XCNCT */
#if XLA
if (!xla_host_ok(RealHostName))
@@ -1060,8 +1069,7 @@ opendaemonsocket(d, firsttime)
(void) sleep(5);
if (firsttime || d->d_socket < 0)
{
-#if _FFR_DAEMON_NETUNIX
-# if NETUNIX
+#if NETUNIX
if (d->d_addr.sa.sa_family == AF_UNIX)
{
int rval;
@@ -1084,8 +1092,7 @@ opendaemonsocket(d, firsttime)
/* Don't try to overtake an existing socket */
(void) unlink(d->d_addr.sunix.sun_path);
}
-# endif /* NETUNIX */
-#endif /* _FFR_DOMAIN_NETUNIX */
+#endif /* NETUNIX */
d->d_socket = socket(d->d_addr.sa.sa_family,
SOCK_STREAM, 0);
if (d->d_socket < 0)
@@ -1113,7 +1120,7 @@ opendaemonsocket(d, firsttime)
continue;
}
- if (SM_FD_SETSIZE > 0 && d->d_socket >= SM_FD_SETSIZE)
+ if (!SM_FD_OK_SELECT(d->d_socket))
{
save_errno = EINVAL;
syserr("opendaemonsocket: daemon %s: server SMTP socket (%d) too large",
@@ -1168,13 +1175,11 @@ opendaemonsocket(d, firsttime)
switch (d->d_addr.sa.sa_family)
{
-#if _FFR_DAEMON_NETUNIX
-# ifdef NETUNIX
+#ifdef NETUNIX
case AF_UNIX:
socksize = sizeof(d->d_addr.sunix);
break;
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
#if NETINET
case AF_INET:
socksize = sizeof(d->d_addr.sin);
@@ -1493,6 +1498,9 @@ setsockaddroptions(p, d)
case SM_DEFER:
case SM_DELIVER:
case SM_FORK:
+#if _FFR_PROXY
+ case SM_PROXY_REQ:
+#endif /* _FFR_PROXY */
d->d_dm = *v;
break;
default:
@@ -1512,13 +1520,11 @@ setsockaddroptions(p, d)
#endif /* !_FFR_DPO_CS */
if (isascii(*v) && isdigit(*v))
d->d_addr.sa.sa_family = atoi(v);
-#if _FFR_DAEMON_NETUNIX
-# ifdef NETUNIX
+#ifdef NETUNIX
else if (sm_strcasecmp(v, "unix") == 0 ||
sm_strcasecmp(v, "local") == 0)
d->d_addr.sa.sa_family = AF_UNIX;
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
#if NETINET
else if (sm_strcasecmp(v, "inet") == 0)
d->d_addr.sa.sa_family = AF_INET;
@@ -1628,14 +1634,14 @@ setsockaddroptions(p, d)
{
switch (d->d_addr.sa.sa_family)
{
-#if _FFR_DAEMON_NETUNIX
-# if NETUNIX
+#if NETUNIX
case AF_UNIX:
if (strlen(addr) >= sizeof(d->d_addr.sunix.sun_path))
{
errno = ENAMETOOLONG;
- syserr("setsockaddroptions: domain socket name too long: %s > %d",
- addr, sizeof(d->d_addr.sunix.sun_path));
+ syserr("setsockaddroptions: domain socket name too long: %s > %ld",
+ addr,
+ (long) sizeof(d->d_addr.sunix.sun_path));
break;
}
@@ -1646,8 +1652,7 @@ setsockaddroptions(p, d)
addr,
sizeof(d->d_addr.sunix.sun_path));
break;
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
#if NETINET
case AF_INET:
if (!isascii(*addr) || !isdigit(*addr) ||
@@ -1998,16 +2003,14 @@ addr_family(addr)
return AF_INET6;
}
#endif /* NETINET6 */
-#if _FFR_DAEMON_NETUNIX
-# if NETUNIX
+#if NETUNIX
if (*addr == '/')
{
if (tTd(16, 9))
sm_dprintf("addr_family(%s): LOCAL\n", addr);
return AF_UNIX;
}
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
if (tTd(16, 9))
sm_dprintf("addr_family(%s): UNSPEC\n", addr);
return AF_UNSPEC;
@@ -2045,7 +2048,7 @@ chkclientmodifiers(flag)
#if MILTER
/*
-** SETUP_DAEMON_FILTERS -- Parse per-socket filters
+** SETUP_DAEMON_MILTERS -- Parse per-socket filters
**
** Parameters:
** none
@@ -3047,8 +3050,7 @@ shutdown_daemon()
(void) close(Daemons[i].d_socket);
Daemons[i].d_socket = -1;
-#if _FFR_DAEMON_NETUNIX
-# if NETUNIX
+#if NETUNIX
/* Remove named sockets */
if (Daemons[i].d_addr.sa.sa_family == AF_UNIX)
{
@@ -3070,8 +3072,7 @@ shutdown_daemon()
sm_errstring(errno));
}
}
-# endif /* NETUNIX */
-#endif /* _FFR_DAEMON_NETUNIX */
+#endif /* NETUNIX */
}
}
@@ -3413,7 +3414,7 @@ getauthinfo(fd, may_be_forged)
char ibuf[MAXNAME + 1];
static char hbuf[MAXNAME + MAXAUTHINFO + 11];
- *may_be_forged = false;
+ *may_be_forged = true;
falen = sizeof(RealHostAddr);
if (isatty(fd) || (i = getpeername(fd, &RealHostAddr.sa, &falen)) < 0 ||
falen <= 0 || RealHostAddr.sa.sa_family == 0)
@@ -3430,6 +3431,8 @@ getauthinfo(fd, may_be_forged)
return NULL;
errno = 0;
}
+
+ *may_be_forged = false;
(void) sm_strlcpyn(hbuf, sizeof(hbuf), 2, RealUserName,
"@localhost");
if (tTd(9, 1))
@@ -3446,8 +3449,10 @@ getauthinfo(fd, may_be_forged)
}
/* cross check RealHostName with forward DNS lookup */
- if (anynet_ntoa(&RealHostAddr)[0] != '[' &&
- RealHostName[0] != '[')
+ if (anynet_ntoa(&RealHostAddr)[0] == '[' ||
+ RealHostName[0] == '[')
+ *may_be_forged = false;
+ else
{
int family;
@@ -3473,19 +3478,16 @@ getauthinfo(fd, may_be_forged)
/* try to match the reverse against the forward lookup */
hp = sm_gethostbyname(RealHostName, family);
- if (hp == NULL)
- {
- /* XXX: Could be a temporary error on forward lookup */
- *may_be_forged = true;
- }
- else
+ if (hp != NULL)
{
for (ha = hp->h_addr_list; *ha != NULL; ha++)
{
if (addrcmp(hp, *ha, &RealHostAddr) == 0)
+ {
+ *may_be_forged = false;
break;
+ }
}
- *may_be_forged = *ha == NULL;
#if NETINET6
freehostent(hp);
hp = NULL;
@@ -4259,11 +4261,11 @@ anynet_ntop(s6a, dst, dst_len)
return NULL;
dst += sz;
dst_len -= sz;
-# if _FFR_IPV6_FULL
+# if IPV6_FULL
ap = sm_inet6_ntop(s6a, dst, dst_len);
-# else /* _FFR_IPV6_FULL */
+# else /* IPV6_FULL */
ap = (char *) inet_ntop(AF_INET6, s6a, dst, dst_len);
-# endif /* _FFR_IPV6_FULL */
+# endif /* IPV6_FULL */
/* Restore pointer to beginning of string */
if (ap != NULL)
OpenPOWER on IntegriCloud