(assuan_process): Moved bulk of function to ..
authorWerner Koch <wk@gnupg.org>
Sun, 25 Nov 2001 16:52:42 +0000 (16:52 +0000)
committerWerner Koch <wk@gnupg.org>
Sun, 25 Nov 2001 16:52:42 +0000 (16:52 +0000)
(process_request): .. new.
(assuan_process_next): One shot version of above.
(assuan_get_active_fds): New.
NOTE - this has not been tested yet.

assuan/ChangeLog
assuan/assuan-handler.c
assuan/assuan.h

index 6f7f59e..f19a3c4 100644 (file)
@@ -4,6 +4,10 @@
        (assuan_register_reset_notify)
        (assuan_register_cancel_notify): New and call them from the
        standard handlers.
+       (assuan_process): Moved bulk of function to ..
+       (process_request): .. new.
+       (assuan_process_next): One shot version of above.
+       (assuan_get_active_fds): New.
 
 2001-11-24  Werner Koch  <wk@gnupg.org>
 
index d4de852..524a8cf 100644 (file)
@@ -323,6 +323,58 @@ dispatch_command (ASSUAN_CONTEXT ctx, char *line, int linelen)
 
 
 
+\f
+static int
+process_request (ASSUAN_CONTEXT ctx)
+{
+  int rc;
+
+  rc = _assuan_read_line (ctx);
+  if (rc)
+    return rc;
+  if (*ctx->inbound.line == '#' || !ctx->inbound.linelen)
+    return 0; /* comment line - ignore */
+
+  ctx->outbound.data.error = 0;
+  ctx->outbound.data.linelen = 0;
+  /* dispatch command and return reply */
+  rc = dispatch_command (ctx, ctx->inbound.line, ctx->inbound.linelen);
+  /* check from data write errors */
+  if (ctx->outbound.data.fp)
+    { /* Flush the data lines */
+      fclose (ctx->outbound.data.fp);
+      ctx->outbound.data.fp = NULL;
+      if (!rc && ctx->outbound.data.error)
+        rc = ctx->outbound.data.error;
+    }
+  /* Error handling */
+  if (!rc)
+    {
+      rc = _assuan_write_line (ctx, "OK");
+    }
+  else if (rc == -1)
+    { /* No error checking because the peer may have already disconnect */ 
+      _assuan_write_line (ctx, "OK  Bye, bye - hope to meet you again");
+    }
+  else 
+    {
+      char errline[256];
+
+      if (rc < 100)
+        sprintf (errline, "ERR %d server fault (%.50s)",
+                 ASSUAN_Server_Fault, assuan_strerror (rc));
+      else
+        {
+          const char *text = ctx->err_no == rc? ctx->err_str:NULL;
+
+          sprintf (errline, "ERR %d %.50s%s%.100s",
+                   rc, assuan_strerror (rc), text? " - ":"", text?text:"");
+        }
+      rc = _assuan_write_line (ctx, errline);
+    }
+
+  return rc;
+}
 
 /**
  * assuan_process:
@@ -341,55 +393,7 @@ assuan_process (ASSUAN_CONTEXT ctx)
   int rc;
 
   do {
-    /* Read the line but skip comments */
-    do
-      {
-        rc = _assuan_read_line (ctx);
-        if (rc)
-          return rc;
-      
-/*          fprintf (stderr, "DBG-assuan: got %d bytes `%s'\n", */
-/*                   ctx->inbound.linelen, ctx->inbound.line); */
-      }
-    while ( *ctx->inbound.line == '#' || !ctx->inbound.linelen);
-
-    ctx->outbound.data.error = 0;
-    ctx->outbound.data.linelen = 0;
-    /* dispatch command and return reply */
-    rc = dispatch_command (ctx, ctx->inbound.line, ctx->inbound.linelen);
-    /* check from data write errors */
-    if (ctx->outbound.data.fp)
-      { /* Flush the data lines */
-        fclose (ctx->outbound.data.fp);
-        ctx->outbound.data.fp = NULL;
-        if (!rc && ctx->outbound.data.error)
-          rc = ctx->outbound.data.error;
-      }
-    /* Error handling */
-    if (!rc)
-      {
-        rc = _assuan_write_line (ctx, "OK");
-      }
-    else if (rc == -1)
-      { /* No error checking because the peer may have already disconnect */ 
-        _assuan_write_line (ctx, "OK  Bye, bye - hope to meet you again");
-      }
-    else 
-      {
-        char errline[256];
-
-        if (rc < 100)
-          sprintf (errline, "ERR %d server fault (%.50s)",
-                   ASSUAN_Server_Fault, assuan_strerror (rc));
-        else
-          {
-            const char *text = ctx->err_no == rc? ctx->err_str:NULL;
-
-            sprintf (errline, "ERR %d %.50s%s%.100s",
-                     rc, assuan_strerror (rc), text? " - ":"", text?text:"");
-          }
-        rc = _assuan_write_line (ctx, errline);
-      }
+    rc = process_request (ctx);
   } while (!rc);
 
   if (rc == -1)
@@ -399,6 +403,65 @@ assuan_process (ASSUAN_CONTEXT ctx)
 }
 
 
+/**
+ * assuan_process_next:
+ * @ctx: Assuan context
+ * 
+ * Same as assuan_process() but the user has to provide the outer
+ * loop.  He should loop as long as the return code is zero and stop
+ * otherwise; -1 is regular end.
+ * 
+ * See also: assuan_get_active_fds()
+ * Return value: -1 for end of server, 0 on success or an error code
+ **/
+int 
+assuan_process_next (ASSUAN_CONTEXT ctx)
+{
+  return process_request (ctx);
+}
+
+
+/**
+ * assuan_get_active_fds:
+ * @ctx: Assuan context
+ * @what: 0 for read fds, 1 for write fds
+ * @fdarray: Caller supplied array to store the FDs
+ * @fdarraysize: size of that array
+ * 
+ * Return all active filedescriptors for the given context.  This
+ * function can be used to select on the fds and call
+ * assuan_process_next() if there is an active one.
+ *
+ * Note, that write FDs are not yet supported.
+ * 
+ * Return value: number of FDs active and put into @fdarray or -1 on
+ * error which is most likely a too small fdarray.
+ **/
+int 
+assuan_get_active_fds (ASSUAN_CONTEXT ctx, int what,
+                       int *fdarray, int fdarraysize)
+{
+  int n = 0;
+
+  if (ctx || fdarraysize < 2 || what < 0 || what > 1)
+    return -1;
+
+  if (!what)
+    {
+      if (ctx->inbound.fd != -1)
+        fdarray[n++] = ctx->inbound.fd;
+    }
+  else
+    {
+      if (ctx->outbound.fd != -1)
+        fdarray[n++] = ctx->outbound.fd;
+      if (ctx->outbound.data.fp)
+        fdarray[n++] = fileno (ctx->outbound.data.fp);
+    }
+
+  return n;
+}
+
 /* Return a FP to be used for data output.  The FILE pointer is valid
    until the end of a handler.  So a close is not needed.  Assuan does
    all the buffering needed to insert the status line as well as the
index a858dc7..288fe2a 100644 (file)
@@ -92,6 +92,11 @@ int assuan_register_reset_notify (ASSUAN_CONTEXT ctx,
 int assuan_register_cancel_notify (ASSUAN_CONTEXT ctx,
                                    void (*fnc)(ASSUAN_CONTEXT));
 int assuan_process (ASSUAN_CONTEXT ctx);
+int assuan_process_next (ASSUAN_CONTEXT ctx);
+int assuan_get_active_fds (ASSUAN_CONTEXT ctx, int what,
+                           int *fdarray, int fdarraysize);
+
+
 FILE *assuan_get_data_fp (ASSUAN_CONTEXT ctx);
 void assuan_write_status (ASSUAN_CONTEXT ctx,
                           const char *keyword, const char *text);