syslogd/sysklogd-1.4.1-systemd-multi.dif

174 lines
3.9 KiB
Plaintext

---
syslogd.c | 121 +++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 70 insertions(+), 51 deletions(-)
--- syslogd.c
+++ syslogd.c 2022-10-17 09:33:43.942759127 +0000
@@ -626,6 +626,9 @@ static volatile sig_atomic_t restart;
int nfunix = 1;
char *funixn[MAXFUNIX] = { _PATH_LOG };
int funix[MAXFUNIX] = { -1, };
+#if defined(__linux__)
+int sd_fds = 0;
+#endif
#ifdef UT_NAMESIZE
# define UNAMESZ UT_NAMESIZE /* length of a login name */
@@ -1047,12 +1050,44 @@ int main(argc, argv)
exit(1);
}
+ i = 0;
num_fds = getdtablesize();
#if defined(__linux__)
- if (sd_listen_fds(0) <= 0)
-#endif
- for (i = 0; i < num_fds; i++)
+ /* if (sd_booted()) */ {
+ const char *e;
+ char buf[24] = { '\0' };
+ char *p = NULL;
+ unsigned long l;
+
+ /* fork & systemd socket activation:
+ * fetch listen pid and update to ours,
+ * when it is set to pid of our parent.
+ */
+ if ( (e = getenv("LISTEN_PID"))) {
+ errno = 0;
+ l = strtoul(e, &p, 10);
+ if (errno == 0 && l > 0 && (!p || !*p)) {
+ if (getppid() == (pid_t)l) {
+ snprintf(buf, sizeof(buf), "%d",
+ getpid());
+ setenv("LISTEN_PID", buf, 1);
+ }
+ }
+ }
+
+ /*
+ * init sd_fds and close all fds, except
+ * of the fds provided by systemd.
+ */
+ sd_fds = sd_listen_fds(0);
+ for( ; i < SD_LISTEN_FDS_START; i++)
(void) close(i);
+ if (sd_fds > 0)
+ i = SD_LISTEN_FDS_START + sd_fds;
+ }
+#endif
+ for ( ; i < num_fds; i++)
+ (void) close(i);
untty();
break;
}
@@ -1094,6 +1129,11 @@ int main(argc, argv)
exit(1);
}
} /* if ( !Debug ) */
+#if defined(__linux__)
+ /* if (sd_booted()) */ {
+ sd_fds = sd_listen_fds(0);
+ }
+#endif
}
#endif
@@ -1367,54 +1407,30 @@ static int create_unix_socket(const char
return -1;
#if defined(__linux__)
- if (strcmp(path, _PATH_LOG) == 0) {
- int r;
-
- /* Check whether an FD was passed in from systemd. If
- * so, it's the /dev/log socket, so use it. */
-
- r = sd_listen_fds(0);
- if (r < 0) {
- logerror("Failed to acquire systemd socket");
+ /*
+ * Check whether an FD was passed in from systemd.
+ * If so and it matches this socket, so use it.
+ */
+ if (sd_fds < 0) {
+ logerror("Failed to acquire systemd socket");
#ifndef SYSV
- dienow();
+ dienow();
#else
- return -1;
+ return -1;
#endif
- }
+ }
-
- if (r > 1) {
- logerror("Wrong number of systemd sockets passed");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
- }
-
- if (r == 1) {
- fd = SD_LISTEN_FDS_START;
- r = sd_is_socket_unix(fd, SOCK_DGRAM, -1, _PATH_LOG, 0);
- if (r < 0) {
- logerror("Failed to verify systemd socket type");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
- }
-
- if (!r) {
- logerror("Passed systemd socket of wrong type");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
+ if (sd_fds > 0) {
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + sd_fds; fd++) {
+ if( sd_is_socket_unix(fd, SOCK_DGRAM, -1, path, 0) == 1) {
+ /* ok, it matches -- just use as is */
+ return fd;
}
-
- return fd;
+ /*
+ * otherwise it either didn't matched *this* socket and
+ * we just continue to check the next one or there were
+ * an error and we will recreate it bellow.
+ */
}
}
#endif
@@ -2537,14 +2553,17 @@ void dienow(void)
if (InetInuse) close(inetm);
/* Clean-up files. */
- i = 0;
+ for (i = 0; i < nfunix; i++) {
+ if (funixn[i] && funix[i] != -1) {
#if defined(__linux__)
- if (sd_listen_fds(0) > 0)
- i = 1;
+ if (sd_fds > 0 &&
+ funix[i] >= SD_LISTEN_FDS_START &&
+ funix[i] < SD_LISTEN_FDS_START + sd_fds)
+ continue;
#endif
- for (; i < nfunix; i++)
- if (funixn[i] && funix[i] != -1)
(void)unlink(funixn[i]);
+ }
+ }
for (lognum = 0; lognum <= nlogs; lognum++) {
f = &Files[lognum];