diff options
author | Frantisek Tobias <frantisek.tobias@nic.cz> | 2024-09-02 14:20:30 +0200 |
---|---|---|
committer | Vladimír Čunát <vladimir.cunat@nic.cz> | 2024-12-02 09:41:14 +0100 |
commit | 7f53230fd68e06ce4ffaaae66c1777dfa3a1e690 (patch) | |
tree | 49eb930129a08579d24189b1e82aca25009587ad | |
parent | Merge !1633: daemon/worker: decrease log level of uv_udp_connect() failure (diff) | |
download | knot-resolver-7f53230fd68e06ce4ffaaae66c1777dfa3a1e690.tar.xz knot-resolver-7f53230fd68e06ce4ffaaae66c1777dfa3a1e690.zip |
daemon: add sd_notify alternative
This allows kresd to run even if libsystemd is not available.
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | daemon/main.c | 45 |
2 files changed, 46 insertions, 0 deletions
@@ -4,6 +4,7 @@ Knot Resolver 6.0.10 (202y-mm-dd) Improvements ------------ - avoid multiple log lines when IPv6 isn't available (!1633) +- manager: fix startup on Linux without libsystemd (!1608) Knot Resolver 6.0.9 (2024-11-11) diff --git a/daemon/main.c b/daemon/main.c index e89e2b01..a808ba20 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -38,6 +38,8 @@ #include <uv.h> #if ENABLE_LIBSYSTEMD #include <systemd/sd-daemon.h> +#else +static int notify_ready(const char *state); #endif #include <libknot/error.h> @@ -193,6 +195,8 @@ static int run_worker(uv_loop_t *loop, struct args *args) /* Notify supervisor. */ #if ENABLE_LIBSYSTEMD sd_notify(0, "READY=1"); +#else + notify_ready("READY=1"); #endif /* Run event loop */ uv_run(loop, UV_RUN_DEFAULT); @@ -382,6 +386,47 @@ static int start_listening(flagged_fd_array_t *fds) { return some_bad_ret; } +#if !ENABLE_LIBSYSTEMD +/* Notify supervisord about successful inicialization + * @note tested only on an abstract address in $NOTIFY_SOCKET*/ +static int notify_ready(const char *state) +{ + int sockfd; + struct sockaddr_un addr; + char *socket_path = getenv("NOTIFY_SOCKET"); + if (!socket_path) { + kr_log_error(WORKER, "Failed retrieving env variable $NOTIFY_SOCKET\n"); + return EXIT_FAILURE; + } + if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) { + kr_log_error(WORKER, "Failed to create unix socket at $NOTIFY_SOCKET ('%s'): %s\n", + socket_path, strerror(errno)); + return EXIT_FAILURE; + } + + addr.sun_family = AF_UNIX; + + int addrlen; + if (socket_path[0] == '@') { + addr.sun_path[0] = '\0'; + strncpy(&addr.sun_path[1], socket_path + 1, sizeof(addr.sun_path) - 2); + addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path + 1) + 1; + } else { + strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); + addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path) + 1; + } + if (sendto(sockfd, state, strlen(state), 0, &addr, addrlen) == -1) { + kr_log_error(WORKER, "Failed to send notify message to '%s': %s\n", + socket_path, strerror(errno)); + close(sockfd); + return EXIT_FAILURE; + } + + close(sockfd); + return kr_ok(); +} +#endif /* if !ENABLE_LIBSYSTEMD */ + /* Drop POSIX 1003.1e capabilities. */ static void drop_capabilities(void) { |