updated assuan before_multiple_frontends
authorSteffen Hansen <hansen@kde.org>
Mon, 4 Mar 2002 02:26:58 +0000 (02:26 +0000)
committerSteffen Hansen <hansen@kde.org>
Mon, 4 Mar 2002 02:26:58 +0000 (02:26 +0000)
assuan/ChangeLog
assuan/Makefile.am
assuan/assuan-client.c
assuan/assuan-defs.h
assuan/assuan-handler.c
assuan/assuan-inquire.c
assuan/assuan-pipe-server.c
assuan/assuan.h

index 6ad13b7..867f125 100644 (file)
@@ -1,3 +1,33 @@
+2002-02-27  Werner Koch  <wk@gnupg.org>
+
+       * assuan-client.c (assuan_transact): Add 2 more arguments to
+       support status lines. Passing NULL yields the old behaviour.
+
+       * assuan-handler.c (process_request): Flush data lines send
+       without using the data fp.
+
+2002-02-14  Werner Koch  <wk@gnupg.org>
+
+       * assuan-inquire.c (assuan_inquire): Check for a cancel command
+       and return ASSUAN_Canceled.  Allow for non-data inquiry.
+
+       * assuan.h: Add a few token specific error codes.
+
+2002-02-13  Werner Koch  <wk@gnupg.org>
+
+       * assuan-defs.h (assuan_context_s): New var CLIENT_PID.
+       * assuan-pipe-server.c (_assuan_new_context): set default value.
+       * assuan-socket-server.c (accept_connection): get the actual pid.
+
+2002-02-12  Werner Koch  <wk@gnupg.org>
+
+       * assuan-buffer.c (writen,readline) [USE_GNU_PT]: Use pth_read/write.
+       * assuan-socket-server.c (accept_connection) [USE_GNU_PTH]: Ditto.
+
+2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
+
+       * Makefile.am (MOSTLYCLEANFILES): New variable.
+
 2002-01-23  Werner Koch  <wk@gnupg.org>
 
        * assuan-socket-connect.c (LOGERRORX): and removed typo.
index 7508dce..10be173 100644 (file)
@@ -22,6 +22,7 @@
 EXTRA_DIST = mkerrors
 INCLUDES = -I.. -I$(top_srcdir)/include
 BUILT_SOURCES = assuan-errors.c
+MOSTLYCLEANFILES = assuan-errors.c
 
 noinst_LIBRARIES = libassuan.a
 
index d56357d..41984fd 100644 (file)
@@ -57,6 +57,15 @@ _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
       *okay = 2; /* data line */
       *off = 2;
     }
+  else if (linelen >= 1
+           && line[0] == 'S' 
+           && (line[1] == '\0' || line[1] == ' '))
+    {
+      *okay = 4;
+      *off = 1;
+      while (line[*off] == ' ')
+        ++*off;
+    }  
   else if (linelen >= 2
            && line[0] == 'O' && line[1] == 'K'
            && (line[2] == '\0' || line[2] == ' '))
@@ -101,6 +110,8 @@ _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
  * @data_cb_arg: first argument passed to @data_cb
  * @inquire_cb: Callback function for a inquire response
  * @inquire_cb_arg: first argument passed to @inquire_cb
+ * @status_cb: Callback function for a status response
+ * @status_cb_arg: first argument passed to @status_cb
  * 
  * FIXME: Write documentation
  * 
@@ -114,7 +125,9 @@ assuan_transact (ASSUAN_CONTEXT ctx,
                  AssuanError (*data_cb)(void *, const void *, size_t),
                  void *data_cb_arg,
                  AssuanError (*inquire_cb)(void*, const char *),
-                 void *inquire_cb_arg)
+                 void *inquire_cb_arg,
+                 AssuanError (*status_cb)(void*, const char *),
+                 void *status_cb_arg)
 {
   int rc, okay, off;
   unsigned char *line;
@@ -181,6 +194,13 @@ assuan_transact (ASSUAN_CONTEXT ctx,
             goto again;
         }
     }
+  else if (okay == 4)
+    {
+      if (status_cb)
+        rc = status_cb (status_cb_arg, line);
+      if (!rc)
+        goto again;
+    }
 
   return rc;
 }
index 7d55aab..6c502bf 100644 (file)
@@ -77,6 +77,9 @@ struct assuan_context_s {
                      In socket mode, the pid of the server */
   int listen_fd;  /* The fd we are listening on (used by socket servers) */
 
+  pid_t client_pid; /* for a socket server the PID of the client or -1
+                       if not available */
+
   void (*deinit_handler)(ASSUAN_CONTEXT);  
   int (*accept_handler)(ASSUAN_CONTEXT);
   int (*finish_handler)(ASSUAN_CONTEXT);
@@ -92,7 +95,6 @@ struct assuan_context_s {
   void (*input_notify_fnc)(ASSUAN_CONTEXT, const char *);
   void (*output_notify_fnc)(ASSUAN_CONTEXT, const char *);
 
-
   int input_fd;   /* set by INPUT command */
   int output_fd;  /* set by OUTPUT command */
 
@@ -135,9 +137,3 @@ void _assuan_log_sanitized_string (const char *string);
 
 #endif /*ASSUAN_DEFS_H*/
 
-
-
-
-
-
-
index 1c8aded..69b34b4 100644 (file)
@@ -464,6 +464,12 @@ process_request (ASSUAN_CONTEXT ctx)
       if (!rc && ctx->outbound.data.error)
         rc = ctx->outbound.data.error;
     }
+  else /* flush any data send w/o using the data fp */
+    {
+      assuan_send_data (ctx, NULL, 0);
+      if (!rc && ctx->outbound.data.error)
+        rc = ctx->outbound.data.error;
+    }
   /* Error handling */
   if (!rc)
     {
@@ -478,7 +484,7 @@ process_request (ASSUAN_CONTEXT ctx)
     {
       char errline[256];
 
-        if (rc < 100)
+      if (rc < 100)
         sprintf (errline, "ERR %d server fault (%.50s)",
                  ASSUAN_Server_Fault, assuan_strerror (rc));
       else
index 933091e..2bac130 100644 (file)
@@ -126,9 +126,10 @@ free_membuf (struct membuf *mb)
  * @keyword: The keyword used for the inquire
  * @r_buffer: Returns an allocated buffer
  * @r_length: Returns the length of this buffer
- * @maxlen: If no 0, the size limit of the inquired data.
+ * @maxlen: If not 0, the size limit of the inquired data.
  * 
- * A Server may use this to Send an inquire
+ * A Server may use this to Send an inquire.  r_buffer, r_length and
+ * maxlen may all be NULL/0 to indicate that no real data is expected.
  * 
  * Return value: 0 on success or an ASSUAN error code
  **/
@@ -141,9 +142,12 @@ assuan_inquire (ASSUAN_CONTEXT ctx, const char *keyword,
   char cmdbuf[100];
   unsigned char *line, *p;
   int linelen;
+  int nodataexpected;
 
-  if (!ctx || !keyword || (10 + strlen (keyword) >= sizeof (cmdbuf))
-      || !r_buffer || !r_length )
+  if (!ctx || !keyword || (10 + strlen (keyword) >= sizeof (cmdbuf)))
+    return ASSUAN_Invalid_Value;
+  nodataexpected = !r_buffer && !r_length && !maxlen;
+  if (!nodataexpected && (!r_buffer || !r_length))
     return ASSUAN_Invalid_Value;
   if (!ctx->is_server)
     return ASSUAN_Not_A_Server;
@@ -151,7 +155,10 @@ assuan_inquire (ASSUAN_CONTEXT ctx, const char *keyword,
     return ASSUAN_Nested_Commands;
   
   ctx->in_inquire = 1;
-  init_membuf (&mb, maxlen? maxlen:1024, maxlen);
+  if (nodataexpected)
+    memset (&mb, 0, sizeof mb); /* avoid compiler warnings */
+  else
+    init_membuf (&mb, maxlen? maxlen:1024, maxlen);
 
   strcpy (stpcpy (cmdbuf, "INQUIRE "), keyword);
   rc = assuan_write_line (ctx, cmdbuf);
@@ -172,7 +179,12 @@ assuan_inquire (ASSUAN_CONTEXT ctx, const char *keyword,
       if (line[0] == 'E' && line[1] == 'N' && line[2] == 'D'
           && (!line[3] || line[3] == ' '))
         break; /* END command received*/
-      if (line[0] != 'D' || line[1] != ' ')
+      if (line[0] == 'C' && line[1] == 'A' && line[2] == 'N')
+        {
+          rc = ASSUAN_Canceled;
+          goto leave;
+        }
+      if (line[0] != 'D' || line[1] != ' ' || nodataexpected)
         {
           rc = ASSUAN_Unexpected_Command;
           goto leave;
@@ -205,13 +217,17 @@ assuan_inquire (ASSUAN_CONTEXT ctx, const char *keyword,
           goto leave;
         }
     }
-  
-  *r_buffer = get_membuf (&mb, r_length);
-  if (!*r_buffer)
-    rc = ASSUAN_Out_Of_Core;
+
+  if (!nodataexpected)
+    {
+      *r_buffer = get_membuf (&mb, r_length);
+      if (!*r_buffer)
+        rc = ASSUAN_Out_Of_Core;
+    }
 
  leave:
-  free_membuf (&mb);
+  if (!nodataexpected)
+    free_membuf (&mb);
   ctx->in_inquire = 0;
   return rc;
 }
index d15f54f..5c5d124 100644 (file)
@@ -64,6 +64,7 @@ _assuan_new_context (ASSUAN_CONTEXT *r_ctx)
   ctx->outbound.fd = -1;
 
   ctx->listen_fd = -1;
+  ctx->client_pid = (pid_t)-1;
   /* use the pipe server handler as a default */
   ctx->deinit_handler = deinit_pipe_server;
   ctx->accept_handler = accept_connection;
index 5971d81..3c67972 100644 (file)
@@ -73,6 +73,9 @@ typedef enum {
   ASSUAN_Inquire_Unknown = 120,
   ASSUAN_Inquire_Error = 121,
   ASSUAN_Invalid_Option = 122,
+  ASSUAN_Invalid_Index = 123,
+
+  ASSUAN_Not_Confirmed = 128,
 
   ASSUAN_Bad_Certificate = 201,
   ASSUAN_Bad_Certificate_Path = 202,
@@ -89,6 +92,12 @@ typedef enum {
   ASSUAN_CRL_Too_Old = 303,
   ASSUAN_Not_Trusted = 304,
 
+  ASSUAN_Card_Error = 401,
+  ASSUAN_Invalid_Card = 402,
+  ASSUAN_No_PKCS15_App = 403,
+  ASSUAN_Card_Not_Present = 404,
+  ASSUAN_Invalid_Id = 405
+
 } AssuanError;
 
 /* This is a list of pre-registered ASSUAN commands */
@@ -178,7 +187,9 @@ assuan_transact (ASSUAN_CONTEXT ctx,
                  AssuanError (*data_cb)(void *, const void *, size_t),
                  void *data_cb_arg,
                  AssuanError (*inquire_cb)(void*, const char *),
-                 void *inquire_cb_arg);
+                 void *inquire_cb_arg,
+                 AssuanError (*status_cb)(void*, const char *),
+                 void *status_cb_arg);
 
 
 /*-- assuan-inquire.c --*/