Allow for default algorithms in a parameter file
[gnupg.git] / g10 / server.c
index a5793c7..d0e801b 100644 (file)
@@ -1,5 +1,5 @@
 /* server.c - server mode for gpg
- * Copyright (C) 2006  Free Software Foundation, Inc.
+ * Copyright (C) 2006, 2008  Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -32,7 +32,7 @@
 #include "util.h"
 #include "i18n.h"
 #include "options.h"
-
+#include "../common/sysutils.h"
 
 
 #define set_error(e,t) assuan_set_error (ctx, gpg_error (e), (t))
@@ -44,7 +44,7 @@ struct server_local_s
   /* Our current Assuan context. */
   assuan_context_t assuan_ctx;  
   /* File descriptor as set by the MESSAGE command. */
-  int message_fd;               
+  gnupg_fd_t message_fd;               
 };
 
 
@@ -53,10 +53,10 @@ struct server_local_s
 static void 
 close_message_fd (ctrl_t ctrl)
 {
-  if (ctrl->server_local->message_fd != -1)
+  if (ctrl->server_local->message_fd != GNUPG_INVALID_FD)
     {
-      close (ctrl->server_local->message_fd);
-      ctrl->server_local->message_fd = -1;
+      assuan_sock_close (ctrl->server_local->message_fd);
+      ctrl->server_local->message_fd = GNUPG_INVALID_FD;
     } 
 }
 
@@ -69,6 +69,9 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
 {
 /*   ctrl_t ctrl = assuan_get_pointer (ctx); */
 
+  (void)ctx;
+  (void)value;
+
   /* Fixme: Implement the tty and locale args. */
   if (!strcmp (key, "display"))
     {
@@ -85,6 +88,12 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
   else if (!strcmp (key, "lc-messages"))
     {
     }
+  else if (!strcmp (key, "xauthority"))
+    {
+    }
+  else if (!strcmp (key, "pinentry_user_data"))
+    {
+    }
   else if (!strcmp (key, "list-mode"))
     {
       /* This is for now a dummy option. */
@@ -114,6 +123,8 @@ input_notify (assuan_context_t ctx, const char *line)
 {
 /*   ctrl_t ctrl = assuan_get_pointer (ctx); */
 
+  (void)ctx;
+
   if (strstr (line, "--armor"))
     ; /* FIXME */
   else if (strstr (line, "--base64"))
@@ -121,7 +132,9 @@ input_notify (assuan_context_t ctx, const char *line)
   else if (strstr (line, "--binary"))
     ;
   else
-    ; /* FIXME (autodetect encoding) */
+    {
+      /* FIXME (autodetect encoding) */
+    }
 }
 
 
@@ -130,11 +143,15 @@ static void
 output_notify (assuan_context_t ctx, const char *line)
 {
 /*   ctrl_t ctrl = assuan_get_pointer (ctx); */
+  
+  (void)ctx;
 
   if (strstr (line, "--armor"))
     ; /* FIXME */
   else if (strstr (line, "--base64"))
-    ; /* FIXME */
+    {
+      /* FIXME */
+    }
 }
 
 
@@ -154,6 +171,8 @@ output_notify (assuan_context_t ctx, const char *line)
 static int 
 cmd_recipient (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -177,6 +196,8 @@ cmd_recipient (assuan_context_t ctx, char *line)
 static int 
 cmd_signer (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -198,6 +219,8 @@ cmd_signer (assuan_context_t ctx, char *line)
 static int 
 cmd_encrypt (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -210,6 +233,8 @@ cmd_encrypt (assuan_context_t ctx, char *line)
 static int 
 cmd_decrypt (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -229,27 +254,30 @@ cmd_verify (assuan_context_t ctx, char *line)
 {
   int rc;
   ctrl_t ctrl = assuan_get_pointer (ctx);
-  int fd = assuan_get_input_fd (ctx);
-  int out_fd = assuan_get_output_fd (ctx);
+  gnupg_fd_t fd = assuan_get_input_fd (ctx);
+  gnupg_fd_t out_fd = assuan_get_output_fd (ctx);
   FILE *out_fp = NULL;
 
-  if (fd == -1)
+  (void)line;
+
+  if (fd == GNUPG_INVALID_FD)
     return gpg_error (GPG_ERR_ASS_NO_INPUT);
 
-  if (out_fd != -1)
+  if (out_fd != GNUPG_INVALID_FD)
     {
-      out_fp = fdopen ( dup(out_fd), "w");
+      out_fp = fdopen ( dup (FD2INT (out_fd)), "w");
       if (!out_fp)
         return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
     }
 
-  log_debug ("WARNING: The server mode work in progress and not ready for use\n");
+  log_debug ("WARNING: The server mode work "
+             "in progress and not ready for use\n");
 
   /* Need to dup it because it might get closed and libassuan won't
      know about it then. */
   rc = gpg_verify (ctrl,
-                   dup (fd), 
-                   dup (ctrl->server_local->message_fd),
+                   dup ( FD2INT (fd)), 
+                   dup ( FD2INT (ctrl->server_local->message_fd)),
                    out_fp);
 
   if (out_fp)
@@ -271,6 +299,8 @@ cmd_verify (assuan_context_t ctx, char *line)
 static int 
 cmd_sign (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -283,6 +313,8 @@ cmd_sign (assuan_context_t ctx, char *line)
 static int 
 cmd_import (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -301,6 +333,8 @@ cmd_import (assuan_context_t ctx, char *line)
 static int 
 cmd_export (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -313,6 +347,8 @@ cmd_export (assuan_context_t ctx, char *line)
 static int 
 cmd_delkeys (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -326,13 +362,13 @@ static int
 cmd_message (assuan_context_t ctx, char *line)
 {
   int rc;
-  int fd;
+  gnupg_fd_t fd;
   ctrl_t ctrl = assuan_get_pointer (ctx);
 
   rc = assuan_command_parse_fd (ctx, line, &fd);
   if (rc)
     return rc;
-  if (fd == -1)
+  if (fd == GNUPG_INVALID_FD)
     return gpg_error (GPG_ERR_ASS_NO_INPUT);
   ctrl->server_local->message_fd = fd;
   return 0;
@@ -348,6 +384,10 @@ cmd_message (assuan_context_t ctx, char *line)
 static int 
 do_listkeys (assuan_context_t ctx, char *line, int mode)
 {
+  (void)ctx;
+  (void)line;
+  (void)mode;
+
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
@@ -375,11 +415,42 @@ cmd_listsecretkeys (assuan_context_t ctx, char *line)
 static int 
 cmd_genkey (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
   return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
 
 
+/* 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.
+
+ */
+static int
+cmd_getinfo (assuan_context_t ctx, char *line)
+{
+  int rc;
+
+  if (!strcmp (line, "version"))
+    {
+      const char *s = VERSION;
+      rc = assuan_send_data (ctx, s, strlen (s));
+    }
+  else if (!strcmp (line, "pid"))
+    {
+      char numbuf[50];
+
+      snprintf (numbuf, sizeof numbuf, "%lu", (unsigned long)getpid ());
+      rc = assuan_send_data (ctx, numbuf, strlen (numbuf));
+    }
+  else
+    rc = set_error (GPG_ERR_ASS_PARAMETER, "unknown value for WHAT");
+  return rc;
+}
 
 
 \f
@@ -407,6 +478,7 @@ register_commands (assuan_context_t ctx)
     { "LISTSECRETKEYS",cmd_listsecretkeys },
     { "GENKEY",        cmd_genkey    },
     { "DELKEYS",       cmd_delkeys   },
+    { "GETINFO",       cmd_getinfo   },
     { NULL }
   };
   int i, rc;
@@ -488,7 +560,7 @@ gpg_server (ctrl_t ctrl)
       goto leave;
     }
   ctrl->server_local->assuan_ctx = ctx;
-  ctrl->server_local->message_fd = -1;
+  ctrl->server_local->message_fd = GNUPG_INVALID_FD;
 
   if (DBG_ASSUAN)
     assuan_set_log_stream (ctx, log_get_stream ());