summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2001-11-25 16:52:42 +0000
committerWerner Koch <wk@gnupg.org>2001-11-25 16:52:42 +0000
commit39ab39d2c606e38386e75024709eefd7b0374479 (patch)
treef8704fcd3272539065cbfe3ae9e3c13c2b940223
parente78360c0844e9463547043e971b78bd61ddc2a3d (diff)
downloadlibassuan-39ab39d2c606e38386e75024709eefd7b0374479.tar.gz
(assuan_process): Moved bulk of function to ..
(process_request): .. new. (assuan_process_next): One shot version of above. (assuan_get_active_fds): New. NOTE - this has not been tested yet.
-rw-r--r--src/ChangeLog4
-rw-r--r--src/assuan-handler.c161
-rw-r--r--src/assuan.h5
3 files changed, 121 insertions, 49 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6f7f59e..f19a3c4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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>
diff --git a/src/assuan-handler.c b/src/assuan-handler.c
index d4de852..524a8cf 100644
--- a/src/assuan-handler.c
+++ b/src/assuan-handler.c
@@ -323,6 +323,58 @@ dispatch_command (ASSUAN_CONTEXT ctx, char *line, int linelen)
+
+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
diff --git a/src/assuan.h b/src/assuan.h
index a858dc7..288fe2a 100644
--- a/src/assuan.h
+++ b/src/assuan.h
@@ -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);