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;
>       }
> 
> 

Reply via email to