On Sat, Oct 04, 2014 at 01:29:21AM +0200, Alexander Bluhm wrote:
> Hi,
>
> After some preparation, I can convert syslogd to use libevent now.
>
> ok?
>
> bluhm
>
> Index: usr.sbin/syslogd/Makefile
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/Makefile,v
> retrieving revision 1.5
> diff -u -p -u -p -r1.5 Makefile
> --- usr.sbin/syslogd/Makefile 4 Jan 2004 08:28:49 -0000 1.5
> +++ usr.sbin/syslogd/Makefile 3 Oct 2014 22:30:00 -0000
> @@ -1,7 +1,8 @@
> # $OpenBSD: Makefile,v 1.5 2004/01/04 08:28:49 djm Exp $
>
> -PROG= syslogd
> -SRCS= syslogd.c ttymsg.c privsep.c privsep_fdpass.c ringbuf.c
> -MAN= syslogd.8 syslog.conf.5
> +PROG = syslogd
> +SRCS = syslogd.c ttymsg.c privsep.c privsep_fdpass.c ringbuf.c
> +MAN = syslogd.8 syslog.conf.5
> +LDFLAGS = -levent
This should be:
LDADD= -levent
DPADD= ${LIBEVENT}
Rather than LDFLAGS.
Otherwise this looks good and works fine for me.
>
> .include <bsd.prog.mk>
> Index: usr.sbin/syslogd/privsep.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/privsep.c,v
> retrieving revision 1.47
> diff -u -p -u -p -r1.47 privsep.c
> --- usr.sbin/syslogd/privsep.c 3 Oct 2014 21:55:22 -0000 1.47
> +++ usr.sbin/syslogd/privsep.c 3 Oct 2014 23:03:50 -0000
> @@ -171,21 +171,21 @@ priv_init(char *conf, int numeric, int l
> 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 l
>
> /* 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) {
> Index: usr.sbin/syslogd/syslogd.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
> retrieving revision 1.127
> diff -u -p -u -p -r1.127 syslogd.c
> --- usr.sbin/syslogd/syslogd.c 3 Oct 2014 21:55:22 -0000 1.127
> +++ usr.sbin/syslogd/syslogd.c 3 Oct 2014 23:09:30 -0000
> @@ -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 o
> 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 **, ch
> 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, ch
> 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 *resul
> }
>
> 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);
> }
> Index: usr.sbin/syslogd/syslogd.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.h,v
> retrieving revision 1.15
> diff -u -p -u -p -r1.15 syslogd.h
> --- usr.sbin/syslogd/syslogd.h 3 Oct 2014 21:55:22 -0000 1.15
> +++ usr.sbin/syslogd/syslogd.h 3 Oct 2014 22:59:26 -0000
> @@ -43,21 +43,12 @@ 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;
>