Hi,

I am currently working on converting syslogd to libevent.  Theo
recommended to do that before adding tcp and tls support.

With this diff all my regression tests for syslogd pass.  I will
try to pull parts of the diff into separate changes to make review
easier.  I have not tested the syslogc feature yet.  So I will write
more tests before committing this.

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 -r1.5 Makefile
--- usr.sbin/syslogd/Makefile   4 Jan 2004 08:28:49 -0000       1.5
+++ usr.sbin/syslogd/Makefile   29 Aug 2014 15:09:10 -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
 
 .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.43
diff -u -p -r1.43 privsep.c
--- usr.sbin/syslogd/privsep.c  25 Aug 2014 20:19:14 -0000      1.43
+++ usr.sbin/syslogd/privsep.c  29 Aug 2014 15:09:10 -0000
@@ -153,7 +153,6 @@ priv_init(char *conf, int numeric, int l
                dup2(nullfd, STDOUT_FILENO);
                dup2(nullfd, STDERR_FILENO);
        }
-
        if (nullfd > 2)
                close(nullfd);
 
@@ -172,19 +171,21 @@ priv_init(char *conf, int numeric, int l
        close(socks[1]);
 
        /* Close descriptors that only the unpriv child needs */
-       for (i = 0; i < nfunix; 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)
-               close(pfd[PFD_KLOG].fd);
+       if (fd_ctlconn != -1)
+               close(fd_ctlconn);
+       if (fd_ctlsock != -1)
+               close(fd_ctlsock);
+       for (i = 0; i < MAXFUNIX; i++)
+               if (fd_funix[i] != -1)
+                       close(fd_funix[i]);
+       if (fd_klog != -1)
+               close(fd_klog);
+       if (fd_pair != -1)
+               close(fd_pair);
+       if (fd_udp != -1)
+               close(fd_udp);
+       if (fd_udp6 != -1)
+               close(fd_udp6);
 
        /* Save the config file specified by the child process */
        if (strlcpy(config_file, conf, sizeof config_file) >= 
sizeof(config_file))
@@ -369,11 +370,11 @@ priv_init(char *conf, int numeric, int l
        close(socks[0]);
 
        /* Unlink any domain sockets that have been opened */
-       for (i = 0; i < nfunix; i++)
-               if (funixn[i] != NULL && pfd[PFD_UNIX_0 + i].fd != -1)
-                       (void)unlink(funixn[i]);
-       if (ctlsock_path != NULL && pfd[PFD_CTLSOCK].fd != -1)
-               (void)unlink(ctlsock_path);
+       for (i = 0; i < MAXFUNIX; i++)
+               if (path_funix[i] != NULL && fd_funix[i] != -1)
+                       unlink(path_funix[i]);
+       if (path_ctlsock != NULL && fd_ctlsock != -1)
+               unlink(path_ctlsock);
 
        if (restart) {
                int r;
Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.119
diff -u -p -r1.119 syslogd.c
--- usr.sbin/syslogd/syslogd.c  25 Aug 2014 18:19:18 -0000      1.119
+++ usr.sbin/syslogd/syslogd.c  29 Aug 2014 17:34:52 -0000
@@ -65,7 +65,6 @@
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
-#include <sys/wait.h>
 #include <sys/socket.h>
 #include <sys/msgbuf.h>
 #include <sys/uio.h>
@@ -81,6 +80,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <err.h>
+#include <event.h>
 #include <fcntl.h>
 #include <paths.h>
 #include <poll.h>
@@ -183,8 +183,7 @@ char        *TypeNames[9] = {
 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 */
+char   *path_funix[MAXFUNIX] = { _PATH_LOG }; /* Path to Unix domain sockets */
 int    Debug;                  /* debug flag */
 int    Startup = 1;            /* startup flag */
 char   LocalHostName[MAXHOSTNAMELEN];  /* our hostname */
@@ -199,7 +198,7 @@ int IPv4Only = 0;           /* when true, disable
 int    IPv6Only = 0;           /* when true, disable IPv4 */
 int    IncludeHostname = 0;    /* include RFC 3164 style hostnames when 
forwarding */
 
-char   *ctlsock_path = NULL;   /* Path to control socket */
+char   *path_ctlsock = NULL;   /* Path to control socket */
 
 #define CTL_READING_CMD                1
 #define CTL_WRITING_REPLY      2
@@ -245,19 +244,31 @@ char      *reply_text;            /* Start of reply tex
 size_t ctl_reply_size = 0;     /* Number of bytes used in reply */
 size_t ctl_reply_offset = 0;   /* Number of bytes of reply written so far */
 
-struct pollfd pfd[N_PFD];
+char   *linebuf;
+int     linesize;
 
-volatile sig_atomic_t MarkSet;
-volatile sig_atomic_t WantDie;
-volatile sig_atomic_t DoInit;
+int             fd_ctlsock = -1, fd_ctlconn = -1, fd_funix[MAXFUNIX],
+                fd_klog = -1, fd_pair = -1, fd_udp = -1, fd_udp6 = -1;
+struct event    ev_ctlaccept, ev_ctlread, ev_ctlwrite, ev_funix[MAXFUNIX],
+                ev_klog, ev_pair, ev_udp, ev_udp6,
+                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);
@@ -266,7 +277,6 @@ void        logmsg(int, char *, char *, int);
 struct filed *find_dup(struct filed *);
 void   printline(char *, char *);
 void   printsys(char *);
-void   reapchild(int);
 char   *ttymsg(struct iovec *, int, char *, int);
 void   usage(void);
 void   wallmsg(struct filed *, struct iovec *);
@@ -274,24 +284,19 @@ 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   logto_ctlconn(char *);
 
 int
 main(int argc, char *argv[])
 {
-       int ch, i, linesize, fd;
-       struct sockaddr_un fromunix;
-       struct sockaddr_storage from;
-       socklen_t len;
-       char *p, *line;
-       char resolve[MAXHOSTNAMELEN];
-       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, nfunix = 1;
+       int              lockpipe[2] = { -1, -1}, pair[2], nullfd, fd;
+
+       for (i = 0; i < MAXFUNIX; i++)
+               fd_funix[i] = -1;
 
        while ((ch = getopt(argc, argv, "46dhnuf:m:p:a:s:")) != -1)
                switch (ch) {
@@ -319,7 +324,7 @@ main(int argc, char *argv[])
                        NoDNS = 1;
                        break;
                case 'p':               /* path */
-                       funixn[0] = optarg;
+                       path_funix[0] = optarg;
                        break;
                case 'u':               /* allow udp input port */
                        SecureMode = 0;
@@ -330,10 +335,10 @@ main(int argc, char *argv[])
                                    "out of descriptors, ignoring %s\n",
                                    optarg);
                        else
-                               funixn[nfunix++] = optarg;
+                               path_funix[nfunix++] = optarg;
                        break;
                case 's':
-                       ctlsock_path = optarg;
+                       path_ctlsock = optarg;
                        break;
                default:
                        usage();
@@ -368,17 +373,11 @@ main(int argc, char *argv[])
        if (linesize < MAXLINE)
                linesize = MAXLINE;
        linesize++;
-       if ((line = malloc(linesize)) == NULL) {
+       if ((linebuf = malloc(linesize)) == NULL) {
                logerror("Couldn't allocate line buffer");
                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;
@@ -393,94 +392,87 @@ main(int argc, char *argv[])
        }
 
        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);
+                       shutdown(*fdp, SHUT_RD);
                else {
-                       double_rbuf(pfdp->fd);
-                       pfdp->events = POLLIN;
+                       double_rbuf(*fdp);
                }
        }
-
        freeaddrinfo(res0);
 
 #ifndef SUN_LEN
 #define SUN_LEN(unp) (strlen((unp)->sun_path) + 2)
 #endif
        for (i = 0; i < nfunix; i++) {
-               if ((fd = unix_socket(funixn[i], SOCK_DGRAM, 0666)) == -1) {
+               fd_funix[i] = unix_socket(path_funix[i], SOCK_DGRAM, 0666);
+               if (fd_funix[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_funix[i]);
        }
 
-       nfunix++;
        if (socketpair(AF_UNIX, SOCK_DGRAM, PF_UNSPEC, pair) == -1)
                die(0);
-       fd = pair[0];
-       double_rbuf(fd);
-       pfd[PFD_UNIX_0 + i].fd = fd;
-       pfd[PFD_UNIX_0 + i].events = POLLIN;
-
-       if (ctlsock_path != NULL) {
-               fd = unix_socket(ctlsock_path, SOCK_STREAM, 0600);
-               if (fd != -1) {
-                       if (listen(fd, 16) == -1) {
+       fd_pair = pair[0];
+       double_rbuf(fd_pair);
+
+       if (path_ctlsock != NULL) {
+               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");
@@ -510,6 +502,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());
@@ -522,12 +516,35 @@ 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);
+       for (i = 0; i < MAXFUNIX; i++)
+               event_set(&ev_funix[i], fd_funix[i], EV_READ|EV_PERSIST,
+                   unix_readcb, &ev_funix[i]);
+       event_set(&ev_klog, fd_klog, EV_READ|EV_PERSIST, klog_readcb, &ev_klog);
+       event_set(&ev_pair, fd_pair, EV_READ|EV_PERSIST, unix_readcb, &ev_pair);
+       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);
+
+       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);
@@ -538,10 +555,10 @@ main(int argc, char *argv[])
                dup2(nullfd, STDIN_FILENO);
                dup2(nullfd, STDOUT_FILENO);
                dup2(nullfd, STDERR_FILENO);
-               if (nullfd > 2)
-                       close(nullfd);
                close(lockpipe[1]);
        }
+       if (nullfd > 2)
+               close(nullfd);
 
        /*
         * Signal to the priv process that the initial config parsing is done
@@ -549,105 +566,96 @@ 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);
-       (void)signal(SIGCHLD, reapchild);
-       (void)signal(SIGALRM, domark);
-       (void)signal(SIGPIPE, SIG_IGN);
-       (void)alarm(TIMERINTVL);
+       if (fd_ctlsock != -1)
+               event_add(&ev_ctlaccept, NULL);
+       for (i = 0; i < MAXFUNIX; i++)
+               if (fd_funix[i] != -1)
+                       event_add(&ev_funix[i], NULL);
+       if (fd_klog != -1)
+               event_add(&ev_klog, NULL);
+       if (fd_pair != -1)
+               event_add(&ev_pair, NULL);
+       if (!SecureMode) {
+               if (fd_udp != -1)
+                       event_add(&ev_udp, NULL);
+               if (fd_udp6 != -1)
+                       event_add(&ev_udp6, NULL);
+       }
+
+       signal_add(&ev_hup, NULL);
+       signal_add(&ev_term, NULL);
+       if (Debug) {
+               signal_add(&ev_int, NULL);
+               signal_add(&ev_quit, NULL);
+       } else {
+               signal(SIGINT, SIG_IGN);
+               signal(SIGQUIT, SIG_IGN);
+       }
+       signal(SIGCHLD, SIG_IGN);
+       signal(SIGPIPE, SIG_IGN);
+
+       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");
-               }
+       event_dispatch();
+       /* NOTREACHED */
+       return (0);
+}
 
-               switch (poll(pfd, PFD_UNIX_0 + nfunix, -1)) {
-               case 0:
-                       continue;
-               case -1:
-                       if (errno != EINTR)
-                               logerror("poll");
-                       continue;
-               }
+void
+klog_readcb(int fd, short event, void *arg)
+{
+       struct event            *ev = arg;
+       ssize_t                  n;
 
-               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");
-                               pfd[PFD_KLOG].fd = -1;
-                               pfd[PFD_KLOG].events = 0;
-                       }
-               }
-               if ((pfd[PFD_INET].revents & POLLIN) != 0) {
-                       len = sizeof(from);
-                       i = recvfrom(pfd[PFD_INET].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 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)
-                       ctlconn_read_handler();
-               if ((pfd[PFD_CTLCONN].revents & POLLOUT) != 0)
-                       ctlconn_write_handler();
-
-               for (i = 0; i < nfunix; i++) {
-                       if ((pfd[PFD_UNIX_0 + i].revents & POLLIN) != 0) {
-                               ssize_t rlen;
-
-                               len = sizeof(fromunix);
-                               rlen = recvfrom(pfd[PFD_UNIX_0 + i].fd, line,
-                                   MAXLINE, 0, (struct sockaddr *)&fromunix,
-                                   &len);
-                               if (rlen > 0) {
-                                       line[rlen] = '\0';
-                                       printline(LocalHostName, line);
-                               } else if (rlen == -1 && errno != EINTR)
-                                       logerror("recvfrom unix");
-                       }
-               }
+       n = read(fd, linebuf, linesize - 1);
+       if (n > 0) {
+               linebuf[n] = '\0';
+               printsys(linebuf);
+       } else if (n < 0) {
+               logerror("klog");
+               event_del(ev);
        }
-       /* NOTREACHED */
-       free(pfd);
-       return (0);
+}
+
+void
+udp_readcb(int fd, short event, void *arg)
+{
+       struct sockaddr_storage  sa;
+       socklen_t                salen;
+       ssize_t                  n;
+
+       salen = sizeof(sa);
+       n = recvfrom(fd, linebuf, MAXLINE, 0, (struct sockaddr *)&sa, &salen);
+       if (n > 0) {
+               char     resolve[MAXHOSTNAMELEN];
+
+               linebuf[n] = '\0';
+               cvthname((struct sockaddr *)&sa, resolve, sizeof(resolve));
+               dprintf("cvthname res: %s\n", resolve);
+               printline(resolve, linebuf);
+       } else if (n < 0)
+               logerror("recvfrom udp");
+}
+
+void
+unix_readcb(int fd, short event, void *arg)
+{
+       struct sockaddr_un       sa;
+       socklen_t                salen;
+       ssize_t                  n;
+
+       salen = sizeof(sa);
+       n = recvfrom(fd, linebuf, MAXLINE, 0, (struct sockaddr *)&sa, &salen);
+       if (n > 0) {
+               linebuf[n] = '\0';
+               printline(LocalHostName, linebuf);
+       } else if (n < 0)
+               logerror("recvfrom unix");
 }
 
 void
@@ -748,18 +756,12 @@ logmsg(int pri, char *msg, char *from, i
 {
        struct filed *f;
        int fac, msglen, prilev, i;
-       sigset_t mask, omask;
        char *timestamp;
        char prog[NAME_MAX+1];
 
        dprintf("logmsg: pri 0%o, flags 0x%x, from %s, msg %s\n",
            pri, flags, from, msg);
 
-       sigemptyset(&mask);
-       sigaddset(&mask, SIGALRM);
-       sigaddset(&mask, SIGHUP);
-       sigprocmask(SIG_BLOCK, &mask, &omask);
-
        /*
         * Check to see if msg looks non-standard.
         */
@@ -804,7 +806,6 @@ logmsg(int pri, char *msg, char *from, i
                        (void)close(f->f_file);
                        f->f_file = -1;
                }
-               (void)sigprocmask(SIG_SETMASK, &omask, NULL);
                return;
        }
        for (f = Files; f; f = f->f_next) {
@@ -869,7 +870,6 @@ logmsg(int pri, char *msg, char *from, i
                if (f->f_quick)
                        break;
        }
-       (void)sigprocmask(SIG_SETMASK, &omask, NULL);
 }
 
 void
@@ -936,10 +936,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;
@@ -1059,7 +1059,7 @@ fprintlog(struct filed *f, int flags, ch
                if (ringbuf_append_line(f->f_un.f_mb.f_rb, line) == 1)
                        f->f_un.f_mb.f_overflow = 1;
                if (f->f_un.f_mb.f_attached)
-                       logto_ctlconn(line);
+                       ctlconn_logto(line);
                break;
        }
        f->f_prevcount = 0;
@@ -1120,18 +1120,6 @@ wallmsg(struct filed *f, struct iovec *i
        reenter = 0;
 }
 
-/* ARGSUSED */
-void
-reapchild(int signo)
-{
-       int save_errno = errno;
-       int status;
-
-       while (waitpid(-1, &status, WNOHANG) > 0)
-               ;
-       errno = save_errno;
-}
-
 /*
  * Return a printable representation of a host address.
  */
@@ -1153,23 +1141,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");
 }
 
 /*
@@ -1201,7 +1191,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)
@@ -1565,19 +1554,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);
@@ -1811,8 +1800,6 @@ markit(void)
                        BACKOFF(f);
                }
        }
-       MarkSet = 0;
-       (void)alarm(TIMERINTVL);
 }
 
 int
@@ -1884,18 +1871,17 @@ double_rbuf(int fd)
        }
 }
 
-static void
+void
 ctlconn_cleanup(void)
 {
-       struct filed *f;
-
-       if (pfd[PFD_CTLCONN].fd != -1)
-               close(pfd[PFD_CTLCONN].fd);
-
-       pfd[PFD_CTLCONN].fd = -1;
-       pfd[PFD_CTLCONN].events = pfd[PFD_CTLCONN].revents = 0;
+       struct filed            *f;
 
-       pfd[PFD_CTLSOCK].events = POLLIN;
+       if (close(fd_ctlconn) == -1)
+               logerror("close ctlconn");
+       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)
@@ -1906,23 +1892,24 @@ 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)
+               if (errno != EWOULDBLOCK && errno != ECONNABORTED)
                        logerror("accept ctlsock");
                return;
        }
 
-       ctlconn_cleanup();
+       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) {
@@ -1931,8 +1918,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;
 }
@@ -1951,12 +1943,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) {
@@ -1965,13 +1957,10 @@ ctlconn_read_handler(void)
                return;
        }
 
- 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:
-               if (errno == EINTR)
-                       goto retry;
                logerror("ctlconn read");
                /* FALLTHROUGH */
        case 0:
@@ -1980,7 +1969,6 @@ ctlconn_read_handler(void)
        default:
                ctl_cmd_bytes += n;
        }
-
        if (ctl_cmd_bytes < sizeof(ctl_cmd))
                return;
 
@@ -2074,21 +2062,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)) {
@@ -2097,13 +2082,11 @@ ctlconn_write_handler(void)
                ctlconn_cleanup();
                return;
        }
- 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:
-               if (errno == EINTR)
-                       goto retry;
                if (errno != EPIPE)
                        logerror("ctlconn write");
                /* FALLTHROUGH */
@@ -2113,26 +2096,29 @@ ctlconn_write_handler(void)
        default:
                ctl_reply_offset += n;
        }
-       if (ctl_reply_offset >= ctl_reply_size) {
-               /*
-                * Make space in the buffer for continous writes.
-                * Set offset behind reply header to skip it
-                */
-               if (ctl_state == CTL_WRITING_CONT_REPLY) {
-                       *reply_text = '\0';
-                       ctl_reply_offset = ctl_reply_size = CTL_REPLY_SIZE;
-
-                       /* Now is a good time to report dropped lines */
-                       if (membuf_drop) {
-                               strlcat(reply_text, "<ENOBUFS>\n", MAX_MEMBUF);
-                               ctl_reply_size = CTL_REPLY_SIZE;
-                               membuf_drop = 0;
-                       } else {
-                               /* Nothing left to write */
-                               pfd[PFD_CTLCONN].events = POLLIN;
-                       }
-               } else
-                       ctlconn_cleanup();
+       if (ctl_reply_offset < ctl_reply_size)
+               return;
+
+       if (ctl_state != CTL_WRITING_CONT_REPLY) {
+               ctlconn_cleanup();
+               return;
+       }
+
+       /*
+        * Make space in the buffer for continous writes.
+        * Set offset behind reply header to skip it
+        */
+       *reply_text = '\0';
+       ctl_reply_offset = ctl_reply_size = CTL_REPLY_SIZE;
+
+       /* Now is a good time to report dropped lines */
+       if (membuf_drop) {
+               strlcat(reply_text, "<ENOBUFS>\n", MAX_MEMBUF);
+               ctl_reply_size = CTL_REPLY_SIZE;
+               membuf_drop = 0;
+       } else {
+               /* Nothing left to write */
+               event_del(ev);
        }
 }
 
@@ -2159,7 +2145,7 @@ tailify_replytext(char *replytext, int l
 }
 
 void
-logto_ctlconn(char *line)
+ctlconn_logto(char *line)
 {
        size_t l;
 
@@ -2175,5 +2161,5 @@ logto_ctlconn(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.12
diff -u -p -r1.12 syslogd.h
--- usr.sbin/syslogd/syslogd.h  25 Aug 2014 18:19:18 -0000      1.12
+++ usr.sbin/syslogd/syslogd.h  29 Aug 2014 15:09:10 -0000
@@ -40,23 +40,14 @@ int  receive_fd(int);
 
 /* The list of domain sockets */
 #define MAXFUNIX       21
-extern int nfunix;
-extern char *funixn[MAXFUNIX];
-extern char *ctlsock_path;
+extern char *path_funix[MAXFUNIX];
+extern char *path_ctlsock;
+extern int fd_udp, fd_udp6, fd_funix[MAXFUNIX], fd_klog, fd_pair;
+extern int fd_ctlsock, fd_ctlconn;
 
 #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_UNIX_0     5               /* Start of Unix socket entries */
-#define N_PFD          (PFD_UNIX_0 + MAXFUNIX) /* # of pollfd entries */
-extern struct pollfd pfd[N_PFD];
 
 struct ringbuf {
        char *buf;

Reply via email to