Re: syslogd preopen console

2017-09-16 Thread Jeremie Courreges-Anglas
On Wed, Sep 13 2017, 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?

ok jca@

> 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.c12 Sep 2017 15:17:20 -  1.246
> +++ usr.sbin/syslogd/syslogd.c13 Sep 2017 14:59:20 -
> @@ -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 = 
> - 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;
>   }
>

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE



Re: syslogd preopen console

2017-09-14 Thread Bryan Steele
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.c12 Sep 2017 15:17:20 -  1.246
> +++ usr.sbin/syslogd/syslogd.c13 Sep 2017 14:59:20 -
> @@ -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 = 
> - 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;
>   }
> 
> 



syslogd preopen console

2017-09-13 Thread Alexander Bluhm
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?

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 -  1.246
+++ usr.sbin/syslogd/syslogd.c  13 Sep 2017 14:59:20 -
@@ -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 = 
-   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;
}