diff options
Diffstat (limited to 'p11-kit/server.c')
-rw-r--r-- | p11-kit/server.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/p11-kit/server.c b/p11-kit/server.c index e64890c..0c0092b 100644 --- a/p11-kit/server.c +++ b/p11-kit/server.c @@ -62,6 +62,10 @@ #include <sys/wait.h> #include <unistd.h> +#ifdef WITH_SYSTEMD +#include <systemd/sd-daemon.h> +#endif + #ifdef HAVE_SIGHANDLER_T #define SIGHANDLER_T sighandler_t #elif HAVE_SIG_T @@ -273,10 +277,16 @@ create_socket (const char *address, umask (066); rc = bind (sd, (struct sockaddr *)&sa, SUN_LEN (&sa)); if (rc == -1) { - p11_message_err (errno, "could not create socket %s", socket_file); + p11_message_err (errno, "could not bind socket %s", socket_file); return -1; } + rc = listen (sd, 1024); + if (rc == -1) { + p11_message_err (errno, "could not listen to socket %s", socket_file); + return 1; + } + if (uid != -1 && gid != -1) { rc = chown (socket_file, uid, gid); if (rc == -1) { @@ -356,7 +366,7 @@ server_loop (Server *server, bool foreground, struct timespec *timeout) { - int ret = 1, rc; + int ret; int cfd; pid_t pid; socklen_t sa_len; @@ -377,10 +387,6 @@ server_loop (Server *server, ocsignal (SIGTERM, handle_term); ocsignal (SIGINT, handle_term); - server->socket = create_socket (server->socket_name, server->uid, server->gid); - if (server->socket == -1) - return 1; - /* run as daemon */ if (!foreground) { pid = fork (); @@ -403,10 +409,19 @@ server_loop (Server *server, } } - rc = listen (server->socket, 1024); - if (rc == -1) { - p11_message_err (errno, "could not listen to socket %s", server->socket_name); +#ifdef WITH_SYSTEMD + ret = sd_listen_fds (0); + if (ret > 1) { + p11_message ("too many file descriptors received"); return 1; + } else if (ret == 1) { + server->socket = SD_LISTEN_FDS_START + 0; + } else +#endif + { + server->socket = create_socket (server->socket_name, server->uid, server->gid); + if (server->socket == -1) + return 1; } sigprocmask (SIG_BLOCK, &blockset, NULL); |