mirror of
https://github.com/AuxXxilium/eudev.git
synced 2025-03-11 17:31:10 +07:00
logger: support SOCK_STREAM /dev/log sockets as necessary for syslog-ng
This commit is contained in:
parent
739848d4f3
commit
b00bad3641
2
fixme
2
fixme
@ -86,6 +86,8 @@
|
|||||||
|
|
||||||
* emergency.service should start default.target after C-d.
|
* emergency.service should start default.target after C-d.
|
||||||
|
|
||||||
|
* support dbus introspection in mid-level object paths, i.e. in /org/freedesktop/systemd/units/.
|
||||||
|
|
||||||
External:
|
External:
|
||||||
|
|
||||||
* place /etc/inittab with explaining blurb.
|
* place /etc/inittab with explaining blurb.
|
||||||
|
49
src/logger.c
49
src/logger.c
@ -51,6 +51,8 @@ typedef struct Server {
|
|||||||
|
|
||||||
unsigned n_server_fd;
|
unsigned n_server_fd;
|
||||||
|
|
||||||
|
bool syslog_is_stream;
|
||||||
|
|
||||||
LIST_HEAD(Stream, streams);
|
LIST_HEAD(Stream, streams);
|
||||||
unsigned n_streams;
|
unsigned n_streams;
|
||||||
} Server;
|
} Server;
|
||||||
@ -172,14 +174,28 @@ static int stream_log(Stream *s, char *p, usec_t ts) {
|
|||||||
IOVEC_SET_STRING(iovec[3], header_pid);
|
IOVEC_SET_STRING(iovec[3], header_pid);
|
||||||
IOVEC_SET_STRING(iovec[4], p);
|
IOVEC_SET_STRING(iovec[4], p);
|
||||||
|
|
||||||
|
/* When using syslog via SOCK_STREAM seperate the messages by NUL chars */
|
||||||
|
if (s->server->syslog_is_stream)
|
||||||
|
iovec[4].iov_len++;
|
||||||
|
|
||||||
zero(msghdr);
|
zero(msghdr);
|
||||||
msghdr.msg_iov = iovec;
|
msghdr.msg_iov = iovec;
|
||||||
msghdr.msg_iovlen = ELEMENTSOF(iovec);
|
msghdr.msg_iovlen = ELEMENTSOF(iovec);
|
||||||
msghdr.msg_control = &control;
|
msghdr.msg_control = &control;
|
||||||
msghdr.msg_controllen = control.cmsghdr.cmsg_len;
|
msghdr.msg_controllen = control.cmsghdr.cmsg_len;
|
||||||
|
|
||||||
if (sendmsg(s->server->syslog_fd, &msghdr, MSG_NOSIGNAL) < 0)
|
for (;;) {
|
||||||
return -errno;
|
ssize_t n;
|
||||||
|
|
||||||
|
if ((n = sendmsg(s->server->syslog_fd, &msghdr, MSG_NOSIGNAL)) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (!s->server->syslog_is_stream ||
|
||||||
|
(size_t) n >= IOVEC_TOTAL_SIZE(iovec, ELEMENTSOF(iovec)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
IOVEC_INCREMENT(iovec, ELEMENTSOF(iovec), n);
|
||||||
|
}
|
||||||
|
|
||||||
} else if (s->target == STREAM_KMSG) {
|
} else if (s->target == STREAM_KMSG) {
|
||||||
IOVEC_SET_STRING(iovec[1], s->process);
|
IOVEC_SET_STRING(iovec[1], s->process);
|
||||||
@ -479,21 +495,34 @@ static int server_init(Server *s, unsigned n_sockets) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zero(sa);
|
||||||
|
sa.un.sun_family = AF_UNIX;
|
||||||
|
strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
|
||||||
|
|
||||||
if ((s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
|
if ((s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
|
||||||
r = -errno;
|
r = -errno;
|
||||||
log_error("Failed to create log fd: %m");
|
log_error("Failed to create log fd: %m");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
zero(sa);
|
|
||||||
sa.un.sun_family = AF_UNIX;
|
|
||||||
strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
|
|
||||||
|
|
||||||
if (connect(s->syslog_fd, &sa.sa, sizeof(sa)) < 0) {
|
if (connect(s->syslog_fd, &sa.sa, sizeof(sa)) < 0) {
|
||||||
r = -errno;
|
close_nointr_nofail(s->syslog_fd);
|
||||||
log_error("Failed to connect log socket to /dev/log: %m");
|
|
||||||
goto fail;
|
if ((s->syslog_fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0)) < 0) {
|
||||||
}
|
r = -errno;
|
||||||
|
log_error("Failed to create log fd: %m");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connect(s->syslog_fd, &sa.sa, sizeof(sa)) < 0) {
|
||||||
|
r = -errno;
|
||||||
|
log_error("Failed to connect log socket to /dev/log: %m");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->syslog_is_stream = true;
|
||||||
|
} else
|
||||||
|
s->syslog_is_stream = false;
|
||||||
|
|
||||||
/* /dev/kmsg logging is strictly optional */
|
/* /dev/kmsg logging is strictly optional */
|
||||||
if ((s->kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0)
|
if ((s->kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user