From 81ca156213933868aaa31f5dfefaab9207cb12bc Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Mon, 7 Oct 2024 07:03:30 -0500 Subject: [PATCH] Cleanup pass on klogd. --- toys/pending/klogd.c | 58 +++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/toys/pending/klogd.c b/toys/pending/klogd.c index c888e9e7..bef4e554 100644 --- a/toys/pending/klogd.c +++ b/toys/pending/klogd.c @@ -8,18 +8,18 @@ USE_KLOGD(NEWTOY(klogd, "c#<1>8n", TOYFLAG_SBIN)) config KLOGD - bool "klogd" - default n - help - usage: klogd [-n] [-c N] + bool "klogd" + default n + help + usage: klogd [-n] [-c N] - -c N Print to console messages more urgent than prio N (1-8)" - -n Run in foreground + -c N Print to console messages more urgent than prio N (1-8)" + -n Run in foreground config KLOGD_SOURCE_RING_BUFFER - bool "enable kernel ring buffer as log source." - default n - depends on KLOGD + bool "enable kernel ring buffer as log source." + default n + depends on KLOGD */ #define FOR_klogd @@ -34,26 +34,26 @@ GLOBALS( static void set_log_level(int level) { - if (CFG_KLOGD_SOURCE_RING_BUFFER) - klogctl(8, NULL, level); + if (CFG_KLOGD_SOURCE_RING_BUFFER) klogctl(8, 0, level); else { FILE *fptr = xfopen("/proc/sys/kernel/printk", "w"); + fprintf(fptr, "%u\n", level); fclose(fptr); - fptr = NULL; } } static void handle_signal(int sig) { if (CFG_KLOGD_SOURCE_RING_BUFFER) { - klogctl(7, NULL, 0); - klogctl(0, NULL, 0); + klogctl(7, 0, 0); + klogctl(0, 0, 0); } else { set_log_level(7); xclose(TT.fd); } - syslog(LOG_NOTICE,"KLOGD: Daemon exiting......"); + syslog(LOG_NOTICE, "KLOGD: Daemon exiting......"); + exit(1); } @@ -64,37 +64,35 @@ static void handle_signal(int sig) void klogd_main(void) { int prio, size, used = 0; - char *start, *line_start, msg_buffer[16348]; //LOG_LINE_LENGTH - Ring buffer size + char *start, *line_start; sigatexit(handle_signal); - if (toys.optflags & FLAG_c) set_log_level(TT.level); //set log level - if (!(toys.optflags & FLAG_n)) daemon(0, 0); //Make it daemon + if (FLAG(c)) set_log_level(TT.level); //set log level + if (!FLAG(n)) daemon(0, 0); //Make it daemon if (CFG_KLOGD_SOURCE_RING_BUFFER) { syslog(LOG_NOTICE, "KLOGD: started with Kernel ring buffer as log source\n"); - klogctl(1, NULL, 0); + klogctl(1, 0, 0); } else { TT.fd = xopenro("/proc/kmsg"); //_PATH_KLOG in paths.h syslog(LOG_NOTICE, "KLOGD: started with /proc/kmsg as log source\n"); } openlog("Kernel", 0, LOG_KERN); //open connection to system logger.. - while(1) { - start = msg_buffer + used; //start updated for re-read. - if (CFG_KLOGD_SOURCE_RING_BUFFER) { - size = klogctl(2, start, sizeof(msg_buffer) - used - 1); - } else { - size = xread(TT.fd, start, sizeof(msg_buffer) - used - 1); - } + for (;;) { + start = toybuf + used; //start updated for re-read. + size = sizeof(toybuf)-used-1; + if (CFG_KLOGD_SOURCE_RING_BUFFER) size = klogctl(2, start, size); + else size = xread(TT.fd, start, size); if (size < 0) perror_exit("error reading file:"); - start[size] = '\0'; //Ensure last line to be NUL terminated. - if (used) start = msg_buffer; + start[size] = 0; + if (used) start = toybuf; while(start) { if ((line_start = strsep(&start, "\n")) != NULL && start != NULL) used = 0; else { //Incomplete line, copy it to start of buff. used = strlen(line_start); - strcpy(msg_buffer, line_start); - if (used < (sizeof(msg_buffer) - 1)) break; + strcpy(toybuf, line_start); + if (used < (sizeof(toybuf) - 1)) break; used = 0; //we have buffer full, log it as it is. } prio = LOG_INFO; //we dont know priority, mark it INFO -- 2.39.5