diff options
author | Werner Koch <wk@gnupg.org> | 2001-11-25 17:52:42 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2001-11-25 17:52:42 +0100 |
commit | 8cf367848a6c41dadbdcff70b9c53812398822fc (patch) | |
tree | 55239984c6d66d1bc1961d8d5cb4c3a1f9624ed9 /assuan | |
parent | * assuan-handler.c (assuan_register_bye_notify) (diff) | |
download | gnupg2-8cf367848a6c41dadbdcff70b9c53812398822fc.tar.xz gnupg2-8cf367848a6c41dadbdcff70b9c53812398822fc.zip |
(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.
Diffstat (limited to 'assuan')
-rw-r--r-- | assuan/ChangeLog | 4 | ||||
-rw-r--r-- | assuan/assuan-handler.c | 161 | ||||
-rw-r--r-- | assuan/assuan.h | 5 |
3 files changed, 121 insertions, 49 deletions
diff --git a/assuan/ChangeLog b/assuan/ChangeLog index 6f7f59e4d..f19a3c43f 100644 --- a/assuan/ChangeLog +++ b/assuan/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/assuan/assuan-handler.c b/assuan/assuan-handler.c index d4de8526b..524a8cf96 100644 --- a/assuan/assuan-handler.c +++ b/assuan/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/assuan/assuan.h b/assuan/assuan.h index a858dc7e5..288fe2ae9 100644 --- a/assuan/assuan.h +++ b/assuan/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); |