commit 3826d7de43d3b9078c5e18e0074799a3a9ee682e from: Omar Polo date: Mon Jul 24 08:37:39 2023 UTC logger use dprintf and a fd instead of a FILE simplifies further handling. The stdio layer introduces its own buffering and for the logs I'd like to avoid it. fflush(3) is an option, but using a raw fd and dprintf(2) requires less code. commit - bf7a7fd7b24102bf1a24caf21023c8abc5ce63f3 commit + 3826d7de43d3b9078c5e18e0074799a3a9ee682e blob - cf0639e21e157309a221c0289e329f9420176f48 blob + 97de2011d61ccd1352484c6c70f7bdbdc011855c --- logger.c +++ logger.c @@ -37,7 +37,7 @@ #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) #endif -static FILE *log; +static int logfd = 2; /* stderr */ static void logger_init(struct privsep *, struct privsep_proc *, void *); static void logger_shutdown(void); @@ -59,7 +59,6 @@ static void logger_init(struct privsep *ps, struct privsep_proc *p, void *arg) { p->p_shutdown = logger_shutdown; - log = stderr; sandbox_logger_process(); } @@ -67,10 +66,8 @@ static void logger_shutdown(void) { closelog(); - if (log && log != stderr) { - fflush(log); - fclose(log); - } + if (logfd != -1) + close(logfd); } static int @@ -78,16 +75,12 @@ logger_dispatch_parent(int fd, struct privsep_proc *p, { switch (imsg->hdr.type) { case IMSG_LOG_TYPE: - if (log != NULL && log != stderr) { - fflush(log); - fclose(log); - } - log = NULL; + if (logfd != -1) + close(logfd); + logfd = -1; - if (imsg->fd != -1) { - if ((log = fdopen(imsg->fd, "a")) == NULL) - fatal("fdopen"); - } + if (imsg->fd != -1) + logfd = imsg->fd; break; default: return -1; @@ -109,8 +102,8 @@ logger_dispatch_server(int fd, struct privsep_proc *p, if (datalen == 0) fatal("got invalid IMSG_LOG_REQUEST"); msg[datalen - 1] = '\0'; - if (log != NULL) - fprintf(log, "%s\n", msg); + if (logfd != -1) + dprintf(logfd, "%s\n", msg); else syslog(LOG_DAEMON | LOG_NOTICE, "%s", msg); break;