diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-10-04 16:40:17 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-10-04 16:40:17 +0000 |
commit | 93d0776a96919a94fca51fe2cfd9530d8c9dcbb9 (patch) | |
tree | a9714be0d4c6b22c97c63db94b26e934a0338d06 | |
parent | c2d5a27b622d5a048a3cf175e51f8b4b2b9e9757 (diff) | |
download | busybox-w32-93d0776a96919a94fca51fe2cfd9530d8c9dcbb9.tar.gz busybox-w32-93d0776a96919a94fca51fe2cfd9530d8c9dcbb9.tar.bz2 busybox-w32-93d0776a96919a94fca51fe2cfd9530d8c9dcbb9.zip |
watchdog: WDIOC_SETTIMEOUT accepts seconds, not milliseconds
klogd: handle many lines at once, by Steve Bennett (steveb AT workware.net.au)
-rw-r--r-- | miscutils/watchdog.c | 2 | ||||
-rw-r--r-- | sysklogd/klogd.c | 71 |
2 files changed, 45 insertions, 28 deletions
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c index 9bcd4b874..75a399f24 100644 --- a/miscutils/watchdog.c +++ b/miscutils/watchdog.c | |||
@@ -55,6 +55,8 @@ int watchdog_main(int argc, char **argv) | |||
55 | /* Use known fd # - avoid needing global 'int fd' */ | 55 | /* Use known fd # - avoid needing global 'int fd' */ |
56 | xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3); | 56 | xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3); |
57 | 57 | ||
58 | /* WDIOC_SETTIMEOUT takes seconds, not milliseconds */ | ||
59 | htimer_duration = htimer_duration / 1000; | ||
58 | ioctl_or_warn(3, WDIOC_SETTIMEOUT, &htimer_duration); | 60 | ioctl_or_warn(3, WDIOC_SETTIMEOUT, &htimer_duration); |
59 | #if 0 | 61 | #if 0 |
60 | ioctl_or_warn(3, WDIOC_GETTIMEOUT, &htimer_duration); | 62 | ioctl_or_warn(3, WDIOC_GETTIMEOUT, &htimer_duration); |
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c index c4bbf1558..723ca8067 100644 --- a/sysklogd/klogd.c +++ b/sysklogd/klogd.c | |||
@@ -44,6 +44,7 @@ int klogd_main(int argc UNUSED_PARAM, char **argv) | |||
44 | int i = 0; | 44 | int i = 0; |
45 | char *start; | 45 | char *start; |
46 | int opt; | 46 | int opt; |
47 | int used = 0; | ||
47 | 48 | ||
48 | opt = getopt32(argv, "c:n", &start); | 49 | opt = getopt32(argv, "c:n", &start); |
49 | if (opt & OPT_LEVEL) { | 50 | if (opt & OPT_LEVEL) { |
@@ -72,16 +73,15 @@ int klogd_main(int argc UNUSED_PARAM, char **argv) | |||
72 | 73 | ||
73 | syslog(LOG_NOTICE, "klogd started: %s", bb_banner); | 74 | syslog(LOG_NOTICE, "klogd started: %s", bb_banner); |
74 | 75 | ||
75 | /* Note: this code does not detect incomplete messages | 76 | /* Initially null terminate the buffer in case of a very long line */ |
76 | * (messages not ending with '\n' or just when kernel | 77 | log_buffer[KLOGD_LOGBUF_SIZE - 1] = '\0'; |
77 | * generates too many messages for us to keep up) | 78 | |
78 | * and will split them in two separate lines */ | ||
79 | while (1) { | 79 | while (1) { |
80 | int n; | 80 | int n; |
81 | int priority; | 81 | int priority; |
82 | 82 | ||
83 | /* "2 -- Read from the log." */ | 83 | /* "2 -- Read from the log." */ |
84 | n = klogctl(2, log_buffer, KLOGD_LOGBUF_SIZE - 1); | 84 | n = klogctl(2, log_buffer + used, KLOGD_LOGBUF_SIZE-1 - used); |
85 | if (n < 0) { | 85 | if (n < 0) { |
86 | if (errno == EINTR) | 86 | if (errno == EINTR) |
87 | continue; | 87 | continue; |
@@ -89,32 +89,47 @@ int klogd_main(int argc UNUSED_PARAM, char **argv) | |||
89 | errno); | 89 | errno); |
90 | break; | 90 | break; |
91 | } | 91 | } |
92 | log_buffer[n] = '\n'; | 92 | |
93 | i = 0; | 93 | /* klogctl buffer parsing modelled after code in dmesg.c */ |
94 | while (i < n) { | 94 | start = &log_buffer[0]; |
95 | |||
96 | /* Process each newline-terminated line in the buffer */ | ||
97 | while (1) { | ||
98 | char *newline = strchr(start, '\n'); | ||
99 | |||
100 | if (!newline) { | ||
101 | /* This line is incomplete... */ | ||
102 | if (start != log_buffer) { | ||
103 | /* move it to the front of the buffer */ | ||
104 | strcpy(log_buffer, start); | ||
105 | /* don't log it yet */ | ||
106 | used = strlen(log_buffer); | ||
107 | break; | ||
108 | } | ||
109 | /* ...but buffer is full, so log it anyway */ | ||
110 | used = 0; | ||
111 | } else { | ||
112 | *newline++ = '\0'; | ||
113 | } | ||
114 | |||
115 | /* Extract the priority */ | ||
95 | priority = LOG_INFO; | 116 | priority = LOG_INFO; |
96 | start = &log_buffer[i]; | 117 | if (*start == '<') { |
97 | if (log_buffer[i] == '<') { | 118 | start++; |
98 | i++; | 119 | if (*start) { |
99 | // kernel never ganerates multi-digit prios | 120 | /* kernel never generates multi-digit prios */ |
100 | //priority = 0; | 121 | priority = (*start - '0'); |
101 | //while (log_buffer[i] >= '0' && log_buffer[i] <= '9') { | 122 | start++; |
102 | // priority = priority * 10 + (log_buffer[i] - '0'); | 123 | } |
103 | // i++; | 124 | if (*start == '>') { |
104 | //} | 125 | start++; |
105 | if (isdigit(log_buffer[i])) { | ||
106 | priority = (log_buffer[i] - '0'); | ||
107 | i++; | ||
108 | } | 126 | } |
109 | if (log_buffer[i] == '>') | ||
110 | i++; | ||
111 | start = &log_buffer[i]; | ||
112 | } | 127 | } |
113 | while (log_buffer[i] != '\n') | 128 | if (*start) |
114 | i++; | 129 | syslog(priority, "%s", start); |
115 | log_buffer[i] = '\0'; | 130 | if (!newline) |
116 | syslog(priority, "%s", start); | 131 | break; |
117 | i++; | 132 | start = newline; |
118 | } | 133 | } |
119 | } | 134 | } |
120 | 135 | ||