On Wed, Sep 13, 2017 at 05:48:04PM +0200, Alexander Bluhm wrote: > Hi, > > syslogd has special code for reporting errors before it has been > initialized. Then it tries to log to console. For every message > it reopens the console with file descriptor passing from the privsep > parent. Of course that does not work when we have reached our file > descriptor limit. I think is is better to have the console preopend, > so we can always get a message out. > > ok?
makes sense. ok brynet@ > > bluhm > > Index: usr.sbin/syslogd/syslogd.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v > retrieving revision 1.246 > diff -u -p -r1.246 syslogd.c > --- usr.sbin/syslogd/syslogd.c 12 Sep 2017 15:17:20 -0000 1.246 > +++ usr.sbin/syslogd/syslogd.c 13 Sep 2017 14:59:20 -0000 > @@ -483,6 +483,10 @@ main(int argc, char *argv[]) > consfile.f_type = F_CONSOLE; > (void)strlcpy(consfile.f_un.f_fname, ctty, > sizeof(consfile.f_un.f_fname)); > + consfile.f_file = open(consfile.f_un.f_fname, O_WRONLY|O_NONBLOCK, 0); > + if (consfile.f_file == -1) > + log_warn("open %s", consfile.f_un.f_fname); > + > (void)gethostname(LocalHostName, sizeof(LocalHostName)); > if ((p = strchr(LocalHostName, '.')) != NULL) { > *p++ = '\0'; > @@ -1780,16 +1784,14 @@ logline(int pri, int flags, char *from, > /* log the message to the particular outputs */ > if (!Initialized) { > f = &consfile; > - f->f_file = priv_open_tty(ctty); > - > - if (f->f_file >= 0) { > + if (f->f_type == F_CONSOLE) { > strlcpy(f->f_lasttime, timestamp, > sizeof(f->f_lasttime)); > strlcpy(f->f_prevhost, from, > sizeof(f->f_prevhost)); > fprintlog(f, flags, msg); > - (void)close(f->f_file); > - f->f_file = -1; > + /* May be set to F_UNUSED, try again next time. */ > + f->f_type = F_CONSOLE; > } > return; > } > >