summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Miller <djm@cvs.openbsd.org>2003-12-29 22:05:12 +0000
committerDamien Miller <djm@cvs.openbsd.org>2003-12-29 22:05:12 +0000
commit55db77a3b5cc3bc7cd00cbd17aadc72af5f4ec69 (patch)
tree0cac1d43dbb1d18f50ed922f8ab80d81f6702c39
parent15def480445c3ce97a8bc64d0cc13b6aebba6b93 (diff)
convert from select() to poll() for main event loop; tested millert@, deraadt@
ok deraadt@
-rw-r--r--usr.sbin/syslogd/privsep.c17
-rw-r--r--usr.sbin/syslogd/syslogd.c132
-rw-r--r--usr.sbin/syslogd/syslogd.h11
3 files changed, 75 insertions, 85 deletions
diff --git a/usr.sbin/syslogd/privsep.c b/usr.sbin/syslogd/privsep.c
index a020d95df67..8fb05710764 100644
--- a/usr.sbin/syslogd/privsep.c
+++ b/usr.sbin/syslogd/privsep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep.c,v 1.9 2003/10/26 18:21:49 avsm Exp $ */
+/* $OpenBSD: privsep.c,v 1.10 2003/12/29 22:05:10 djm Exp $ */
/*
* Copyright (c) 2003 Anil Madhavapeddy <anil@recoil.org>
@@ -28,6 +28,7 @@
#include <fcntl.h>
#include <netdb.h>
#include <paths.h>
+#include <poll.h>
#include <pwd.h>
#include <signal.h>
#include <stdio.h>
@@ -163,12 +164,12 @@ priv_init(char *conf, int numeric, int lockfd, int nullfd, char *argv[])
/* Close descriptors that only the unpriv child needs */
for (i = 0; i < nfunix; i++)
- if (funix[i] != -1)
- close(funix[i]);
- if (finet != -1)
- close(finet);
- if (fklog != -1)
- close(fklog);
+ if (pfd[PFD_UNIX_0 + i].fd != -1)
+ close(pfd[PFD_UNIX_0 + i].fd);
+ if (pfd[PFD_INET].fd != -1)
+ close(pfd[PFD_INET].fd);
+ if (pfd[PFD_KLOG].fd)
+ close(pfd[PFD_KLOG].fd);
/* Save the config file specified by the child process */
if (strlcpy(config_file, conf, sizeof config_file) >= sizeof(config_file))
@@ -308,7 +309,7 @@ priv_init(char *conf, int numeric, int lockfd, int nullfd, char *argv[])
/* Unlink any domain sockets that have been opened */
for (i = 0; i < nfunix; i++)
- if (funixn[i] && funix[i] != -1)
+ if (funixn[i] && pfd[PFD_UNIX_0 + i].fd != -1)
(void)unlink(funixn[i]);
if (restart) {
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index ac4462f551c..a9b57c8cbdb 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: syslogd.c,v 1.67 2003/09/19 08:15:55 deraadt Exp $ */
+/* $OpenBSD: syslogd.c,v 1.68 2003/12/29 22:05:11 djm Exp $ */
/*
* Copyright (c) 1983, 1988, 1993, 1994
@@ -39,7 +39,7 @@ static const char copyright[] =
#if 0
static const char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94";
#else
-static const char rcsid[] = "$OpenBSD: syslogd.c,v 1.67 2003/09/19 08:15:55 deraadt Exp $";
+static const char rcsid[] = "$OpenBSD: syslogd.c,v 1.68 2003/12/29 22:05:11 djm Exp $";
#endif
#endif /* not lint */
@@ -93,6 +93,7 @@ static const char rcsid[] = "$OpenBSD: syslogd.c,v 1.67 2003/09/19 08:15:55 dera
#include <err.h>
#include <fcntl.h>
#include <paths.h>
+#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -179,13 +180,13 @@ char *TypeNames[7] = {
struct filed *Files;
struct filed consfile;
+int nfunix = 1; /* Number of Unix domain sockets requested */
+char *funixn[MAXFUNIX] = { _PATH_LOG }; /* Paths to Unix domain sockets */
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 finet = -1; /* Internet datagram socket */
-int fklog = -1; /* Kernel log device socket */
int LogPort; /* port number for INET connections */
int Initialized = 0; /* set when we have initialized ourselves */
@@ -194,6 +195,8 @@ int MarkSeq = 0; /* mark sequence number */
int SecureMode = 1; /* when true, speak only unix domain socks */
int NoDNS = 0; /* when true, will refrain from doing DNS lookups */
+struct pollfd pfd[N_PFD];
+
volatile sig_atomic_t MarkSet;
volatile sig_atomic_t WantDie;
volatile sig_atomic_t DoInit;
@@ -218,20 +221,13 @@ void usage(void);
void wallmsg(struct filed *, struct iovec *);
int getmsgbufsize(void);
-#define MAXFUNIX 21
-
-int nfunix = 1;
-char *funixn[MAXFUNIX] = { _PATH_LOG };
-int funix[MAXFUNIX];
-
int
main(int argc, char *argv[])
{
- int ch, i, linesize, fdsrmax = 0;
+ int ch, i, linesize, fd;
struct sockaddr_un sunx, fromunix;
struct sockaddr_in sin, frominet;
socklen_t slen, len;
- fd_set *fdsr = NULL;
char *p, *line;
char resolve[MAXHOSTNAMELEN];
int lockpipe[2], nullfd = -1;
@@ -264,8 +260,8 @@ main(int argc, char *argv[])
break;
case 'a':
if (nfunix >= MAXFUNIX)
- fprintf(stderr,
- "syslogd: out of descriptors, ignoring %s\n",
+ fprintf(stderr, "syslogd: "
+ "out of descriptors, ignoring %s\n",
optarg);
else if (strlen(optarg) >= sizeof(sunx.sun_path))
fprintf(stderr,
@@ -299,19 +295,22 @@ main(int argc, char *argv[])
linesize++;
line = malloc(linesize);
+ /* Clear poll array, set all fds to ignore */
+ for (i = 0; i < N_PFD; i++) {
+ pfd[i].fd = -1;
+ pfd[i].events = 0;
+ }
+
#ifndef SUN_LEN
#define SUN_LEN(unp) (strlen((unp)->sun_path) + 2)
#endif
for (i = 0; i < nfunix; i++) {
(void)unlink(funixn[i]);
-
memset(&sunx, 0, sizeof(sunx));
sunx.sun_family = AF_UNIX;
(void)strlcpy(sunx.sun_path, funixn[i], sizeof(sunx.sun_path));
- funix[i] = socket(AF_UNIX, SOCK_DGRAM, 0);
- if (funix[i] < 0 ||
- bind(funix[i], (struct sockaddr *)&sunx,
- SUN_LEN(&sunx)) < 0 ||
+ if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1 ||
+ bind(fd, (struct sockaddr *)&sunx, SUN_LEN(&sunx)) == -1 ||
chmod(funixn[i], 0666) < 0) {
(void)snprintf(line, linesize, "cannot create %s",
funixn[i]);
@@ -319,19 +318,22 @@ main(int argc, char *argv[])
dprintf("cannot create %s (%d)\n", funixn[i], errno);
if (i == 0)
die(0);
- }
- /* double socket receive buffer size */
- if (getsockopt(funix[i], SOL_SOCKET, SO_RCVBUF, &len,
- &slen) == 0) {
- len *= 2;
- (void)setsockopt(funix[i], SOL_SOCKET, SO_RCVBUF, &len,
- slen);
+ } else {
+ /* double socket receive buffer size */
+ if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len,
+ &slen) == 0) {
+ len *= 2;
+ (void)setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, slen);
+ }
+ pfd[PFD_UNIX_0 + i].fd = fd;
+ pfd[PFD_UNIX_0 + i].events = POLLIN;
}
}
- finet = socket(AF_INET, SOCK_DGRAM, 0);
- if (finet >= 0) {
+
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) != -1) {
struct servent *sp;
+ /* XXX use getaddrinfo */
sp = getservbyname("syslog", "udp");
if (sp == NULL) {
errno = 0;
@@ -342,23 +344,29 @@ main(int argc, char *argv[])
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = LogPort = sp->s_port;
- if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+ if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
logerror("bind");
if (!Debug)
die(0);
} else {
InetInuse = 1;
/* double socket receive buffer size */
- if (getsockopt(finet, SOL_SOCKET, SO_RCVBUF, &len,
+ if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len,
&slen) == 0) {
len *= 2;
- (void)setsockopt(finet, SOL_SOCKET,
+ (void)setsockopt(fd, SOL_SOCKET,
SO_RCVBUF, &len, slen);
}
+ pfd[PFD_INET].fd = fd;
+ pfd[PFD_INET].events = POLLIN;
}
}
- if ((fklog = open(_PATH_KLOG, O_RDONLY, 0)) < 0)
+ if ((fd = open(_PATH_KLOG, O_RDONLY, 0)) == -1) {
dprintf("can't open %s (%d)\n", _PATH_KLOG, errno);
+ } else {
+ pfd[PFD_KLOG].fd = fd;
+ pfd[PFD_KLOG].events = POLLIN;
+ }
dprintf("off & running....\n");
@@ -427,20 +435,6 @@ main(int argc, char *argv[])
(void)signal(SIGALRM, domark);
(void)alarm(TIMERINTVL);
- if (fklog != -1 && fklog > fdsrmax)
- fdsrmax = fklog;
- if (finet != -1 && finet > fdsrmax)
- fdsrmax = finet;
- for (i = 0; i < nfunix; i++) {
- if (funix[i] != -1 && funix[i] > fdsrmax)
- fdsrmax = funix[i];
- }
-
- fdsr = (fd_set *)calloc(howmany(fdsrmax+1, NFDBITS),
- sizeof(fd_mask));
- if (fdsr == NULL)
- errx(1, "calloc fd_set");
-
for (;;) {
if (MarkSet)
markit();
@@ -452,47 +446,36 @@ main(int argc, char *argv[])
DoInit = 0;
}
- bzero(fdsr, howmany(fdsrmax+1, NFDBITS) *
- sizeof(fd_mask));
-
- if (fklog != -1)
- FD_SET(fklog, fdsr);
- if (finet != -1)
- FD_SET(finet, fdsr);
- for (i = 0; i < nfunix; i++) {
- if (funix[i] != -1)
- FD_SET(funix[i], fdsr);
- }
-
- switch (select(fdsrmax+1, fdsr, NULL, NULL, NULL)) {
+ switch (poll(pfd, PFD_UNIX_0 + nfunix, -1)) {
case 0:
continue;
case -1:
if (errno != EINTR)
- logerror("select");
+ logerror("poll");
continue;
}
-
- if (fklog != -1 && FD_ISSET(fklog, fdsr)) {
- i = read(fklog, line, linesize - 1);
+ if ((pfd[PFD_KLOG].revents & POLLIN) != 0) {
+ i = read(pfd[PFD_KLOG].fd, line, linesize - 1);
if (i > 0) {
line[i] = '\0';
printsys(line);
} else if (i < 0 && errno != EINTR) {
logerror("klog");
- fklog = -1;
+ pfd[PFD_KLOG].fd = -1;
+ pfd[PFD_KLOG].events = 0;
}
}
- if (finet != -1 && FD_ISSET(finet, fdsr)) {
+ if ((pfd[PFD_INET].revents & POLLIN) != 0) {
len = sizeof(frominet);
- i = recvfrom(finet, line, MAXLINE, 0,
+ i = recvfrom(pfd[PFD_INET].fd, line, MAXLINE, 0,
(struct sockaddr *)&frominet, &len);
if (SecureMode) {
/* silently drop it */
} else {
if (i > 0) {
line[i] = '\0';
- cvthname(&frominet, resolve, sizeof resolve);
+ cvthname(&frominet, resolve,
+ sizeof resolve);
dprintf("cvthname res: %s\n", resolve);
printline(resolve, line);
} else if (i < 0 && errno != EINTR)
@@ -501,10 +484,11 @@ main(int argc, char *argv[])
}
for (i = 0; i < nfunix; i++) {
- if (funix[i] != -1 && FD_ISSET(funix[i], fdsr)) {
+ if ((pfd[PFD_UNIX_0 + i].revents & POLLIN) != 0) {
len = sizeof(fromunix);
- len = recvfrom(funix[i], line, MAXLINE, 0,
- (struct sockaddr *)&fromunix, &len);
+ len = recvfrom(pfd[PFD_UNIX_0 + i].fd, line,
+ MAXLINE, 0, (struct sockaddr *)&fromunix,
+ &len);
if (len > 0) {
line[len] = '\0';
printline(LocalHostName, line);
@@ -513,8 +497,9 @@ main(int argc, char *argv[])
}
}
}
- if (fdsr)
- free(fdsr);
+ /* NOTREACHED */
+ free(pfd);
+ return (0);
}
void
@@ -800,7 +785,7 @@ fprintlog(struct filed *f, int flags, char *msg)
f->f_prevpri, (char *)iov[0].iov_base,
(char *)iov[4].iov_base)) >= sizeof(line) || l == -1)
l = strlen(line);
- if (sendto(finet, line, l, 0,
+ if (sendto(pfd[PFD_INET].fd, line, l, 0,
(struct sockaddr *)&f->f_un.f_forw.f_addr,
sizeof(f->f_un.f_forw.f_addr)) != l) {
f->f_type = F_UNUSED;
@@ -1409,3 +1394,4 @@ markit(void)
MarkSet = 0;
(void)alarm(TIMERINTVL);
}
+
diff --git a/usr.sbin/syslogd/syslogd.h b/usr.sbin/syslogd/syslogd.h
index 567ac8019e6..49b9aa4ee12 100644
--- a/usr.sbin/syslogd/syslogd.h
+++ b/usr.sbin/syslogd/syslogd.h
@@ -36,10 +36,13 @@ int receive_fd(int);
#define MAXFUNIX 21
extern int nfunix;
extern char *funixn[MAXFUNIX];
-extern int funix[MAXFUNIX];
-extern int finet;
-extern int fklog;
-
#define dprintf if (Debug) printf
extern int Debug;
extern int Startup;
+
+/* fds to poll */
+#define PFD_KLOG 0 /* Offset of /dev/klog entry */
+#define PFD_INET 1 /* Offset of inet socket entry */
+#define PFD_UNIX_0 2 /* Start of Unix socket entries */
+#define N_PFD (PFD_UNIX_0 + MAXFUNIX) /* # of pollfd entries */
+extern struct pollfd pfd[N_PFD];