summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bluhm <bluhm@cvs.openbsd.org>2014-10-05 18:14:02 +0000
committerAlexander Bluhm <bluhm@cvs.openbsd.org>2014-10-05 18:14:02 +0000
commit7b7894aa621424795adeec7ef68e765cca9fe8c0 (patch)
treea01c2d3c681c196b40c9b549ea40d857d8db79bf
parent452a57c3c800fa477bd2f1d98d44a2be50c5d5fe (diff)
Switch syslogd from using poll(2) to libevent.
test and OK nicm@; OK henning@
-rw-r--r--usr.sbin/syslogd/Makefile4
-rw-r--r--usr.sbin/syslogd/privsep.c34
-rw-r--r--usr.sbin/syslogd/syslogd.c341
-rw-r--r--usr.sbin/syslogd/syslogd.h15
4 files changed, 192 insertions, 202 deletions
diff --git a/usr.sbin/syslogd/Makefile b/usr.sbin/syslogd/Makefile
index 82a60fe421a..98add7b6ba4 100644
--- a/usr.sbin/syslogd/Makefile
+++ b/usr.sbin/syslogd/Makefile
@@ -1,7 +1,9 @@
-# $OpenBSD: Makefile,v 1.5 2004/01/04 08:28:49 djm Exp $
+# $OpenBSD: Makefile,v 1.6 2014/10/05 18:14:01 bluhm Exp $
PROG= syslogd
SRCS= syslogd.c ttymsg.c privsep.c privsep_fdpass.c ringbuf.c
MAN= syslogd.8 syslog.conf.5
+LDADD= -levent
+DPADD= ${LIBEVENT}
.include <bsd.prog.mk>
diff --git a/usr.sbin/syslogd/privsep.c b/usr.sbin/syslogd/privsep.c
index fcf4a3d40f7..cb7e801cc26 100644
--- a/usr.sbin/syslogd/privsep.c
+++ b/usr.sbin/syslogd/privsep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep.c,v 1.47 2014/10/03 21:55:22 bluhm Exp $ */
+/* $OpenBSD: privsep.c,v 1.48 2014/10/05 18:14:01 bluhm Exp $ */
/*
* Copyright (c) 2003 Anil Madhavapeddy <anil@recoil.org>
@@ -171,21 +171,21 @@ priv_init(char *conf, int numeric, int lockfd, int nullfd, char *argv[])
close(socks[1]);
/* Close descriptors that only the unpriv child needs */
+ if (fd_ctlconn != -1)
+ close(fd_ctlconn);
+ if (fd_ctlsock != -1)
+ close(fd_ctlsock);
+ if (fd_klog != -1)
+ close(fd_klog);
+ if (fd_sendsys != -1)
+ close(fd_sendsys);
+ if (fd_udp != -1)
+ close(fd_udp);
+ if (fd_udp6 != -1)
+ close(fd_udp6);
for (i = 0; i < nunix; i++)
- 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_INET6].fd != -1)
- close(pfd[PFD_INET6].fd);
- if (pfd[PFD_CTLSOCK].fd != -1)
- close(pfd[PFD_CTLSOCK].fd);
- if (pfd[PFD_CTLCONN].fd != -1)
- close(pfd[PFD_CTLCONN].fd);
- if (pfd[PFD_KLOG].fd != -1)
- close(pfd[PFD_KLOG].fd);
- if (pfd[PFD_SENDSYS].fd != -1)
- close(pfd[PFD_SENDSYS].fd);
+ if (fd_unix[i] != -1)
+ close(fd_unix[i]);
/* Save the config file specified by the child process */
if (strlcpy(config_file, conf, sizeof config_file) >= sizeof(config_file))
@@ -371,9 +371,9 @@ priv_init(char *conf, int numeric, int lockfd, int nullfd, char *argv[])
/* Unlink any domain sockets that have been opened */
for (i = 0; i < nunix; i++)
- if (pfd[PFD_UNIX_0 + i].fd != -1)
+ if (fd_unix[i] != -1)
(void)unlink(path_unix[i]);
- if (path_ctlsock != NULL && pfd[PFD_CTLSOCK].fd != -1)
+ if (path_ctlsock != NULL && fd_ctlsock != -1)
(void)unlink(path_ctlsock);
if (restart) {
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 166f8a447c5..ae02b9382d4 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: syslogd.c,v 1.127 2014/10/03 21:55:22 bluhm Exp $ */
+/* $OpenBSD: syslogd.c,v 1.128 2014/10/05 18:14:01 bluhm Exp $ */
/*
* Copyright (c) 1983, 1988, 1993, 1994
@@ -50,6 +50,7 @@
* extensive changes by Ralph Campbell
* more extensive changes by Eric Allman (again)
* memory buffer logging by Damien Miller
+ * IPv6, libevent by Alexander Bluhm
*/
#define MAXLINE 1024 /* maximum line length */
@@ -81,6 +82,7 @@
#include <ctype.h>
#include <errno.h>
#include <err.h>
+#include <event.h>
#include <fcntl.h>
#include <paths.h>
#include <poll.h>
@@ -248,23 +250,28 @@ size_t ctl_reply_offset = 0; /* Number of bytes of reply written so far */
char *linebuf;
int linesize;
-void klog_read_handler(int);
-void udp_read_handler(int);
-void unix_read_handler(int);
-
-struct pollfd pfd[N_PFD];
-
-volatile sig_atomic_t MarkSet;
-volatile sig_atomic_t WantDie;
-volatile sig_atomic_t DoInit;
+int fd_ctlsock, fd_ctlconn, fd_klog, fd_sendsys,
+ fd_udp, fd_udp6, fd_unix[MAXUNIX];
+struct event ev_ctlaccept, ev_ctlread, ev_ctlwrite, ev_klog, ev_sendsys,
+ ev_udp, ev_udp6, ev_unix[MAXUNIX],
+ ev_hup, ev_int, ev_quit, ev_term, ev_mark;
+
+void klog_readcb(int, short, void *);
+void udp_readcb(int, short, void *);
+void unix_readcb(int, short, void *);
+void die_signalcb(int, short, void *);
+void mark_timercb(int, short, void *);
+void init_signalcb(int, short, void *);
+void ctlsock_acceptcb(int, short, void *);
+void ctlconn_readcb(int, short, void *);
+void ctlconn_writecb(int, short, void *);
+void ctlconn_logto(char *);
+void ctlconn_cleanup(void);
struct filed *cfline(char *, char *);
void cvthname(struct sockaddr *, char *, size_t);
int decode(const char *, const CODE *);
-void dodie(int);
-void doinit(int);
void die(int);
-void domark(int);
void markit(void);
void fprintlog(struct filed *, int, char *);
void init(void);
@@ -280,20 +287,16 @@ int loghost(char *, char **, char **, char **);
int getmsgbufsize(void);
int unix_socket(char *, int, mode_t);
void double_rbuf(int);
-void ctlsock_accept_handler(void);
-void ctlconn_read_handler(void);
-void ctlconn_write_handler(void);
void tailify_replytext(char *, int);
-void ctlconn_logto(char *);
int
main(int argc, char *argv[])
{
- int ch, i, fd;
- char *p;
- int lockpipe[2] = { -1, -1}, pair[2], nullfd;
- struct addrinfo hints, *res, *res0;
- FILE *fp;
+ struct addrinfo hints, *res, *res0;
+ struct timeval to;
+ char *p;
+ int ch, i;
+ int lockpipe[2] = { -1, -1}, pair[2], nullfd, fd;
while ((ch = getopt(argc, argv, "46dhnuf:m:p:a:s:")) != -1)
switch (ch) {
@@ -375,12 +378,6 @@ main(int argc, char *argv[])
die(0);
}
- /* Clear poll array, set all fds to ignore */
- for (i = 0; i < N_PFD; i++) {
- pfd[i].fd = -1;
- pfd[i].events = 0;
- }
-
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
@@ -394,47 +391,46 @@ main(int argc, char *argv[])
die(0);
}
+ fd_udp = fd_udp6 = -1;
for (res = res0; res; res = res->ai_next) {
- struct pollfd *pfdp;
+ int *fdp;
switch (res->ai_family) {
case AF_INET:
if (IPv6Only)
continue;
- pfdp = &pfd[PFD_INET];
+ fdp = &fd_udp;
break;
case AF_INET6:
if (IPv4Only)
continue;
- pfdp = &pfd[PFD_INET6];
+ fdp = &fd_udp6;
break;
default:
continue;
}
- if (pfdp->fd >= 0)
+ if (*fdp >= 0)
continue;
- fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (fd < 0)
+ *fdp = socket(res->ai_family, res->ai_socktype,
+ res->ai_protocol);
+ if (*fdp == -1)
continue;
- if (bind(fd, res->ai_addr, res->ai_addrlen) < 0) {
+ if (bind(*fdp, res->ai_addr, res->ai_addrlen) < 0) {
logerror("bind");
- close(fd);
+ close(*fdp);
+ *fdp = -1;
if (!Debug)
die(0);
- fd = -1;
continue;
}
- pfdp->fd = fd;
if (SecureMode)
- shutdown(pfdp->fd, SHUT_RD);
- else {
- double_rbuf(pfdp->fd);
- pfdp->events = POLLIN;
- }
+ shutdown(*fdp, SHUT_RD);
+ else
+ double_rbuf(*fdp);
}
freeaddrinfo(res0);
@@ -443,45 +439,42 @@ main(int argc, char *argv[])
#define SUN_LEN(unp) (strlen((unp)->sun_path) + 2)
#endif
for (i = 0; i < nunix; i++) {
- if ((fd = unix_socket(path_unix[i], SOCK_DGRAM, 0666)) == -1) {
+ fd_unix[i] = unix_socket(path_unix[i], SOCK_DGRAM, 0666);
+ if (fd_unix[i] == -1) {
if (i == 0 && !Debug)
die(0);
continue;
}
- double_rbuf(fd);
- pfd[PFD_UNIX_0 + i].fd = fd;
- pfd[PFD_UNIX_0 + i].events = POLLIN;
+ double_rbuf(fd_unix[i]);
}
if (socketpair(AF_UNIX, SOCK_DGRAM, PF_UNSPEC, pair) == -1)
die(0);
- fd = pair[0];
- double_rbuf(fd);
- pfd[PFD_SENDSYS].fd = fd;
- pfd[PFD_SENDSYS].events = POLLIN;
+ fd_sendsys = pair[0];
+ double_rbuf(fd_sendsys);
+ fd_ctlsock = fd_ctlconn = -1;
if (path_ctlsock != NULL) {
- fd = unix_socket(path_ctlsock, SOCK_STREAM, 0600);
- if (fd != -1) {
- if (listen(fd, 16) == -1) {
+ fd_ctlsock = unix_socket(path_ctlsock, SOCK_STREAM, 0600);
+ if (fd_ctlsock == -1) {
+ dprintf("can't open %s (%d)\n", path_ctlsock, errno);
+ if (!Debug)
+ die(0);
+ } else {
+ if (listen(fd_ctlsock, 16) == -1) {
logerror("ctlsock listen");
die(0);
}
- pfd[PFD_CTLSOCK].fd = fd;
- pfd[PFD_CTLSOCK].events = POLLIN;
- } else if (!Debug)
- die(0);
+ }
}
- if ((fd = open(_PATH_KLOG, O_RDONLY, 0)) == -1) {
+ fd_klog = open(_PATH_KLOG, O_RDONLY, 0);
+ if (fd_klog == -1) {
dprintf("can't open %s (%d)\n", _PATH_KLOG, errno);
} else {
- pfd[PFD_KLOG].fd = fd;
- pfd[PFD_KLOG].events = POLLIN;
+ if (ioctl(fd_klog, LIOCSFD, &pair[1]) == -1)
+ dprintf("LIOCSFD errno %d\n", errno);
}
-
- if (ioctl(fd, LIOCSFD, &pair[1]) == -1)
- dprintf("LIOCSFD errno %d\n", errno);
close(pair[1]);
dprintf("off & running....\n");
@@ -511,6 +504,8 @@ main(int argc, char *argv[])
/* tuck my process id away */
if (!Debug) {
+ FILE *fp;
+
fp = fopen(_PATH_LOGPID, "w");
if (fp != NULL) {
fprintf(fp, "%ld\n", (long)getpid());
@@ -523,12 +518,36 @@ main(int argc, char *argv[])
errx(1, "unable to privsep");
/* Process is now unprivileged and inside a chroot */
+ event_init();
+
+ event_set(&ev_ctlaccept, fd_ctlsock, EV_READ|EV_PERSIST,
+ ctlsock_acceptcb, &ev_ctlaccept);
+ event_set(&ev_ctlread, fd_ctlconn, EV_READ|EV_PERSIST,
+ ctlconn_readcb, &ev_ctlread);
+ event_set(&ev_ctlwrite, fd_ctlconn, EV_WRITE|EV_PERSIST,
+ ctlconn_writecb, &ev_ctlwrite);
+ event_set(&ev_klog, fd_klog, EV_READ|EV_PERSIST, klog_readcb, &ev_klog);
+ event_set(&ev_sendsys, fd_sendsys, EV_READ|EV_PERSIST, unix_readcb,
+ &ev_sendsys);
+ event_set(&ev_udp, fd_udp, EV_READ|EV_PERSIST, udp_readcb, &ev_udp);
+ event_set(&ev_udp6, fd_udp6, EV_READ|EV_PERSIST, udp_readcb, &ev_udp6);
+ for (i = 0; i < nunix; i++)
+ event_set(&ev_unix[i], fd_unix[i], EV_READ|EV_PERSIST,
+ unix_readcb, &ev_unix[i]);
+
+ signal_set(&ev_hup, SIGHUP, init_signalcb, &ev_hup);
+ signal_set(&ev_int, SIGINT, die_signalcb, &ev_int);
+ signal_set(&ev_quit, SIGQUIT, die_signalcb, &ev_quit);
+ signal_set(&ev_term, SIGTERM, die_signalcb, &ev_term);
+
+ evtimer_set(&ev_mark, mark_timercb, &ev_mark);
+
init();
Startup = 0;
/* Allocate ctl socket reply buffer if we have a ctl socket */
- if (pfd[PFD_CTLSOCK].fd != -1 &&
+ if (fd_ctlsock != -1 &&
(ctl_reply = malloc(CTL_REPLY_MAXSIZE)) == NULL) {
logerror("Couldn't allocate ctlsock reply buffer");
die(0);
@@ -550,74 +569,51 @@ main(int argc, char *argv[])
*/
priv_config_parse_done();
- (void)signal(SIGHUP, doinit);
- (void)signal(SIGTERM, dodie);
- (void)signal(SIGINT, Debug ? dodie : SIG_IGN);
- (void)signal(SIGQUIT, Debug ? dodie : SIG_IGN);
+ if (fd_ctlsock != -1)
+ event_add(&ev_ctlaccept, NULL);
+ if (fd_klog != -1)
+ event_add(&ev_klog, NULL);
+ if (fd_sendsys != -1)
+ event_add(&ev_sendsys, NULL);
+ if (!SecureMode) {
+ if (fd_udp != -1)
+ event_add(&ev_udp, NULL);
+ if (fd_udp6 != -1)
+ event_add(&ev_udp6, NULL);
+ }
+ for (i = 0; i < nunix; i++)
+ if (fd_unix[i] != -1)
+ event_add(&ev_unix[i], NULL);
+
+ signal_add(&ev_hup, NULL);
+ signal_add(&ev_term, NULL);
+ if (Debug) {
+ signal_add(&ev_int, NULL);
+ signal_add(&ev_quit, NULL);
+ } else {
+ (void)signal(SIGINT, SIG_IGN);
+ (void)signal(SIGQUIT, SIG_IGN);
+ }
(void)signal(SIGCHLD, SIG_IGN);
- (void)signal(SIGALRM, domark);
(void)signal(SIGPIPE, SIG_IGN);
- (void)alarm(TIMERINTVL);
+
+ to.tv_sec = TIMERINTVL;
+ to.tv_usec = 0;
+ evtimer_add(&ev_mark, &to);
logmsg(LOG_SYSLOG|LOG_INFO, "syslogd: start", LocalHostName, ADDDATE);
dprintf("syslogd: started\n");
- for (;;) {
- if (MarkSet)
- markit();
- if (WantDie)
- die(WantDie);
-
- if (DoInit) {
- init();
- DoInit = 0;
-
- logmsg(LOG_SYSLOG|LOG_INFO, "syslogd: restart",
- LocalHostName, ADDDATE);
- dprintf("syslogd: restarted\n");
- }
-
- switch (poll(pfd, PFD_UNIX_0 + nunix, -1)) {
- case 0:
- continue;
- case -1:
- if (errno != EINTR)
- logerror("poll");
- continue;
- }
-
- if ((pfd[PFD_KLOG].revents & POLLIN) != 0) {
- klog_read_handler(pfd[PFD_KLOG].fd);
- }
- if ((pfd[PFD_INET].revents & POLLIN) != 0) {
- udp_read_handler(pfd[PFD_INET].fd);
- }
- if ((pfd[PFD_INET6].revents & POLLIN) != 0) {
- udp_read_handler(pfd[PFD_INET6].fd);
- }
- if ((pfd[PFD_CTLSOCK].revents & POLLIN) != 0)
- ctlsock_accept_handler();
- if ((pfd[PFD_CTLCONN].revents & POLLIN) != 0)
- ctlconn_read_handler();
- if ((pfd[PFD_CTLCONN].revents & POLLOUT) != 0)
- ctlconn_write_handler();
-
- for (i = 0; i < nunix; i++) {
- if ((pfd[PFD_UNIX_0 + i].revents & POLLIN) != 0) {
- unix_read_handler(pfd[PFD_UNIX_0 + i].fd);
- }
- }
- if ((pfd[PFD_SENDSYS].revents & POLLIN) != 0)
- unix_read_handler(pfd[PFD_SENDSYS].fd);
- }
+ event_dispatch();
/* NOTREACHED */
return (0);
}
void
-klog_read_handler(int fd)
+klog_readcb(int fd, short event, void *arg)
{
- ssize_t n;
+ struct event *ev = arg;
+ ssize_t n;
n = read(fd, linebuf, linesize - 1);
if (n > 0) {
@@ -625,13 +621,12 @@ klog_read_handler(int fd)
printsys(linebuf);
} else if (n < 0 && errno != EINTR) {
logerror("klog");
- pfd[PFD_KLOG].fd = -1;
- pfd[PFD_KLOG].events = 0;
+ event_del(ev);
}
}
void
-udp_read_handler(int fd)
+udp_readcb(int fd, short event, void *arg)
{
struct sockaddr_storage sa;
socklen_t salen;
@@ -651,7 +646,7 @@ udp_read_handler(int fd)
}
void
-unix_read_handler(int fd)
+unix_readcb(int fd, short event, void *arg)
{
struct sockaddr_un sa;
socklen_t salen;
@@ -955,10 +950,10 @@ fprintlog(struct filed *f, int flags, char *msg)
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;
+ fd = fd_udp;
break;
case AF_INET6:
- fd = pfd[PFD_INET6].fd;
+ fd = fd_udp6;
break;
default:
fd = -1;
@@ -1160,23 +1155,25 @@ cvthname(struct sockaddr *f, char *result, size_t res_len)
}
void
-dodie(int signo)
+die_signalcb(int signum, short event, void *arg)
{
- WantDie = signo;
+ die(signum);
}
-/* ARGSUSED */
void
-domark(int signo)
+mark_timercb(int unused, short event, void *arg)
{
- MarkSet = 1;
+ markit();
}
-/* ARGSUSED */
void
-doinit(int signo)
+init_signalcb(int signum, short event, void *arg)
{
- DoInit = 1;
+ init();
+
+ logmsg(LOG_SYSLOG|LOG_INFO, "syslogd: restart",
+ LocalHostName, ADDDATE);
+ dprintf("syslogd: restarted\n");
}
/*
@@ -1208,7 +1205,6 @@ die(int signo)
char buf[100];
Initialized = 0; /* Don't log SIGCHLDs */
- alarm(0);
for (f = Files; f != NULL; f = f->f_next) {
/* flush any pending output */
if (f->f_prevcount)
@@ -1572,19 +1568,19 @@ cfline(char *line, char *prog)
if (proto == NULL)
proto = "udp";
if (strcmp(proto, "udp") == 0) {
- if (pfd[PFD_INET].fd == -1)
+ if (fd_udp == -1)
proto = "udp6";
- if (pfd[PFD_INET6].fd == -1)
+ if (fd_udp6 == -1)
proto = "udp4";
} else if (strcmp(proto, "udp4") == 0) {
- if (pfd[PFD_INET].fd == -1) {
+ if (fd_udp == -1) {
snprintf(ebuf, sizeof(ebuf), "no udp4 \"%s\"",
f->f_un.f_forw.f_loghost);
logerror(ebuf);
break;
}
} else if (strcmp(proto, "udp6") == 0) {
- if (pfd[PFD_INET6].fd == -1) {
+ if (fd_udp6 == -1) {
snprintf(ebuf, sizeof(ebuf), "no udp6 \"%s\"",
f->f_un.f_forw.f_loghost);
logerror(ebuf);
@@ -1818,8 +1814,6 @@ markit(void)
BACKOFF(f);
}
}
- MarkSet = 0;
- (void)alarm(TIMERINTVL);
}
int
@@ -1891,18 +1885,17 @@ double_rbuf(int fd)
}
}
-static void
+void
ctlconn_cleanup(void)
{
struct filed *f;
- if (close(pfd[PFD_CTLCONN].fd) == -1)
+ if (close(fd_ctlconn) == -1)
logerror("close ctlconn");
-
- pfd[PFD_CTLCONN].fd = -1;
- pfd[PFD_CTLCONN].events = pfd[PFD_CTLCONN].revents = 0;
-
- pfd[PFD_CTLSOCK].events = POLLIN;
+ fd_ctlconn = -1;
+ event_del(&ev_ctlread);
+ event_del(&ev_ctlwrite);
+ event_add(&ev_ctlaccept, NULL);
if (ctl_state == CTL_WRITING_CONT_REPLY)
for (f = Files; f != NULL; f = f->f_next)
@@ -1913,12 +1906,13 @@ ctlconn_cleanup(void)
}
void
-ctlsock_accept_handler(void)
+ctlsock_acceptcb(int fd, short event, void *arg)
{
- int fd, flags;
+ struct event *ev = arg;
+ int flags;
dprintf("Accepting control connection\n");
- fd = accept(pfd[PFD_CTLSOCK].fd, NULL, NULL);
+ fd = accept(fd, NULL, NULL);
if (fd == -1) {
if (errno != EINTR && errno != EWOULDBLOCK &&
errno != ECONNABORTED)
@@ -1926,11 +1920,11 @@ ctlsock_accept_handler(void)
return;
}
- if (pfd[PFD_CTLCONN].fd != -1)
+ if (fd_ctlconn != -1)
ctlconn_cleanup();
/* Only one connection at a time */
- pfd[PFD_CTLSOCK].events = pfd[PFD_CTLSOCK].revents = 0;
+ event_del(ev);
if ((flags = fcntl(fd, F_GETFL)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
@@ -1939,8 +1933,13 @@ ctlsock_accept_handler(void)
return;
}
- pfd[PFD_CTLCONN].fd = fd;
- pfd[PFD_CTLCONN].events = POLLIN;
+ fd_ctlconn = fd;
+ /* file descriptor has changed, reset event */
+ event_set(&ev_ctlread, fd_ctlconn, EV_READ|EV_PERSIST,
+ ctlconn_readcb, &ev_ctlread);
+ event_set(&ev_ctlwrite, fd_ctlconn, EV_WRITE|EV_PERSIST,
+ ctlconn_writecb, &ev_ctlwrite);
+ event_add(&ev_ctlread, NULL);
ctl_state = CTL_READING_CMD;
ctl_cmd_bytes = 0;
}
@@ -1959,12 +1958,12 @@ static struct filed
}
void
-ctlconn_read_handler(void)
+ctlconn_readcb(int fd, short event, void *arg)
{
- ssize_t n;
- struct filed *f;
- u_int32_t flags = 0;
- struct ctl_reply_hdr *reply_hdr = (struct ctl_reply_hdr *)ctl_reply;
+ struct filed *f;
+ struct ctl_reply_hdr *reply_hdr = (struct ctl_reply_hdr *)ctl_reply;
+ ssize_t n;
+ u_int32_t flags = 0;
if (ctl_state == CTL_WRITING_REPLY ||
ctl_state == CTL_WRITING_CONT_REPLY) {
@@ -1974,7 +1973,7 @@ ctlconn_read_handler(void)
}
retry:
- n = read(pfd[PFD_CTLCONN].fd, (char*)&ctl_cmd + ctl_cmd_bytes,
+ n = read(fd, (char*)&ctl_cmd + ctl_cmd_bytes,
sizeof(ctl_cmd) - ctl_cmd_bytes);
switch (n) {
case -1:
@@ -2081,20 +2080,18 @@ ctlconn_read_handler(void)
ctl_state = (ctl_cmd.cmd == CMD_READ_CONT) ?
CTL_WRITING_CONT_REPLY : CTL_WRITING_REPLY;
- pfd[PFD_CTLCONN].events = POLLOUT;
-
- /* monitor terminating syslogc */
- pfd[PFD_CTLCONN].events |= POLLIN;
+ event_add(&ev_ctlwrite, NULL);
/* another syslogc can kick us out */
if (ctl_state == CTL_WRITING_CONT_REPLY)
- pfd[PFD_CTLSOCK].events = POLLIN;
+ event_add(&ev_ctlaccept, NULL);
}
void
-ctlconn_write_handler(void)
+ctlconn_writecb(int fd, short event, void *arg)
{
- ssize_t n;
+ struct event *ev = arg;
+ ssize_t n;
if (!(ctl_state == CTL_WRITING_REPLY ||
ctl_state == CTL_WRITING_CONT_REPLY)) {
@@ -2105,7 +2102,7 @@ ctlconn_write_handler(void)
}
retry:
- n = write(pfd[PFD_CTLCONN].fd, ctl_reply + ctl_reply_offset,
+ n = write(fd, ctl_reply + ctl_reply_offset,
ctl_reply_size - ctl_reply_offset);
switch (n) {
case -1:
@@ -2142,7 +2139,7 @@ ctlconn_write_handler(void)
membuf_drop = 0;
} else {
/* Nothing left to write */
- pfd[PFD_CTLCONN].events = POLLIN;
+ event_del(ev);
}
}
@@ -2185,5 +2182,5 @@ ctlconn_logto(char *line)
memcpy(ctl_reply + ctl_reply_size, line, l);
memcpy(ctl_reply + ctl_reply_size + l, "\n", 2);
ctl_reply_size += l + 1;
- pfd[PFD_CTLCONN].events |= POLLOUT;
+ event_add(&ev_ctlwrite, NULL);
}
diff --git a/usr.sbin/syslogd/syslogd.h b/usr.sbin/syslogd/syslogd.h
index 2b0305dea18..a64e1fe7fe3 100644
--- a/usr.sbin/syslogd/syslogd.h
+++ b/usr.sbin/syslogd/syslogd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: syslogd.h,v 1.15 2014/10/03 21:55:22 bluhm Exp $ */
+/* $OpenBSD: syslogd.h,v 1.16 2014/10/05 18:14:01 bluhm Exp $ */
/*
* Copyright (c) 2003 Anil Madhavapeddy <anil@recoil.org>
@@ -43,22 +43,13 @@ int receive_fd(int);
extern int nunix;
extern char *path_unix[MAXUNIX];
extern char *path_ctlsock;
+extern int fd_ctlsock, fd_ctlconn, fd_klog, fd_sendsys;
+extern int fd_udp, fd_udp6, fd_unix[MAXUNIX];
#define dprintf(_f...) do { if (Debug) printf(_f); } while (0)
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_CTLSOCK 2 /* Offset of control socket entry */
-#define PFD_CTLCONN 3 /* Offset of control connection entry */
-#define PFD_INET6 4 /* Offset of inet6 socket entry */
-#define PFD_SENDSYS 5 /* Offset of sendsyslog(2) entry */
-#define PFD_UNIX_0 6 /* Start of Unix socket entries */
-#define N_PFD (PFD_UNIX_0 + MAXUNIX) /* # of pollfd entries */
-extern struct pollfd pfd[N_PFD];
-
struct ringbuf {
char *buf;
size_t len, start, end;