X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=log%2Fsyslog.c;h=f1c7606d95fb37eca27792c912b9f511c69354c7;hp=d0b528d6c7b4bf6f42aeffb08e6a2f8b774a7271;hb=69d6542848ed712a79dcba4965da4100e2804dd7;hpb=2b32e9059166a23204fcf01e65a9184b3c39166b diff --git a/log/syslog.c b/log/syslog.c index d0b528d..f1c7606 100644 --- a/log/syslog.c +++ b/log/syslog.c @@ -25,20 +25,20 @@ #include #include #include +#include #include #include #include -#include - #include "syslog.h" #define LOG_DEFAULT_SIZE (16 * 1024) #define LOG_DEFAULT_SOCKET "/dev/log" -#define LOG_LINE_LEN 256 #define SYSLOG_PADDING 16 +#define MAXLINE 1024 + #define KLOG_DEFAULT_PROC "/proc/kmsg" #define PAD(x) (x % 4) ? (((x) - (x % 4)) + 4) : (x) @@ -53,7 +53,7 @@ static regex_t pat_tstamp; static struct log_head* log_next(struct log_head *h, int size) { - struct log_head *n = (struct log_head *) &h->data[PAD(sizeof(struct log_head) + size)]; + struct log_head *n = (struct log_head *) &h->data[PAD(size)]; return (n >= log_end) ? (log) : (n); } @@ -68,7 +68,7 @@ log_add(char *buf, int size, int source) /* bounce out if we don't have init'ed yet (regmatch etc will blow) */ if (!log) { - fprintf(stderr, buf); + fprintf(stderr, "%s", buf); return; } @@ -131,26 +131,32 @@ log_add(char *buf, int size, int source) } static void -slog_cb(struct ustream *s, int bytes) +syslog_handle_fd(struct uloop_fd *fd, unsigned int events) { - struct ustream_buf *buf = s->r.head; - char *str; + static char buf[MAXLINE]; int len; - do { - str = ustream_get_read_buf(s, NULL); - if (!str) + while (1) { + char *c; + + len = recv(fd->fd, buf, MAXLINE - 1, 0); + if (len < 0) { + if (errno == EINTR) + continue; + break; - len = strlen(buf->data); - if (!len) { - bytes -= 1; - ustream_consume(s, 1); - continue; } - log_add(buf->data, len + 1, SOURCE_SYSLOG); - ustream_consume(s, len); - bytes -= len; - } while (bytes > 0); + if (!len) + break; + + buf[len] = 0; + for (c = buf; *c; c++) { + if (*c == '\n') + *c = ' '; + } + + log_add(buf, c - buf + 1, SOURCE_SYSLOG); + } } static void @@ -174,12 +180,11 @@ klog_cb(struct ustream *s, int bytes) } while (1); } -struct ustream_fd slog = { - .stream.string_data = true, - .stream.notify_read = slog_cb, +static struct uloop_fd syslog_fd = { + .cb = syslog_handle_fd }; -struct ustream_fd klog = { +static struct ustream_fd klog = { .stream.string_data = true, .stream.notify_read = klog_cb, }; @@ -202,16 +207,15 @@ klog_open(void) static int syslog_open(void) { - int fd; - unlink(log_dev); - fd = usock(USOCK_UNIX | USOCK_UDP | USOCK_SERVER | USOCK_NONBLOCK, log_dev, NULL); - if (fd < 0) { + syslog_fd.fd = usock(USOCK_UNIX | USOCK_UDP | USOCK_SERVER | USOCK_NONBLOCK, log_dev, NULL); + if (syslog_fd.fd < 0) { fprintf(stderr,"Failed to open %s\n", log_dev); return -1; } chmod(log_dev, 0666); - ustream_fd_init(&slog, fd); + uloop_fd_add(&syslog_fd, ULOOP_READ | ULOOP_EDGE_TRIGGER); + return 0; } @@ -281,10 +285,6 @@ log_init(int _log_size) if (_log_size > 0) log_size = _log_size; - /* reserve 512 bytes for protocol overhead */ - if (log_size > (UBUS_MAX_MSGLEN - 512)) - log_size = UBUS_MAX_MSGLEN - 512; - regcomp(&pat_prio, "^<([0-9]*)>(.*)", REG_EXTENDED); regcomp(&pat_tstamp, "^\[[ 0]*([0-9]*).([0-9]*)] (.*)", REG_EXTENDED); @@ -301,8 +301,14 @@ log_init(int _log_size) void log_shutdown(void) { - ustream_free(&slog.stream); + if (syslog_fd.registered) { + uloop_fd_delete(&syslog_fd); + close(syslog_fd.fd); + } + ustream_free(&klog.stream); - close(slog.fd.fd); close(klog.fd.fd); + free(log); + regfree(&pat_prio); + regfree(&pat_tstamp); }