#include "log.h"
#include "list.h"
#include "sd-daemon.h"
+#include "tcpwrap.h"
#define STREAM_BUFFER 2048
#define STREAMS_MAX 256
LIST_FIELDS(Stream, stream);
};
-static int stream_log(Stream *s, char *p, usec_t timestamp) {
+static int stream_log(Stream *s, char *p, usec_t ts) {
char header_priority[16], header_time[64], header_pid[16];
struct iovec iovec[5];
time_t t;
struct tm *tm;
- t = (time_t) (timestamp / USEC_PER_SEC);
+ t = (time_t) (ts / USEC_PER_SEC);
if (!(tm = localtime(&t)))
return -EINVAL;
return -EINVAL;
}
- snprintf(header_pid, sizeof(header_pid), "[%llu]: ", (unsigned long long) s->pid);
+ snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) s->pid);
char_array_0(header_pid);
zero(iovec);
return 0;
}
-static int stream_line(Stream *s, char *p, usec_t timestamp) {
+static int stream_line(Stream *s, char *p, usec_t ts) {
int r;
assert(s);
return 0;
case STREAM_RUNNING:
- return stream_log(s, p, timestamp);
+ return stream_log(s, p, ts);
}
assert_not_reached("Unknown stream state");
}
-static int stream_scan(Stream *s, usec_t timestamp) {
+static int stream_scan(Stream *s, usec_t ts) {
char *p;
size_t remaining;
int r = 0;
*newline = 0;
- if ((r = stream_line(s, p, timestamp)) >= 0) {
+ if ((r = stream_line(s, p, ts)) >= 0) {
remaining -= newline-p+1;
p = newline+1;
}
return r;
}
-static int stream_process(Stream *s, usec_t timestamp) {
+static int stream_process(Stream *s, usec_t ts) {
ssize_t l;
int r;
assert(s);
return 0;
s->length += l;
- r = stream_scan(s, timestamp);
+ r = stream_scan(s, ts);
if (r < 0)
return r;
return 0;
}
+ if (!socket_tcpwrap(fd, "systemd-logger")) {
+ close_nointr_nofail(fd);
+ return 0;
+ }
+
if (!(stream = new0(Stream, 1))) {
close_nointr_nofail(fd);
return -ENOMEM;
fd = SD_LISTEN_FDS_START+i;
- if ((r = sd_is_socket(fd, SOCK_STREAM, 1)) < 0) {
+ if ((r = sd_is_socket(fd, AF_UNSPEC, SOCK_STREAM, 1)) < 0) {
log_error("Failed to determine file descriptor type: %s", strerror(-r));
goto fail;
}
/* /dev/kmsg logging is strictly optional */
if ((s->kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0)
- log_debug("Failed to open /dev/kmsg for logging, disabling kernel log buffer support: %s", strerror(errno));
+ log_warning("Failed to open /dev/kmsg for logging, disabling kernel log buffer support: %s", strerror(errno));
return 0;
}
} else {
- usec_t timestamp;
+ usec_t ts;
Stream *stream = ev->data.ptr;
- timestamp = now(CLOCK_REALTIME);
+ ts = now(CLOCK_REALTIME);
if (!(ev->events & EPOLLIN)) {
log_info("Got invalid event from epoll. (2)");
return 0;
}
- if ((r = stream_process(stream, timestamp)) <= 0) {
+ if ((r = stream_process(stream, ts)) <= 0) {
if (r < 0)
log_info("Got error on stream: %s", strerror(-r));
Server server;
int r = 3, n;
+ if (getppid() != 1) {
+ log_error("This program should be invoked by init only.");
+ return 1;
+ }
+
+ if (argc > 1) {
+ log_error("This program does not take arguments.");
+ return 1;
+ }
+
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
log_parse_environment();
- log_info("systemd-logger running as pid %llu", (unsigned long long) getpid());
+ log_info("systemd-logger running as pid %lu", (unsigned long) getpid());
if ((n = sd_listen_fds(true)) < 0) {
log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));
if (server_init(&server, (unsigned) n) < 0)
return 3;
+ sd_notify(false,
+ "READY=1\n"
+ "STATUS=Processing requests...");
+
for (;;) {
struct epoll_event event;
int k;
r = 0;
fail:
+ sd_notify(false,
+ "STATUS=Shutting down...");
+
server_done(&server);
- log_info("systemd-logger stopped as pid %llu", (unsigned long long) getpid());
+ log_info("systemd-logger stopped as pid %lu", (unsigned long) getpid());
return r;
}