summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2009-11-04 10:00:24 +0000
committerWerner Koch <wk@gnupg.org>2009-11-04 10:00:24 +0000
commit8b30641f35200d82897cd659d180e4423a803e85 (patch)
treef4278b1f2e721668dabbfc0e7d2fcaff92cde0bb
parentf342672465427384c706ccd4476d603fc04df1de (diff)
downloadlibassuan-8b30641f35200d82897cd659d180e4423a803e85.tar.gz
Extended HELP command.
-rw-r--r--ChangeLog5
-rw-r--r--NEWS6
-rw-r--r--src/ChangeLog8
-rw-r--r--src/Makefile.am2
-rw-r--r--src/assuan-defs.h1
-rw-r--r--src/assuan-handler.c57
-rw-r--r--src/assuan.h9
-rw-r--r--tests/fdpassing.c2
8 files changed, 77 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 7253adc..7ac8f1f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 5fba70c..ee8c260 100644
--- a/NEWS
+++ b/NEWS
@@ -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;
}