diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | src/ChangeLog | 8 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/assuan-defs.h | 1 | ||||
-rw-r--r-- | src/assuan-handler.c | 57 | ||||
-rw-r--r-- | src/assuan.h | 9 | ||||
-rw-r--r-- | tests/fdpassing.c | 2 |
8 files changed, 77 insertions, 13 deletions
@@ -1,3 +1,8 @@ +2009-11-04 Werner Koch <wk@g10code.com> + + * tests/fdpassing.c (register_commands): Add NULL arg to + assuan_register_command. + 2009-10-16 Marcus Brinkmann <marcus@g10code.de> * autogen.sh: Remove --with-pth-prefix from configure invocation. @@ -14,7 +14,8 @@ Noteworthy changes in version 1.1.0 (unreleased) of NULL, you have to provide a non-NULL ARGV argument and check that against "server" or "client" to determine which end you got after fork(). If you use the assuan sock interface, you must call - assuan_sock_init after setting global context defaults. + assuan_sock_init after setting global context defaults. Add a NULL + as the last arg to assuan_register_command. * Pth support has changed. This now follows the same style as libgcrypt by setting system hook callbacks. @@ -68,11 +69,12 @@ ASSUAN_SYSTEM_PTH NEW assuan_sock_init NEW assuan_sock_deinit NEW assuan_handler_t NEW +assuan_register_command CHANGED: Add arg HELP_STRING. assuan_register_bye_notify CHANGED: Handler gets line and returns err now. assuan_register_reset_notify CHANGED: Handler gets line and returns err now. assuan_register_cancel_notify CHANGED: Handler gets line and returns err now. assuan_register_input_notify CHANGED: Handler returns error now. -assuan_register_output_notify CHANGED: Handler returns error now. +assuan_register_output_notify CHANGED: Handler returns error now. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/ChangeLog b/src/ChangeLog index 4b41e33..0b766d9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2009-11-04 Werner Koch <wk@g10code.com> + + * Makefile.am (common_sources): Add debug.h. + + * assuan-defs.h (cmdtbl_s): Add field HELPSTR. + * assuan-handler.c (assuan_register_command): Add arg HELP_STRING. + (std_handler_help): Print the help. + 2009-11-02 Marcus Brinkmann <marcus@g10code.de> * assuan.h (assuan_handler_t): New type. diff --git a/src/Makefile.am b/src/Makefile.am index bfbcfec..0d6ec0b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,7 +39,7 @@ common_sources = \ assuan.c \ context.c \ system.c \ - debug.c \ + debug.c debug.h \ conversion.c \ assuan-error.c \ assuan-buffer.c \ diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 56867a6..648b881 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -53,6 +53,7 @@ struct cmdtbl_s { const char *name; assuan_handler_t handler; + const char *helpstr; }; diff --git a/src/assuan-handler.c b/src/assuan-handler.c index a39c006..dd5bfda 100644 --- a/src/assuan-handler.c +++ b/src/assuan-handler.c @@ -155,12 +155,55 @@ std_handler_help (assuan_context_t ctx, char *line) { unsigned int i; char buf[ASSUAN_LINELENGTH]; + const char *helpstr; + size_t n; - for (i = 0; i < ctx->cmdtbl_used; i++) + n = strcspn (line, " \t\n"); + if (!n) + { + /* Print all commands. If a help string is available and that + starts with the command name, print the first line of the + help string. */ + for (i = 0; i < ctx->cmdtbl_used; i++) + { + n = strlen (ctx->cmdtbl[i].name); + helpstr = ctx->cmdtbl[i].helpstr; + if (helpstr + && !strncmp (ctx->cmdtbl[i].name, helpstr, n) + && (!helpstr[n] || helpstr[n] == '\n' || helpstr[n] == ' ') + && (n = strcspn (helpstr, "\n")) ) + snprintf (buf, sizeof (buf), "# %.*s", (int)n, helpstr); + else + snprintf (buf, sizeof (buf), "# %s", ctx->cmdtbl[i].name); + buf[ASSUAN_LINELENGTH - 1] = '\0'; + assuan_write_line (ctx, buf); + } + } + else { - snprintf (buf, sizeof (buf), "# %s", ctx->cmdtbl[i].name); - buf[ASSUAN_LINELENGTH - 1] = '\0'; - assuan_write_line (ctx, buf); + /* Print the help for the given command. */ + int c = line[n]; + line[n] = 0; + for (i=0; ctx->cmdtbl[i].name; i++) + if (!my_strcasecmp (line, ctx->cmdtbl[i].name)) + break; + line[n] = c; + if (!ctx->cmdtbl[i].name) + return PROCESS_DONE (ctx, set_error (ctx,GPG_ERR_UNKNOWN_COMMAND,NULL)); + helpstr = ctx->cmdtbl[i].helpstr; + if (!helpstr) + return PROCESS_DONE (ctx, set_error (ctx, GPG_ERR_NOT_FOUND, NULL)); + do + { + n = strcspn (helpstr, "\n"); + snprintf (buf, sizeof (buf), "# %.*s", (int)n, helpstr); + helpstr += n; + if (*helpstr == '\n') + helpstr++; + buf[ASSUAN_LINELENGTH - 1] = '\0'; + assuan_write_line (ctx, buf); + } + while (*helpstr); } return PROCESS_DONE (ctx, 0); @@ -275,6 +318,7 @@ static struct { * @cmd_name: A string with the command name * @handler: The handler function to be called or NULL to use a default * handler. + * HELPSTRING * * Register a handler to be used for a given command. Note that * several default handlers are already regsitered with a new context. @@ -284,7 +328,7 @@ static struct { **/ gpg_error_t assuan_register_command (assuan_context_t ctx, const char *cmd_name, - assuan_handler_t handler) + assuan_handler_t handler, const char *help_string) { int i; const char *s; @@ -332,6 +376,7 @@ assuan_register_command (assuan_context_t ctx, const char *cmd_name, ctx->cmdtbl[ctx->cmdtbl_used].name = cmd_name; ctx->cmdtbl[ctx->cmdtbl_used].handler = handler; + ctx->cmdtbl[ctx->cmdtbl_used].helpstr = help_string; ctx->cmdtbl_used++; return 0; } @@ -424,7 +469,7 @@ _assuan_register_std_commands (assuan_context_t ctx) { if (std_cmd_table[i].always) { - rc = assuan_register_command (ctx, std_cmd_table[i].name, NULL); + rc = assuan_register_command (ctx, std_cmd_table[i].name, NULL, NULL); if (rc) return rc; } diff --git a/src/assuan.h b/src/assuan.h index 935ec00..defd0b6 100644 --- a/src/assuan.h +++ b/src/assuan.h @@ -305,9 +305,11 @@ typedef gpg_error_t (*assuan_handler_t) (assuan_context_t, char *); /*-- assuan-handler.c --*/ gpg_error_t assuan_register_command (assuan_context_t ctx, const char *cmd_string, - assuan_handler_t handler); + assuan_handler_t handler, + const char *help_string); gpg_error_t assuan_register_post_cmd_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t, gpg_error_t)); + void (*fnc)(assuan_context_t, + gpg_error_t)); gpg_error_t assuan_register_bye_notify (assuan_context_t ctx, assuan_handler_t handler); gpg_error_t assuan_register_reset_notify (assuan_context_t ctx, @@ -321,7 +323,8 @@ gpg_error_t assuan_register_output_notify (assuan_context_t ctx, gpg_error_t assuan_register_option_handler (assuan_context_t ctx, gpg_error_t (*fnc)(assuan_context_t, - const char*, const char*)); + const char*, + const char*)); gpg_error_t assuan_process (assuan_context_t ctx); gpg_error_t assuan_process_next (assuan_context_t ctx); diff --git a/tests/fdpassing.c b/tests/fdpassing.c index 7197ff7..132a953 100644 --- a/tests/fdpassing.c +++ b/tests/fdpassing.c @@ -88,7 +88,7 @@ register_commands (assuan_context_t ctx) for (i=0; table[i].name; i++) { - rc = assuan_register_command (ctx, table[i].name, table[i].handler); + rc = assuan_register_command (ctx, table[i].name, table[i].handler, NULL); if (rc) return rc; } |