Skip to content

Commit

Permalink
Merge !1608: daemon: add sd_notify alternative
Browse files Browse the repository at this point in the history
  • Loading branch information
vcunat committed Dec 2, 2024
2 parents 15f37a8 + 7f53230 commit 1d53f52
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
45 changes: 45 additions & 0 deletions daemon/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 1d53f52

Please sign in to comment.