X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald-syslog.c;h=21bc9679c2b3686d57a9df167c5c73f420212b06;hb=687f6a0ba77872299b9fb1f2f04d31c977088a63;hp=d7fa2457212151180889eb8df4a331d5c5c63a2e;hpb=da927ba997d68401563b927f92e6e40e021a8e5c;p=elogind.git diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c index d7fa24572..21bc9679c 100644 --- a/src/journal/journald-syslog.c +++ b/src/journal/journald-syslog.c @@ -85,12 +85,12 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned return; } - if (ucred && errno == ESRCH) { + if (ucred && (errno == ESRCH || errno == EPERM)) { struct ucred u; /* Hmm, presumably the sender process vanished - * by now, so let's fix it as good as we - * can, and retry */ + * by now, or we don't have CAP_SYS_AMDIN, so + * let's fix it as good as we can, and retry */ u = *ucred; u.pid = getpid(); @@ -106,7 +106,7 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned } if (errno != ENOENT) - log_debug("Failed to forward syslog message: %m"); + log_debug_errno(errno, "Failed to forward syslog message: %m"); } static void forward_syslog_raw(Server *s, int priority, const char *buffer, const struct ucred *ucred, const struct timeval *tv) { @@ -238,46 +238,6 @@ size_t syslog_parse_identifier(const char **buf, char **identifier, char **pid) return e; } -void syslog_parse_priority(const char **p, int *priority, bool with_facility) { - int a = 0, b = 0, c = 0; - int k; - - assert(p); - assert(*p); - assert(priority); - - if ((*p)[0] != '<') - return; - - if (!strchr(*p, '>')) - return; - - if ((*p)[2] == '>') { - c = undecchar((*p)[1]); - k = 3; - } else if ((*p)[3] == '>') { - b = undecchar((*p)[1]); - c = undecchar((*p)[2]); - k = 4; - } else if ((*p)[4] == '>') { - a = undecchar((*p)[1]); - b = undecchar((*p)[2]); - c = undecchar((*p)[3]); - k = 5; - } else - return; - - if (a < 0 || b < 0 || c < 0 || - (!with_facility && (a || b || c > 7))) - return; - - if (with_facility) - *priority = a*100 + b*10 + c; - else - *priority = (*priority & LOG_FACMASK) | c; - *p += k; -} - static void syslog_skip_date(char **buf) { enum { LETTER, @@ -428,48 +388,38 @@ int server_open_syslog_socket(Server *s) { }; s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); - if (s->syslog_fd < 0) { - log_error("socket() failed: %m"); - return -errno; - } + if (s->syslog_fd < 0) + return log_error_errno(errno, "socket() failed: %m"); unlink(sa.un.sun_path); r = bind(s->syslog_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path)); - if (r < 0) { - log_error("bind(%s) failed: %m", sa.un.sun_path); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path); chmod(sa.un.sun_path, 0666); } else fd_nonblock(s->syslog_fd, 1); r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)); - if (r < 0) { - log_error("SO_PASSCRED failed: %m"); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "SO_PASSCRED failed: %m"); #ifdef HAVE_SELINUX if (mac_selinux_use()) { r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)); if (r < 0) - log_warning("SO_PASSSEC failed: %m"); + log_warning_errno(errno, "SO_PASSSEC failed: %m"); } #endif r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)); - if (r < 0) { - log_error("SO_TIMESTAMP failed: %m"); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "SO_TIMESTAMP failed: %m"); - r = sd_event_add_io(s->event, &s->syslog_event_source, s->syslog_fd, EPOLLIN, process_datagram, s); - if (r < 0) { - log_error_errno(r, "Failed to add syslog server fd to event loop: %m"); - return r; - } + r = sd_event_add_io(s->event, &s->syslog_event_source, s->syslog_fd, EPOLLIN, server_process_datagram, s); + if (r < 0) + return log_error_errno(r, "Failed to add syslog server fd to event loop: %m"); return 0; }