From eed44d395a30e7137755c199d0501cb306ded8ac Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Fri, 24 Apr 2009 20:25:12 -0400 Subject: [PATCH] Use assuan_register_pre_cmd_notify(). This is a patch to libassuan. --- src/commands.c | 120 ++++++++++++++++++++++----------------------------------- src/commands.h | 1 - src/common.h | 2 +- src/pinentry.c | 4 +- 4 files changed, 49 insertions(+), 78 deletions(-) diff --git a/src/commands.c b/src/commands.c index a7cbe6ed..c6f6369d 100644 --- a/src/commands.c +++ b/src/commands.c @@ -1211,16 +1211,6 @@ static int save_command(assuan_context_t ctx, char *line) struct client_s *client = assuan_get_pointer(ctx); gpg_error_t rc; - rc = lock_file_mutex(client); - - if (rc) - return send_error(ctx, rc); - - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - if (lstat(client->filename, &st) == -1 && errno != ENOENT) return send_syserror(ctx, errno); @@ -1331,11 +1321,6 @@ static int delete_command(assuan_context_t ctx, char *line) gpg_error_t rc; xmlNodePtr n; - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - if (strchr(line, '\t')) req = split_input_line(line, "\t", -1); else @@ -1449,10 +1434,7 @@ again: static int store_command(assuan_context_t ctx, char *line) { struct client_s *client = assuan_get_pointer(ctx); - gpg_error_t rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); + gpg_error_t rc; rc = assuan_inquire_ext(ctx, "STORE", 0, store_command_finalize, ctx); @@ -1586,11 +1568,6 @@ static int get_command(assuan_context_t ctx, char *line) gpg_error_t rc; xmlNodePtr n; - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - req = split_input_line(line, "\t", -1); if (!req || !*req) { @@ -1686,11 +1663,6 @@ static int realpath_command(assuan_context_t ctx, char *line) GString *string; gchar *rp = NULL; - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - if (strchr(line, '\t') != NULL) { if ((req = split_input_line(line, "\t", 0)) == NULL) return send_error(ctx, EPWMD_COMMAND_SYNTAX); @@ -1786,11 +1758,6 @@ static int list_command(assuan_context_t ctx, char *line) if (disable_list_and_dump == TRUE) return send_error(ctx, GPG_ERR_NOT_IMPLEMENTED); - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - if (!*line) { GString *str; @@ -2352,11 +2319,6 @@ static int attr_command(assuan_context_t ctx, char *line) gchar **req; gpg_error_t rc = 0; - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - req = split_input_line(line, " ", 4); if (!req || !req[0] || !req[1]) { @@ -2513,11 +2475,6 @@ static int dump_command(assuan_context_t ctx, char *line) if (disable_list_and_dump == TRUE) return send_error(ctx, GPG_ERR_NOT_IMPLEMENTED); - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - xmlDocDumpFormatMemory(client->doc, &xml, &len, 1); if (!xml) { @@ -2664,11 +2621,6 @@ static int xpath_command(assuan_context_t ctx, gchar *line) if (disable_list_and_dump == TRUE) return send_error(ctx, GPG_ERR_NOT_IMPLEMENTED); - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - if (!line || !*line) return send_error(ctx, EPWMD_COMMAND_SYNTAX); @@ -2842,11 +2794,6 @@ static int import_command(assuan_context_t ctx, gchar *line) gpg_error_t rc; struct client_s *client = assuan_get_pointer(ctx); - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - rc = assuan_inquire_ext(ctx, "IMPORT", 0, import_command_finalize, ctx); if (rc) @@ -2862,11 +2809,6 @@ static int lock_command(assuan_context_t ctx, gchar *line) gpg_error_t rc; struct client_s *client = assuan_get_pointer(ctx); - rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); - rc = lock_file_mutex(client); if (!rc) @@ -2878,10 +2820,6 @@ static int lock_command(assuan_context_t ctx, gchar *line) static int unlock_command(assuan_context_t ctx, gchar *line) { struct client_s *client = assuan_get_pointer(ctx); - gpg_error_t rc = file_modified(client); - - if (rc) - return send_error(ctx, rc); unlock_file_mutex(client); return send_error(ctx, 0); @@ -3073,6 +3011,46 @@ static void reset_notify(assuan_context_t ctx) cleanup_client(cl); } +/* + * This is called before every Assuan command. + */ +int command_startup(assuan_context_t ctx, const char *name) +{ + struct client_s *cl = assuan_get_pointer(ctx); + gpg_error_t rc; + + if (!g_strcmp0(name, "ISCACHED") || + !g_strcmp0(name, "CLEARCACHE") || + !g_strcmp0(name, "CACHETIMEOUT") || + !g_strcmp0(name, "GETCONFIG") || + !g_strcmp0(name, "GETPID") || + !g_strcmp0(name, "VERSION") || + !g_strcmp0(name, "SET") || + !g_strcmp0(name, "UNSET")) + return 0; + + rc = file_modified(cl); + + if (rc) { + if ((rc == EPWMD_NO_FILE || rc == EPWMD_FILE_MODIFIED) && + !g_strcmp0(name, "OPEN")) + rc = 0; + } + + return rc; +} + +/* + * This is called after every Assuan command. + */ +void command_finalize(assuan_context_t ctx, gint rc) +{ + struct client_s *client = assuan_get_pointer(ctx); + + if (!client->is_lock_cmd) + unlock_file_mutex(client); +} + gpg_error_t register_commands(assuan_context_t ctx) { static struct { @@ -3123,6 +3101,11 @@ gpg_error_t register_commands(assuan_context_t ctx) if (rc) return rc; + rc = assuan_register_pre_cmd_notify(ctx, command_startup); + + if (rc) + return rc; + return assuan_register_post_cmd_notify(ctx, command_finalize); } @@ -3281,14 +3264,3 @@ decompress: /* The calling function should free the crypto struct. */ return 0; } - -/* - * This is called after every Assuan command. - */ -void command_finalize(assuan_context_t ctx, gint rc) -{ - struct client_s *client = assuan_get_pointer(ctx); - - if (!client->is_lock_cmd) - unlock_file_mutex(client); -} diff --git a/src/commands.h b/src/commands.h index 489bb77c..38bc7fac 100644 --- a/src/commands.h +++ b/src/commands.h @@ -25,7 +25,6 @@ gpg_error_t register_commands(assuan_context_t ctx); void cleanup_assuan(assuan_context_t ctx); gpg_error_t try_xml_decrypt(assuan_context_t ctx, guchar *key, struct client_crypto_s *, gpointer *dst, goffset *dst_len); -void command_finalize(assuan_context_t ctx, gint error); void unlock_file_mutex(struct client_s *client); gpg_error_t lock_file_mutex(struct client_s *client); file_header_internal_t *read_file_header(const gchar *filename, gboolean v1, diff --git a/src/common.h b/src/common.h index 9057738f..dd101c32 100644 --- a/src/common.h +++ b/src/common.h @@ -106,7 +106,7 @@ struct pinentry_s { gboolean has_lock; gint enable; membuf_t data; - int (*inquire_cb)(void *data, const char *line); + assuan_error_t (*inquire_cb)(void *data, const char *line); void *inquire_data; }; #endif diff --git a/src/pinentry.c b/src/pinentry.c index 607f06a6..bc940ef2 100644 --- a/src/pinentry.c +++ b/src/pinentry.c @@ -51,7 +51,7 @@ void free_client_list(); static gpg_error_t set_pinentry_strings(struct pinentry_s *pin, int which); -static int mem_realloc_cb(void *data, const void *buffer, size_t len) +static assuan_error_t mem_realloc_cb(void *data, const void *buffer, size_t len) { membuf_t *mem = (membuf_t *)data; void *p; @@ -69,7 +69,7 @@ static int mem_realloc_cb(void *data, const void *buffer, size_t len) } #ifdef WITH_QUALITY -static int quality_cb(void *data, const char *line) +static assuan_error_t quality_cb(void *data, const char *line) { struct pinentry_s *pin = data; const gchar *tmp; -- 2.11.4.GIT