mirror of
https://github.com/troglobit/finit.git
synced 2026-10-25 12:04:36 +00:00
libsystemd: new library, refactor sd-daemon.[ch] test code
This commit introduces a bare-bones replacement for libsystemd: - Build .so file and add --with-libsystemd to configure - Add capabilities support to test/src/serv.c - Update tests to account for a Finit built w/o libsystemd support Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
12 files changed
+100
-13
No files matched your search
+1
-1
@@ -1,5 +1,5 @@
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
|
||||
/.libs/
|
||||
/.deps/
|
||||
/serv
|
||||
@@ -1,4 +1,8 @@
|
||||
noinst_PROGRAMS = serv
|
||||
|
||||
serv_SOURCES = serv.c sd-daemon.c sd-daemon.h
|
||||
serv_CPPFLAGS = -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_GNU_SOURCE -D_DEFAULT_SOURCE
|
||||
serv_SOURCES = serv.c
|
||||
serv_CPPFLAGS = -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_GNU_SOURCE -D_DEFAULT_SOURCE -I$(top_builddir)
|
||||
if LIBSYSTEMD
|
||||
serv_CPPFLAGS += -I$(top_srcdir)/libsystemd
|
||||
serv_SOURCES += $(top_srcdir)/libsystemd/sd-daemon.c
|
||||
endif
|
||||
@@ -1,84 +0,0 @@
|
||||
/* SPDX-License-Identifier: MIT-0 */
|
||||
|
||||
/*
|
||||
* systemd notify protocol, supporting readiness notification on startup
|
||||
* and reloading, according to the protocol defined at:
|
||||
* https://www.freedesktop.org/software/systemd/man/latest/sd_notify.html
|
||||
*
|
||||
* This protocol is guaranteed to be stable as per:
|
||||
* https://systemd.io/PORTABILITY_AND_STABILITY/
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE 1
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* NOTE: As per spec., this function does not return POSIX OK(0) but
|
||||
* rather "a positive value", i.e., 1.
|
||||
*/
|
||||
int sd_notify(int unset_environment, const char *state)
|
||||
{
|
||||
struct sockaddr_un sun = {
|
||||
.sun_family = AF_UNIX,
|
||||
};
|
||||
size_t len, sun_len;
|
||||
const char *path;
|
||||
ssize_t written;
|
||||
int sd;
|
||||
|
||||
if (!state)
|
||||
return -EINVAL;
|
||||
|
||||
len = strlen(state);
|
||||
if (len == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* If the variable is not set, the protocol is a noop */
|
||||
path = getenv("NOTIFY_SOCKET");
|
||||
if (!path)
|
||||
return 0; /* Not set? Nothing to do */
|
||||
|
||||
/* Only AF_UNIX is supported, with path or abstract sockets */
|
||||
if (path[0] != '/' && path[0] != '@')
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
/* Ensure there is room for NUL byte */
|
||||
sun_len = strlen(path);
|
||||
if (sun_len >= sizeof(sun.sun_path))
|
||||
return -E2BIG;
|
||||
|
||||
strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
|
||||
if (sun.sun_path[0] == '@')
|
||||
sun.sun_path[0] = 0;
|
||||
|
||||
sd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
|
||||
if (sd == -1)
|
||||
return -errno;
|
||||
|
||||
if (connect(sd, (struct sockaddr *)&sun, offsetof(struct sockaddr_un, sun_path) + sun_len) == -1) {
|
||||
close(sd);
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if (unset_environment)
|
||||
unsetenv("NOTIFY_SOCKET");
|
||||
|
||||
written = write(sd, state, len);
|
||||
if (written != (ssize_t) len) {
|
||||
close(sd);
|
||||
return written < 0 ? -errno : -EPROTO;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef SD_DAEMON_H_
|
||||
#define SD_DAEMON_H_
|
||||
|
||||
int sd_notify(int unset_environment, const char *state);
|
||||
|
||||
#endif /* SD_DAEMON_H_ */
|
||||
+24
-1
@@ -5,6 +5,10 @@
|
||||
* in foregrund it does not create a PID file by default.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <paths.h>
|
||||
@@ -16,7 +20,9 @@
|
||||
#include <sysexits.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
#include "sd-daemon.h"
|
||||
#endif
|
||||
|
||||
#define PROGNM "serv"
|
||||
|
||||
@@ -146,6 +152,16 @@ static void pidfile(char *pidfn)
|
||||
}
|
||||
}
|
||||
|
||||
static int capabilities(void)
|
||||
{
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
puts("libsystemd");
|
||||
#endif
|
||||
puts("s6");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int usage(int rc)
|
||||
{
|
||||
FILE *fp = rc ? stderr : stdout;
|
||||
@@ -153,6 +169,7 @@ static int usage(int rc)
|
||||
fprintf(fp,
|
||||
"%s [-nhp] [-P FILE]\n"
|
||||
"\n"
|
||||
" -C Show capabilities and exit\n"
|
||||
" -c Crash (exit) immediately\n"
|
||||
" -e K:V Verify K environment variable is V value\n"
|
||||
" -E K Verify K is not set in the environment\n"
|
||||
@@ -195,11 +212,13 @@ int main(int argc, char *argv[])
|
||||
char cmd[80];
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "ce:E:f:F:hi:nN:pP:r:")) != EOF) {
|
||||
while ((c = getopt(argc, argv, "cCe:E:f:F:hi:nN:pP:r:")) != EOF) {
|
||||
switch (c) {
|
||||
case 'c':
|
||||
do_crash = 1;
|
||||
break;
|
||||
case 'C':
|
||||
return capabilities();
|
||||
case 'e':
|
||||
verify_env(optarg);
|
||||
break;
|
||||
@@ -295,11 +314,15 @@ int main(int argc, char *argv[])
|
||||
err(1, "Failed closing notify socket");
|
||||
do_notify = 0;
|
||||
} else {
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
int rc;
|
||||
|
||||
inf("Notifying Finit on NOTIFY_SOCKET");
|
||||
rc = sd_notify(0, "READY=1");
|
||||
inf("sd_notify () => %d", rc);
|
||||
#else
|
||||
inf("Skipping systemd notify - built without libsystemd support");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (do_pidfile > 0)
|
||||
|
||||
Reference in new issue
Block a user