summaryrefslogtreecommitdiffstats
path: root/usr.sbin/syslogd/syslogd.c
diff options
context:
space:
mode:
authorbluhm <bluhm@openbsd.org>2014-08-21 17:00:34 +0000
committerbluhm <bluhm@openbsd.org>2014-08-21 17:00:34 +0000
commite470716cac9be9a9f66c27ee698c2b5ddca14635 (patch)
treec70f5e1f98a024da7f447d13c807b25774b7b7dd /usr.sbin/syslogd/syslogd.c
parentUnbreak when "SRCDIR=." (diff)
downloadwireguard-openbsd-e470716cac9be9a9f66c27ee698c2b5ddca14635.tar.xz
wireguard-openbsd-e470716cac9be9a9f66c27ee698c2b5ddca14635.zip
Send and receive UDP syslog packets on the IPv6 socket.
OK henning@
Diffstat (limited to 'usr.sbin/syslogd/syslogd.c')
-rw-r--r--usr.sbin/syslogd/syslogd.c59
1 files changed, 40 insertions, 19 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 2ca4e4451a3..80d46005652 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: syslogd.c,v 1.115 2014/08/21 00:04:58 bluhm Exp $ */
+/* $OpenBSD: syslogd.c,v 1.116 2014/08/21 17:00:34 bluhm Exp $ */
/*
* Copyright (c) 1983, 1988, 1993, 1994
@@ -189,7 +189,6 @@ int Debug; /* debug flag */
int Startup = 1; /* startup flag */
char LocalHostName[MAXHOSTNAMELEN]; /* our hostname */
char *LocalDomain; /* our local domain name */
-int InetInuse = 0; /* non-zero if INET sockets are being used */
int Initialized = 0; /* set when we have initialized ourselves */
int MarkInterval = 20 * 60; /* interval between marks in seconds */
@@ -284,7 +283,7 @@ main(int argc, char *argv[])
{
int ch, i, linesize, fd;
struct sockaddr_un fromunix;
- struct sockaddr_in frominet;
+ struct sockaddr_storage from;
socklen_t len;
char *p, *line;
char resolve[MAXHOSTNAMELEN];
@@ -371,7 +370,7 @@ main(int argc, char *argv[])
}
memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_INET;
+ hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE;
@@ -386,13 +385,14 @@ main(int argc, char *argv[])
for (res = res0; res; res = res->ai_next) {
struct pollfd *pfdp;
- if (res->ai_family == AF_INET)
+ switch (res->ai_family) {
+ case AF_INET:
pfdp = &pfd[PFD_INET];
- else {
- /*
- * XXX AF_INET6 is skipped on purpose, need to
- * fix '@' handling first.
- */
+ break;
+ case AF_INET6:
+ pfdp = &pfd[PFD_INET6];
+ break;
+ default:
continue;
}
@@ -412,7 +412,6 @@ main(int argc, char *argv[])
continue;
}
- InetInuse = 1;
pfdp->fd = fd;
if (SecureMode)
shutdown(pfdp->fd, SHUT_RD);
@@ -584,18 +583,31 @@ main(int argc, char *argv[])
}
}
if ((pfd[PFD_INET].revents & POLLIN) != 0) {
- len = sizeof(frominet);
+ len = sizeof(from);
i = recvfrom(pfd[PFD_INET].fd, line, MAXLINE, 0,
- (struct sockaddr *)&frominet, &len);
+ (struct sockaddr *)&from, &len);
if (i > 0) {
line[i] = '\0';
- cvthname((struct sockaddr *)&frominet, resolve,
- sizeof resolve);
+ cvthname((struct sockaddr *)&from, resolve,
+ sizeof(resolve));
dprintf("cvthname res: %s\n", resolve);
printline(resolve, line);
} else if (i < 0 && errno != EINTR)
logerror("recvfrom inet");
}
+ if ((pfd[PFD_INET6].revents & POLLIN) != 0) {
+ len = sizeof(from);
+ i = recvfrom(pfd[PFD_INET6].fd, line, MAXLINE, 0,
+ (struct sockaddr *)&from, &len);
+ if (i > 0) {
+ line[i] = '\0';
+ cvthname((struct sockaddr *)&from, resolve,
+ sizeof(resolve));
+ dprintf("cvthname res: %s\n", resolve);
+ printline(resolve, line);
+ } else if (i < 0 && errno != EINTR)
+ logerror("recvfrom inet6");
+ }
if ((pfd[PFD_CTLSOCK].revents & POLLIN) != 0)
ctlsock_accept_handler();
if ((pfd[PFD_CTLCONN].revents & POLLIN) != 0)
@@ -851,7 +863,7 @@ fprintlog(struct filed *f, int flags, char *msg)
{
struct iovec iov[6];
struct iovec *v;
- int l, retryonce;
+ int fd, l, retryonce;
char line[MAXLINE + 1], repbuf[80], greetings[500];
v = iov;
@@ -908,13 +920,24 @@ fprintlog(struct filed *f, int flags, char *msg)
case F_FORW:
dprintf(" %s\n", f->f_un.f_forw.f_loghost);
+ switch (f->f_un.f_forw.f_addr.ss_family) {
+ case AF_INET:
+ fd = pfd[PFD_INET].fd;
+ break;
+ case AF_INET6:
+ fd = pfd[PFD_INET6].fd;
+ break;
+ default:
+ fd = -1;
+ break;
+ }
if ((l = snprintf(line, sizeof(line), "<%d>%.15s %s%s%s",
f->f_prevpri, (char *)iov[0].iov_base,
IncludeHostname ? LocalHostName : "",
IncludeHostname ? " " : "",
(char *)iov[4].iov_base)) >= sizeof(line) || l == -1)
l = strlen(line);
- if (sendto(pfd[PFD_INET].fd, line, l, 0,
+ if (sendto(fd, line, l, 0,
(struct sockaddr *)&f->f_un.f_forw.f_addr,
f->f_un.f_forw.f_addr.ss_len) != l) {
switch (errno) {
@@ -1510,8 +1533,6 @@ cfline(char *line, char *prog)
switch (*p) {
case '@':
- if (!InetInuse)
- break;
if ((strlcpy(f->f_un.f_forw.f_loghost, p,
sizeof(f->f_un.f_forw.f_loghost)) >=
sizeof(f->f_un.f_forw.f_loghost))) {