X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fkmsg-syslogd.c;h=60d3244b3bd126ebc98bec1da79cfd780734d5b3;hp=f5c8e7121d19a7a48fdf5aa1420a85519e0643ee;hb=ffd73e3599ea2a97c03c1765cd4bc94ebc152f89;hpb=addab137cd8d318e4f543ca56018ee23d51aaca9 diff --git a/src/kmsg-syslogd.c b/src/kmsg-syslogd.c index f5c8e7121..60d3244b3 100644 --- a/src/kmsg-syslogd.c +++ b/src/kmsg-syslogd.c @@ -39,7 +39,6 @@ #include "fdset.h" #define SERVER_FD_MAX 16 -#define TIMEOUT ((int) (10*MSEC_PER_SEC)) typedef struct Stream Stream; @@ -155,50 +154,6 @@ fail: return r; } -static int read_priority(const char **buf) { - int priority; - size_t n; - const char *p; - int a, b, c; - - assert(buf); - assert(*buf); - - p = *buf; - n = strlen(p); - - if (n < 3 || p[0] != '<') - goto fail; - - if (p[2] == '>') { - a = b = 0; - c = undecchar(p[1]); - p += 3; - } else if (n >= 4 && p[3] == '>') { - a = 0; - b = undecchar(p[1]); - c = undecchar(p[2]); - p += 4; - } else if (n >= 5 && p[4] == '>') { - a = undecchar(p[1]); - b = undecchar(p[2]); - c = undecchar(p[3]); - p += 5; - } else - goto fail; - - if (a < 0 || b < 0 || c < 0) - goto fail; - - *buf = p; - - priority = 100*a + 10*b + c; - return LOG_PRI(priority); - -fail: - return LOG_INFO; -} - static void skip_date(const char **buf) { enum { LETTER, @@ -335,17 +290,26 @@ static void skip_pid(const char **buf) { static int write_message(Server *s, const char *buf, struct ucred *ucred) { ssize_t k; - char priority[4], pid[16]; + char priority[6], pid[16]; struct iovec iovec[5]; unsigned i = 0; char *process = NULL; int r = 0; + int prio = LOG_USER | LOG_INFO; assert(s); assert(buf); + parse_syslog_priority((char**) &buf, &prio); + + if (*buf == 0) + return 0; + + if ((prio & LOG_FACMASK) == 0) + prio = LOG_USER | LOG_PRI(prio); + /* First, set priority field */ - snprintf(priority, sizeof(priority), "<%i>", read_priority(&buf)); + snprintf(priority, sizeof(priority), "<%i>", prio); char_array_0(priority); IOVEC_SET_STRING(iovec[i++], priority); @@ -355,7 +319,9 @@ static int write_message(Server *s, const char *buf, struct ucred *ucred) { /* Then, add process if set */ if (read_process(&buf, &iovec[i]) > 0) i++; - else if (ucred && get_process_name(ucred->pid, &process) >= 0) + else if (ucred && + ucred->pid > 0 && + get_process_name(ucred->pid, &process) >= 0) IOVEC_SET_STRING(iovec[i++], process); /* Skip the stored PID if we have a better one */ @@ -473,16 +439,16 @@ static int process_event(Server *s, struct epoll_event *ev) { int main(int argc, char *argv[]) { Server server; - int r = 3, n; + int r = EXIT_FAILURE, n; if (getppid() != 1) { log_error("This program should be invoked by init only."); - return 1; + return EXIT_FAILURE; } if (argc > 1) { log_error("This program does not take arguments."); - return 1; + return EXIT_FAILURE; } log_set_target(LOG_TARGET_KMSG); @@ -491,16 +457,16 @@ int main(int argc, char *argv[]) { if ((n = sd_listen_fds(true)) < 0) { log_error("Failed to read listening file descriptors from environment: %s", strerror(-r)); - return 1; + return EXIT_FAILURE; } if (n <= 0 || n > SERVER_FD_MAX) { log_error("No or too many file descriptors passed."); - return 2; + return EXIT_FAILURE; } if (server_init(&server, (unsigned) n) < 0) - return 3; + return EXIT_FAILURE; log_debug("systemd-kmsg-syslogd running as pid %lu", (unsigned long) getpid()); @@ -512,7 +478,7 @@ int main(int argc, char *argv[]) { struct epoll_event event; int k; - if ((k = epoll_wait(server.epoll_fd, &event, 1, TIMEOUT)) < 0) { + if ((k = epoll_wait(server.epoll_fd, &event, 1, -1)) < 0) { if (errno == EINTR) continue; @@ -531,7 +497,7 @@ int main(int argc, char *argv[]) { break; } - r = 0; + r = EXIT_SUCCESS; log_debug("systemd-kmsg-syslogd stopped as pid %lu", (unsigned long) getpid());