summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrantisek Tobias <frantisek.tobias@nic.cz>2024-09-02 14:20:30 +0200
committerVladimír Čunát <vladimir.cunat@nic.cz>2024-12-02 09:41:14 +0100
commit7f53230fd68e06ce4ffaaae66c1777dfa3a1e690 (patch)
tree49eb930129a08579d24189b1e82aca25009587ad
parentMerge !1633: daemon/worker: decrease log level of uv_udp_connect() failure (diff)
downloadknot-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--NEWS1
-rw-r--r--daemon/main.c45
2 files changed, 46 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 6b86a803..57795d02 100644
--- a/NEWS
+++ b/NEWS
@@ -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)
{