Hi,
jung@ reported that syslogd's error messages are lost if it cannot
open a logfile. Problem is there is interfering logic during startup
whether to log to stderr or /dev/console.
My log_setdebug() feature adds too much abstraction, use the global
variable Started instead. Then all decisions can be done in syslog.c
Set the Started value before the init() function. This means that
errors during config read will be logged to the console as Initialize
is still 0. This is better than stderr as this may be redirected
to /dev/null.
Print the timestamp and hostname also for locally generated messages
to console, so that they look like all others.
ok?
bluhm
Index: usr.sbin/syslogd/log.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/log.c,v
retrieving revision 1.3
diff -u -p -r1.3 log.c
--- usr.sbin/syslogd/log.c 6 Apr 2017 14:55:43 -0000 1.3
+++ usr.sbin/syslogd/log.c 27 Apr 2017 13:38:54 -0000
@@ -28,7 +28,6 @@
#include "log.h"
#include "syslogd.h"
-static int debug;
static int verbose;
static int facility;
static const char *log_procname;
@@ -40,7 +39,6 @@ log_init(int n_debug, int fac)
{
extern char *__progname;
- debug = n_debug;
verbose = n_debug;
facility = fac;
log_procinit(__progname);
@@ -62,18 +60,6 @@ log_procinit(const char *procname)
}
void
-log_setdebug(int d)
-{
- debug = d;
-}
-
-int
-log_getdebug(void)
-{
- return (debug);
-}
-
-void
log_setverbose(int v)
{
verbose = v;
@@ -98,18 +84,9 @@ logit(int pri, const char *fmt, ...)
void
vlog(int pri, const char *fmt, va_list ap)
{
- char ebuf[ERRBUFSIZE];
- size_t l;
int saved_errno = errno;
- if (debug) {
- l = snprintf(ebuf, sizeof(ebuf), "%s: ", log_procname);
- if (l < sizeof(ebuf))
- vsnprintf(ebuf+l, sizeof(ebuf)-l, fmt, ap);
- fprintf(stderr, "%s\n", ebuf);
- fflush(stderr);
- } else
- vlogmsg(facility|pri, log_procname, fmt, ap);
+ vlogmsg(facility|pri, log_procname, fmt, ap);
errno = saved_errno;
}
Index: usr.sbin/syslogd/log.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/log.h,v
retrieving revision 1.2
diff -u -p -r1.2 log.h
--- usr.sbin/syslogd/log.h 5 Apr 2017 11:31:45 -0000 1.2
+++ usr.sbin/syslogd/log.h 27 Apr 2017 13:37:52 -0000
@@ -26,8 +26,6 @@
void log_init(int, int);
void log_procinit(const char *);
-void log_setdebug(int);
-int log_getdebug(void);
void log_setverbose(int);
int log_getverbose(void);
void log_warn(const char *, ...)
Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.243
diff -u -p -r1.243 syslogd.c
--- usr.sbin/syslogd/syslogd.c 25 Apr 2017 17:45:50 -0000 1.243
+++ usr.sbin/syslogd/syslogd.c 27 Apr 2017 21:55:10 -0000
@@ -204,6 +204,7 @@ int Debug; /* debug flag */
int Foreground; /* run in foreground, instead of daemonizing */
char LocalHostName[HOST_NAME_MAX+1]; /* our hostname */
char *LocalDomain; /* our local domain name */
+int Started = 0; /* set after privsep */
int Initialized = 0; /* set when we have initialized ourselves */
int MarkInterval = 20 * 60; /* interval between marks in seconds */
@@ -465,7 +466,6 @@ main(int argc, char *argv[])
log_init(Debug, LOG_SYSLOG);
log_procinit("syslogd");
- log_setdebug(1);
if (Debug)
setvbuf(stdout, NULL, _IOLBF, 0);
@@ -731,6 +731,8 @@ main(int argc, char *argv[])
if (pledge("stdio unix inet recvfd", NULL) == -1)
err(1, "pledge");
+ Started = 1;
+
/* Process is now unprivileged and inside a chroot */
if (Debug)
event_set_log_callback(logevent);
@@ -791,8 +793,6 @@ main(int argc, char *argv[])
init();
- log_setdebug(0);
-
/* Allocate ctl socket reply buffer if we have a ctl socket */
if (fd_ctlsock != -1 &&
(ctl_reply = malloc(CTL_REPLY_MAXSIZE)) == NULL)
@@ -1627,6 +1627,10 @@ vlogmsg(int pri, const char *proc, const
l = snprintf(msg, sizeof(msg), "%s[%d]: ", proc, getpid());
if (l < sizeof(msg))
vsnprintf(msg + l, sizeof(msg) - l, fmt, ap);
+ if (!Started) {
+ fprintf(stderr, "%s\n", msg);
+ return;
+ }
logline(pri, ADDDATE, LocalHostName, msg);
}
@@ -1763,6 +1767,10 @@ logline(int pri, int flags, char *from,
f->f_file = priv_open_tty(ctty);
if (f->f_file >= 0) {
+ 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;