common: Include required, but not included headers in t-support.h.
[gnupg.git] / g13 / server.c
index e9b9a0a..07b74f8 100644 (file)
 #include "mount.h"
 #include "create.h"
 
 #include "mount.h"
 #include "create.h"
 
+
+/* The filepointer for status message used in non-server mode */
+static FILE *statusfp;
+
 /* Local data for this server module.  A pointer to this is stored in
    the CTRL object of each connection.  */
 /* Local data for this server module.  A pointer to this is stored in
    the CTRL object of each connection.  */
-struct server_local_s 
+struct server_local_s
 {
   /* The Assuan contect we are working on.  */
   assuan_context_t assuan_ctx;
 {
   /* The Assuan contect we are working on.  */
   assuan_context_t assuan_ctx;
@@ -55,7 +59,7 @@ static int command_has_option (const char *cmd, const char *cmdopt);
 
 \f
 /*
 
 \f
 /*
-   Helper functions. 
+   Helper functions.
  */
 
 /* Set an error and a description.  */
  */
 
 /* Set an error and a description.  */
@@ -180,11 +184,13 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
 
 
 /* The handler for an Assuan RESET command.  */
 
 
 /* The handler for an Assuan RESET command.  */
-static void
-reset_notify (assuan_context_t ctx)
+static gpg_error_t
+reset_notify (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
 
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
 
+  (void)line;
+
   xfree (ctrl->server_local->containername);
   ctrl->server_local->containername = NULL;
 
   xfree (ctrl->server_local->containername);
   ctrl->server_local->containername = NULL;
 
@@ -192,19 +198,19 @@ reset_notify (assuan_context_t ctx)
 
   assuan_close_input_fd (ctx);
   assuan_close_output_fd (ctx);
 
   assuan_close_input_fd (ctx);
   assuan_close_output_fd (ctx);
+  return 0;
 }
 
 
 }
 
 
-
-/* OPEN [options] <filename>
-
-   Open the container FILENAME.  FILENAME must be percent-plus
-   escaped.  A quick check to see whether this is a suitable G13
-   container file is done.  However no cryptographic check or any
-   other check is done.  This command is used to define the target for
-   further commands.  The filename is reset with the RESET command,
-   another OPEN or the CREATE command.
- */
+static const char hlp_open[] =
+  "OPEN [<options>] <filename>\n"
+  "\n"
+  "Open the container FILENAME.  FILENAME must be percent-plus\n"
+  "escaped.  A quick check to see whether this is a suitable G13\n"
+  "container file is done.  However no cryptographic check or any\n"
+  "other check is done.  This command is used to define the target for\n"
+  "further commands.  The filename is reset with the RESET command,\n"
+  "another OPEN or the CREATE command.";
 static gpg_error_t
 cmd_open (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_open (assuan_context_t ctx, char *line)
 {
@@ -249,19 +255,19 @@ cmd_open (assuan_context_t ctx, char *line)
   ctrl->server_local->containername = xtrystrdup (line);
   if (!ctrl->server_local->containername)
     err = gpg_error_from_syserror ();
   ctrl->server_local->containername = xtrystrdup (line);
   if (!ctrl->server_local->containername)
     err = gpg_error_from_syserror ();
-  
-  
+
+
  leave:
   return leave_cmd (ctx, err);
 }
 
 
  leave:
   return leave_cmd (ctx, err);
 }
 
 
-/* MOUNT [options] [<mountpoint>]
-
-   Mount the currently open file onto MOUNTPOINT.  If MOUNTPOINT is
-   not given the system picks an unused mountpoint.  MOUNTPOINT must
-   be percent-plus escaped to allow for arbitrary names.
- */
+static const char hlp_mount[] =
+  "MOUNT [options] [<mountpoint>]\n"
+  "\n"
+  "Mount the currently open file onto MOUNTPOINT.  If MOUNTPOINT is not\n"
+  "given the system picks an unused mountpoint.  MOUNTPOINT must\n"
+  "be percent-plus escaped to allow for arbitrary names.";
 static gpg_error_t
 cmd_mount (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_mount (assuan_context_t ctx, char *line)
 {
@@ -299,7 +305,7 @@ cmd_mount (assuan_context_t ctx, char *line)
     }
 
   /* Perform the mount.  */
     }
 
   /* Perform the mount.  */
-  err = g13_mount_container (ctrl, ctrl->server_local->containername, 
+  err = g13_mount_container (ctrl, ctrl->server_local->containername,
                              *line? line : NULL);
 
  leave:
                              *line? line : NULL);
 
  leave:
@@ -307,11 +313,12 @@ cmd_mount (assuan_context_t ctx, char *line)
 }
 
 
 }
 
 
-/* UMOUNT [options] [<mountpoint>]
-
-   Unmount the currently open file or the one opened at MOUNTPOINT.
-   MOUNTPOINT must be percent-plus escaped.
- */
+static const char hlp_umount[] =
+  "UMOUNT [options] [<mountpoint>]\n"
+  "\n"
+  "Unmount the currently open file or the one opened at MOUNTPOINT.\n"
+  "MOUNTPOINT must be percent-plus escaped.  On success the mountpoint\n"
+  "is returned via a \"MOUNTPOINT\" status line.";
 static gpg_error_t
 cmd_umount (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_umount (assuan_context_t ctx, char *line)
 {
@@ -343,7 +350,7 @@ cmd_umount (assuan_context_t ctx, char *line)
     }
 
   /* Perform the unmount.  */
     }
 
   /* Perform the unmount.  */
-  err = g13_umount_container (ctrl, ctrl->server_local->containername, 
+  err = g13_umount_container (ctrl, ctrl->server_local->containername,
                               *line? line : NULL);
 
  leave:
                               *line? line : NULL);
 
  leave:
@@ -351,13 +358,12 @@ cmd_umount (assuan_context_t ctx, char *line)
 }
 
 
 }
 
 
-
-/* RECIPIENT <userID>
-
-   FIXME - description. 
-   All RECIPIENT commands are cumulative until a RESET or an
-   successful CREATE command.
- */
+static const char hlp_recipient[] =
+  "RECIPIENT <userID>\n"
+  "\n"
+  "Add USERID to the list of recipients to be used for the next CREATE\n"
+  "command.  All recipient commands are cumulative until a RESET or an\n"
+  "successful create command.";
 static gpg_error_t
 cmd_recipient (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_recipient (assuan_context_t ctx, char *line)
 {
@@ -373,10 +379,10 @@ cmd_recipient (assuan_context_t ctx, char *line)
 }
 
 
 }
 
 
-/* SIGNER <userID>
-
-   FIXME - description. 
- */
+static const char hlp_signer[] =
+  "SIGNER <userID>\n"
+  "\n"
+  "Not yet implemented.";
 static gpg_error_t
 cmd_signer (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_signer (assuan_context_t ctx, char *line)
 {
@@ -391,11 +397,11 @@ cmd_signer (assuan_context_t ctx, char *line)
 }
 
 
 }
 
 
-/* CREATE [options] filename
-
-   Create a new container.  On success the OPEN command is done
-   implictly for the new container.
- */
+static const char hlp_create[] =
+  "CREATE [options] <filename>\n"
+  "\n"
+  "Create a new container.  On success the OPEN command is \n"
+  "implictly done for the new container.";
 static gpg_error_t
 cmd_create (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_create (assuan_context_t ctx, char *line)
 {
@@ -437,7 +443,7 @@ cmd_create (assuan_context_t ctx, char *line)
   if (!err)
     {
       FREE_STRLIST (ctrl->server_local->recipients);
   if (!err)
     {
       FREE_STRLIST (ctrl->server_local->recipients);
-  
+
       /* Store the filename.  */
       ctrl->server_local->containername = xtrystrdup (line);
       if (!ctrl->server_local->containername)
       /* Store the filename.  */
       ctrl->server_local->containername = xtrystrdup (line);
       if (!ctrl->server_local->containername)
@@ -449,17 +455,16 @@ cmd_create (assuan_context_t ctx, char *line)
 }
 
 
 }
 
 
-/* GETINFO <what>
-
-   Multipurpose function to return a variety of information.
-   Supported values for WHAT are:
-
-     version     - Return the version of the program.
-     pid         - Return the process id of the server.
-     cmd_has_option CMD OPT
-                 - Returns OK if the command CMD implements the option OPT.
-
- */
+static const char hlp_getinfo[] =
+  "GETINFO <what>\n"
+  "\n"
+  "Multipurpose function to return a variety of information.\n"
+  "Supported values for WHAT are:\n"
+  "\n"
+  "  version     - Return the version of the program.\n"
+  "  pid         - Return the process id of the server.\n"
+  "  cmd_has_option CMD OPT\n"
+  "              - Return OK if the command CMD implements the option OPT.";
 static gpg_error_t
 cmd_getinfo (assuan_context_t ctx, char *line)
 {
 static gpg_error_t
 cmd_getinfo (assuan_context_t ctx, char *line)
 {
@@ -523,7 +528,7 @@ command_has_option (const char *cmd, const char *cmdopt)
 {
   (void)cmd;
   (void)cmdopt;
 {
   (void)cmd;
   (void)cmdopt;
-      
+
   return 0;
 }
 
   return 0;
 }
 
@@ -534,17 +539,18 @@ register_commands (assuan_context_t ctx)
 {
   static struct {
     const char *name;
 {
   static struct {
     const char *name;
-    gpg_error_t (*handler)(assuan_context_t, char *line);
+    assuan_handler_t handler;
+    const char * const help;
   } table[] =  {
   } table[] =  {
-    { "OPEN",          cmd_open },
-    { "MOUNT",         cmd_mount },
-    { "UMOUNT",        cmd_umount },
-    { "RECIPIENT",     cmd_recipient },
-    { "SIGNER",        cmd_signer },
-    { "CREATE",        cmd_create },
-    { "INPUT",         NULL }, 
-    { "OUTPUT",        NULL }, 
-    { "GETINFO",       cmd_getinfo },
+    { "OPEN",          cmd_open,   hlp_open },
+    { "MOUNT",         cmd_mount,  hlp_mount},
+    { "UMOUNT",        cmd_umount, hlp_umount },
+    { "RECIPIENT",     cmd_recipient, hlp_recipient },
+    { "SIGNER",        cmd_signer, hlp_signer },
+    { "CREATE",        cmd_create, hlp_create },
+    { "INPUT",         NULL },
+    { "OUTPUT",        NULL },
+    { "GETINFO",       cmd_getinfo,hlp_getinfo },
     { NULL }
   };
   gpg_error_t err;
     { NULL }
   };
   gpg_error_t err;
@@ -552,10 +558,11 @@ register_commands (assuan_context_t ctx)
 
   for (i=0; table[i].name; i++)
     {
 
   for (i=0; table[i].name; i++)
     {
-      err = assuan_register_command (ctx, table[i].name, table[i].handler);
+      err = assuan_register_command (ctx, table[i].name, table[i].handler,
+                                     table[i].help);
       if (err)
         return err;
       if (err)
         return err;
-    } 
+    }
   return 0;
 }
 
   return 0;
 }
 
@@ -567,7 +574,7 @@ gpg_error_t
 g13_server (ctrl_t ctrl)
 {
   gpg_error_t err;
 g13_server (ctrl_t ctrl)
 {
   gpg_error_t err;
-  int filedes[2];
+  assuan_fd_t filedes[2];
   assuan_context_t ctx = NULL;
   static const char hello[] = ("GNU Privacy Guard's G13 server "
                                PACKAGE_VERSION " ready");
   assuan_context_t ctx = NULL;
   static const char hello[] = ("GNU Privacy Guard's G13 server "
                                PACKAGE_VERSION " ready");
@@ -575,8 +582,8 @@ g13_server (ctrl_t ctrl)
   /* We use a pipe based server so that we can work from scripts.
      assuan_init_pipe_server will automagically detect when we are
      called with a socketpair and ignore FIELDES in this case. */
   /* We use a pipe based server so that we can work from scripts.
      assuan_init_pipe_server will automagically detect when we are
      called with a socketpair and ignore FIELDES in this case. */
-  filedes[0] = 0;
-  filedes[1] = 1;
+  filedes[0] = assuan_fdopen (0);
+  filedes[1] = assuan_fdopen (1);
   err = assuan_new (&ctx);
   if (err)
     {
   err = assuan_new (&ctx);
   if (err)
     {
@@ -605,15 +612,12 @@ g13_server (ctrl_t ctrl)
   if (opt.verbose || opt.debug)
     {
       char *tmp = NULL;
   if (opt.verbose || opt.debug)
     {
       char *tmp = NULL;
-      const char *s1 = getenv ("GPG_AGENT_INFO");
 
       tmp = xtryasprintf ("Home: %s\n"
                           "Config: %s\n"
 
       tmp = xtryasprintf ("Home: %s\n"
                           "Config: %s\n"
-                          "AgentInfo: %s\n"
                           "%s",
                           opt.homedir,
                           opt.config_filename,
                           "%s",
                           opt.homedir,
                           opt.config_filename,
-                          s1?s1:"[not set]",
                           hello);
       if (tmp)
         {
                           hello);
       if (tmp)
         {
@@ -635,9 +639,6 @@ g13_server (ctrl_t ctrl)
     }
   ctrl->server_local->assuan_ctx = ctx;
 
     }
   ctrl->server_local->assuan_ctx = ctx;
 
-  if (DBG_ASSUAN)
-    assuan_set_log_stream (ctx, log_get_stream ());
-
   while ( !(err = assuan_accept (ctx)) )
     {
       err = assuan_process (ctx);
   while ( !(err = assuan_accept (ctx)) )
     {
       err = assuan_process (ctx);
@@ -648,9 +649,9 @@ g13_server (ctrl_t ctrl)
     err = 0;
   else
     log_info ("Assuan accept problem: %s\n", gpg_strerror (err));
     err = 0;
   else
     log_info ("Assuan accept problem: %s\n", gpg_strerror (err));
-  
+
  leave:
  leave:
-  reset_notify (ctx);  /* Release all items hold by SERVER_LOCAL.  */
+  reset_notify (ctx, NULL);  /* Release all items hold by SERVER_LOCAL.  */
   if (ctrl->server_local)
     {
       xfree (ctrl->server_local);
   if (ctrl->server_local)
     {
       xfree (ctrl->server_local);
@@ -662,99 +663,81 @@ g13_server (ctrl_t ctrl)
 }
 
 
 }
 
 
+/* Send a status line with status ID NO.  The arguments are a list of
+   strings terminated by a NULL argument.  */
+gpg_error_t
+g13_status (ctrl_t ctrl, int no, ...)
+{
+  gpg_error_t err = 0;
+  va_list arg_ptr;
+  const char *text;
+
+  va_start (arg_ptr, no);
+
+  if (ctrl->no_server && ctrl->status_fd == -1)
+    ; /* No status wanted. */
+  else if (ctrl->no_server)
+    {
+      if (!statusfp)
+        {
+          if (ctrl->status_fd == 1)
+            statusfp = stdout;
+          else if (ctrl->status_fd == 2)
+            statusfp = stderr;
+          else
+            statusfp = fdopen (ctrl->status_fd, "w");
 
 
-/* gpg_error_t */
-/* gpgsm_status2 (ctrl_t ctrl, int no, ...) */
-/* { */
-/*   gpg_error_t err = 0; */
-/*   va_list arg_ptr; */
-/*   const char *text; */
-
-/*   va_start (arg_ptr, no); */
-
-/*   if (ctrl->no_server && ctrl->status_fd == -1) */
-/*     ; /\* No status wanted. *\/ */
-/*   else if (ctrl->no_server) */
-/*     { */
-/*       if (!statusfp) */
-/*         { */
-/*           if (ctrl->status_fd == 1) */
-/*             statusfp = stdout; */
-/*           else if (ctrl->status_fd == 2) */
-/*             statusfp = stderr; */
-/*           else */
-/*             statusfp = fdopen (ctrl->status_fd, "w"); */
-      
-/*           if (!statusfp) */
-/*             { */
-/*               log_fatal ("can't open fd %d for status output: %s\n", */
-/*                          ctrl->status_fd, strerror(errno)); */
-/*             } */
-/*         } */
-      
-/*       fputs ("[GNUPG:] ", statusfp); */
-/*       fputs (get_status_string (no), statusfp); */
-    
-/*       while ( (text = va_arg (arg_ptr, const char*) )) */
-/*         { */
-/*           putc ( ' ', statusfp ); */
-/*           for (; *text; text++)  */
-/*             { */
-/*               if (*text == '\n') */
-/*                 fputs ( "\\n", statusfp ); */
-/*               else if (*text == '\r') */
-/*                 fputs ( "\\r", statusfp ); */
-/*               else  */
-/*                 putc ( *(const byte *)text,  statusfp ); */
-/*             } */
-/*         } */
-/*       putc ('\n', statusfp); */
-/*       fflush (statusfp); */
-/*     } */
-/*   else  */
-/*     { */
-/*       assuan_context_t ctx = ctrl->server_local->assuan_ctx; */
-/*       char buf[950], *p; */
-/*       size_t n; */
-
-/*       p = buf;  */
-/*       n = 0; */
-/*       while ( (text = va_arg (arg_ptr, const char *)) ) */
-/*         { */
-/*           if (n) */
-/*             { */
-/*               *p++ = ' '; */
-/*               n++; */
-/*             } */
-/*           for ( ; *text && n < DIM (buf)-2; n++) */
-/*             *p++ = *text++; */
-/*         } */
-/*       *p = 0; */
-/*       err = assuan_write_status (ctx, get_status_string (no), buf); */
-/*     } */
-
-/*   va_end (arg_ptr); */
-/*   return err; */
-/* } */
+          if (!statusfp)
+            {
+              log_fatal ("can't open fd %d for status output: %s\n",
+                         ctrl->status_fd, strerror(errno));
+            }
+        }
 
 
-/* gpg_error_t */
-/* gpgsm_status (ctrl_t ctrl, int no, const char *text) */
-/* { */
-/*   return gpgsm_status2 (ctrl, no, text, NULL); */
-/* } */
+      fputs ("[GNUPG:] ", statusfp);
+      fputs (get_status_string (no), statusfp);
 
 
-/* gpg_error_t */
-/* gpgsm_status_with_err_code (ctrl_t ctrl, int no, const char *text, */
-/*                             gpg_err_code_t ec) */
-/* { */
-/*   char buf[30]; */
+      while ( (text = va_arg (arg_ptr, const char*) ))
+        {
+          putc ( ' ', statusfp );
+          for (; *text; text++)
+            {
+              if (*text == '\n')
+                fputs ( "\\n", statusfp );
+              else if (*text == '\r')
+                fputs ( "\\r", statusfp );
+              else
+                putc ( *(const byte *)text,  statusfp );
+            }
+        }
+      putc ('\n', statusfp);
+      fflush (statusfp);
+    }
+  else
+    {
+      assuan_context_t ctx = ctrl->server_local->assuan_ctx;
+      char buf[950], *p;
+      size_t n;
 
 
-/*   sprintf (buf, "%u", (unsigned int)ec); */
-/*   if (text) */
-/*     return gpgsm_status2 (ctrl, no, text, buf, NULL); */
-/*   else */
-/*     return gpgsm_status2 (ctrl, no, buf, NULL); */
-/* } */
+      p = buf;
+      n = 0;
+      while ( (text = va_arg (arg_ptr, const char *)) )
+        {
+          if (n)
+            {
+              *p++ = ' ';
+              n++;
+            }
+          for ( ; *text && n < DIM (buf)-2; n++)
+            *p++ = *text++;
+        }
+      *p = 0;
+      err = assuan_write_status (ctx, get_status_string (no), buf);
+    }
+
+  va_end (arg_ptr);
+  return err;
+}
 
 
 /* Helper to notify the client about Pinentry events.  Returns an gpg
 
 
 /* Helper to notify the client about Pinentry events.  Returns an gpg
@@ -766,7 +749,3 @@ g13_proxy_pinentry_notify (ctrl_t ctrl, const unsigned char *line)
     return 0;
   return assuan_inquire (ctrl->server_local->assuan_ctx, line, NULL, NULL, 0);
 }
     return 0;
   return assuan_inquire (ctrl->server_local->assuan_ctx, line, NULL, NULL, 0);
 }
-
-
-
-