137 lines
4.4 KiB
Diff
137 lines
4.4 KiB
Diff
From: NIIBE Yutaka <gniibe@fsij.org>
|
|
Date: Wed, 23 Aug 2023 09:26:51 +0900
|
|
Subject: Add systemd support for keyboxd
|
|
|
|
diff --git a/kbx/keyboxd.c b/kbx/keyboxd.c
|
|
index 88a350a08..ee39b2287 100644
|
|
--- a/kbx/keyboxd.c
|
|
+++ b/kbx/keyboxd.c
|
|
@@ -88,6 +88,7 @@ enum cmd_and_opt_values
|
|
oLogFile,
|
|
oServer,
|
|
oDaemon,
|
|
+ oSupervised,
|
|
oFakedSystemTime,
|
|
oListenBacklog,
|
|
oDisableCheckOwnSocket,
|
|
@@ -104,6 +105,9 @@ static gpgrt_opt_t opts[] = {
|
|
|
|
ARGPARSE_s_n (oDaemon, "daemon", N_("run in daemon mode (background)")),
|
|
ARGPARSE_s_n (oServer, "server", N_("run in server mode (foreground)")),
|
|
+#ifndef HAVE_W32_SYSTEM
|
|
+ ARGPARSE_s_n (oSupervised, "supervised", "@"),
|
|
+#endif
|
|
ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")),
|
|
ARGPARSE_s_n (oStealSocket, "steal-socket", "@"),
|
|
ARGPARSE_s_s (oHomedir, "homedir", "@"),
|
|
@@ -209,6 +213,9 @@ static int have_homedir_inotify;
|
|
* reliable. */
|
|
static int reliable_homedir_inotify;
|
|
|
|
+/* Flag indicating that we are in supervised mode. */
|
|
+static int is_supervised;
|
|
+
|
|
/* Number of active connections. */
|
|
static int active_connections;
|
|
|
|
@@ -575,6 +582,7 @@ main (int argc, char **argv )
|
|
case oLogFile: logfile = pargs.r.ret_str; break;
|
|
case oServer: pipe_server = 1; break;
|
|
case oDaemon: is_daemon = 1; break;
|
|
+ case oSupervised: is_supervised = 1; break;
|
|
case oFakedSystemTime:
|
|
{
|
|
time_t faked_time = isotime2epoch (pargs.r.ret_str);
|
|
@@ -643,7 +651,7 @@ main (int argc, char **argv )
|
|
bind_textdomain_codeset (PACKAGE_GT, "UTF-8");
|
|
#endif
|
|
|
|
- if (!pipe_server && !is_daemon && !gpgconf_list)
|
|
+ if (!pipe_server && !is_daemon && !gpgconf_list && !is_supervised)
|
|
{
|
|
/* We have been called without any command and thus we merely
|
|
* check whether an instance of us is already running. We do
|
|
@@ -716,6 +724,73 @@ main (int argc, char **argv )
|
|
kbxd_deinit_default_ctrl (ctrl);
|
|
xfree (ctrl);
|
|
}
|
|
+ else if (is_supervised && comopt.no_autostart)
|
|
+ {
|
|
+ log_info ("%s %s not starting in supervised mode due to no-autostart.\n",
|
|
+ gpgrt_strusage(11), gpgrt_strusage(13) );
|
|
+ }
|
|
+ else if (is_supervised)
|
|
+ {
|
|
+#ifndef HAVE_W32_SYSTEM
|
|
+ struct stat statbuf;
|
|
+
|
|
+ inhibit_socket_removal = 1;
|
|
+
|
|
+ /* In supervised mode, we expect file descriptor 3 to be an
|
|
+ already opened, listening socket.
|
|
+
|
|
+ We will also not detach from the controlling process or close
|
|
+ stderr; the supervisor should handle all of that. */
|
|
+ if (fstat (3, &statbuf) == -1 && errno == EBADF)
|
|
+ {
|
|
+ log_error ("file descriptor 3 must be validin --supervised mode\n");
|
|
+ kbxd_exit (1);
|
|
+ }
|
|
+ socket_name = gnupg_get_socket_name (3);
|
|
+
|
|
+ /* when supervised and sending logs to stderr, the process
|
|
+ supervisor should handle log entry metadata (pid, name,
|
|
+ timestamp) */
|
|
+ if (!logfile)
|
|
+ log_set_prefix (NULL, 0);
|
|
+
|
|
+ initialize_modules ();
|
|
+
|
|
+ log_info ("%s %s starting in supervised mode.\n",
|
|
+ gpgrt_strusage(11), gpgrt_strusage(13) );
|
|
+
|
|
+#ifdef HAVE_SIGPROCMASK
|
|
+ if (startup_signal_mask_valid)
|
|
+ {
|
|
+ if (sigprocmask (SIG_SETMASK, &startup_signal_mask, NULL))
|
|
+ log_error ("error restoring signal mask: %s\n",
|
|
+ strerror (errno));
|
|
+ }
|
|
+ else
|
|
+ log_info ("no saved signal mask\n");
|
|
+#endif /*HAVE_SIGPROCMASK*/
|
|
+
|
|
+ {
|
|
+ ctrl_t ctrl;
|
|
+
|
|
+ ctrl = xtrycalloc (1, sizeof *ctrl);
|
|
+ if (!ctrl)
|
|
+ {
|
|
+ log_error ("error allocating connection control data: %s\n",
|
|
+ strerror (errno) );
|
|
+ kbxd_exit (1);
|
|
+ }
|
|
+ kbxd_init_default_ctrl (ctrl);
|
|
+ /* kbxd_set_database (ctrl, "pubring.kbx", 0); */
|
|
+ kbxd_set_database (ctrl, "pubring.db", 0);
|
|
+ kbxd_deinit_default_ctrl (ctrl);
|
|
+ xfree (ctrl);
|
|
+ }
|
|
+
|
|
+ handle_connections (3);
|
|
+ assuan_sock_close (3);
|
|
+#endif /*!HAVE_W32_SYSTEM*/
|
|
+ }
|
|
else if (!is_daemon)
|
|
; /* NOTREACHED */
|
|
else
|
|
@@ -1545,7 +1620,7 @@ handle_connections (gnupg_fd_t listen_fd)
|
|
/* Shutdown test. */
|
|
if (shutdown_pending)
|
|
{
|
|
- if (!active_connections)
|
|
+ if (!active_connections || is_supervised)
|
|
break; /* ready */
|
|
|
|
/* Do not accept new connections but keep on running the
|