gpgconf: Add command --launch.
authorWerner Koch <wk@gnupg.org>
Tue, 8 Apr 2014 13:55:51 +0000 (15:55 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 8 Apr 2014 13:57:14 +0000 (15:57 +0200)
* tools/gpgconf.c: Add command --launch.
* tools/gpgconf-comp.c (gc_component_launch): New.

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/tools.texi
tools/gpgconf-comp.c
tools/gpgconf.c
tools/gpgconf.h

index 734d619..2a1d38f 100644 (file)
@@ -305,6 +305,14 @@ Reload all or the given component. This is basically the same as sending
 a SIGHUP to the component.  Components which don't support reloading are
 ignored.
 
+@item --launch [@var{component}]
+@opindex launch
+If the @var{component} is not already running, start it.
+@command{component} must be a daemon.  This is in general not required
+because the system starts these daemons as needed.  However, external
+software making direct use of @command{gpg-agent} or @command{dirmngr}
+may use this command to ensure that they are started.
+
 @item --kill [@var{component}]
 @opindex kill
 Kill the given component.  Components which support killing are
index 356b251..65c116b 100644 (file)
@@ -1108,6 +1108,44 @@ scdaemon_runtime_change (int killflag)
 }
 
 
+/* Launch the gpg-agent or the dirmngr if not already running.  */
+void
+gc_component_launch (int component)
+{
+  gpg_error_t err;
+  const char *pgmname;
+  const char *argv[3];
+  int i;
+  pid_t pid;
+
+  if (!(component == GC_COMPONENT_GPG_AGENT
+        || component == GC_COMPONENT_DIRMNGR))
+    {
+      es_fputs (_("Component not suitable for launching"), es_stderr);
+      es_putc ('\n', es_stderr);
+      exit (1);
+    }
+
+  pgmname = gnupg_module_name (GNUPG_MODULE_NAME_CONNECT_AGENT);
+  i = 0;
+  if (component == GC_COMPONENT_DIRMNGR)
+    argv[i++] = "--dirmngr";
+  argv[i++] = "NOP";
+  argv[i] = NULL;
+
+  err = gnupg_spawn_process_fd (pgmname, argv, -1, -1, -1, &pid);
+  if (!err)
+    err = gnupg_wait_process (pgmname, pid, 1, NULL);
+  if (err)
+    gc_error (0, 0, "error running '%s%s%s': %s",
+              pgmname,
+              component == GC_COMPONENT_DIRMNGR? " --dirmngr":"",
+              " NOP",
+              gpg_strerror (err));
+  gnupg_release_process (pid);
+}
+
+
 /* Unconditionally restart COMPONENT.  */
 void
 gc_component_kill (int component)
index fbce6d3..96313f6 100644 (file)
@@ -51,6 +51,7 @@ enum cmd_and_opt_values
     aListConfig,
     aCheckConfig,
     aListDirs,
+    aLaunch,
     aKill,
     aReload
   };
@@ -75,6 +76,7 @@ static ARGPARSE_OPTS opts[] =
     { aCheckConfig,   "check-config", 256,
       N_("check global configuration file") },
     { aReload,        "reload", 256, N_("reload all or a given component")},
+    { aLaunch,        "launch", 256, N_("launch a given component")},
     { aKill,          "kill", 256,   N_("kill a given component")},
 
     { 301, NULL, 0, N_("@\nOptions:\n ") },
@@ -184,6 +186,7 @@ main (int argc, char **argv)
         case aListConfig:
         case aCheckConfig:
         case aReload:
+        case aLaunch:
         case aKill:
          cmd = pargs.r_opt;
          break;
@@ -255,6 +258,7 @@ main (int argc, char **argv)
        }
       break;
 
+    case aLaunch:
     case aKill:
       if (!fname)
        {
@@ -266,7 +270,7 @@ main (int argc, char **argv)
        }
       else
         {
-          /* Kill a given component.  */
+          /* Launch/Kill a given component.  */
           int idx;
 
           idx = gc_component_find (fname);
@@ -276,10 +280,10 @@ main (int argc, char **argv)
               es_putc ('\n', es_stderr);
               exit (1);
             }
+          else if (cmd == aLaunch)
+            gc_component_launch (idx);
           else
-            {
-              gc_component_kill (idx);
-            }
+            gc_component_kill (idx);
         }
       break;
 
index 9caa0d4..0286c27 100644 (file)
@@ -44,6 +44,9 @@ char *gc_percent_escape (const char *src);
 
 void gc_error (int status, int errnum, const char *fmt, ...);
 
+/* Launch given component.  */
+void gc_component_launch (int component);
+
 /* Kill given component.  */
 void gc_component_kill (int component);