diff options
author | 2014-08-21 17:00:34 +0000 | |
---|---|---|
committer | 2014-08-21 17:00:34 +0000 | |
commit | e470716cac9be9a9f66c27ee698c2b5ddca14635 (patch) | |
tree | c70f5e1f98a024da7f447d13c807b25774b7b7dd /usr.sbin/syslogd/syslogd.c | |
parent | Unbreak when "SRCDIR=." (diff) | |
download | wireguard-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.c | 59 |
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))) { |