diff options
Diffstat (limited to 'sm')
-rw-r--r-- | sm/call-dirmngr.c | 6 | ||||
-rw-r--r-- | sm/keydb.c | 22 | ||||
-rw-r--r-- | sm/keydb.h | 2 |
3 files changed, 29 insertions, 1 deletions
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c index 36afd2231..e024ee7f8 100644 --- a/sm/call-dirmngr.c +++ b/sm/call-dirmngr.c @@ -505,6 +505,8 @@ gpgsm_dirmngr_isvalid (ctrl_t ctrl, struct inq_certificate_parm_s parm; struct isvalid_status_parm_s stparm; + keydb_close_all_files (); + rc = start_dirmngr (ctrl); if (rc) return rc; @@ -775,6 +777,8 @@ gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, const char *uri, if ((names && uri) || (!names && !uri)) return gpg_error (GPG_ERR_INV_ARG); + keydb_close_all_files (); + /* The lookup function can be invoked from the callback of a lookup function, for example to walk the chain. */ if (!dirmngr_ctx_locked) @@ -1043,6 +1047,8 @@ gpgsm_dirmngr_run_command (ctrl_t ctrl, const char *command, size_t len; struct run_command_parm_s parm; + keydb_close_all_files (); + rc = start_dirmngr (ctrl); if (rc) return rc; diff --git a/sm/keydb.c b/sm/keydb.c index c4803f8b7..49d3404a3 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -375,6 +375,23 @@ keydb_add_resource (ctrl_t ctrl, const char *url, int force, int *auto_created) } +/* This is a helper requyired under Windows to close all files so that + * a rename will work. */ +void +keydb_close_all_files (void) +{ +#ifdef HAVE_W32_SYSTEM + int i; + + log_assert (used_resources <= MAX_KEYDB_RESOURCES); + for (i=0; i < used_resources; i++) + if (all_resources[i].type == KEYDB_RESOURCE_TYPE_KEYBOX) + keybox_close_all_files (all_resources[i].token); +#endif +} + + + KEYDB_HANDLE keydb_new (void) { @@ -1080,6 +1097,7 @@ keydb_store_cert (ctrl_t ctrl, ksba_cert_t cert, int ephemeral, int *existed) records. */ keydb_set_ephemeral (kh, 1); + keydb_close_all_files (); rc = lock_all (kh); if (rc) return rc; @@ -1165,6 +1183,7 @@ keydb_set_cert_flags (ctrl_t ctrl, ksba_cert_t cert, int ephemeral, if (ephemeral) keydb_set_ephemeral (kh, 1); + keydb_close_all_files (); err = keydb_lock (kh); if (err) { @@ -1263,6 +1282,7 @@ keydb_clear_some_cert_flags (ctrl_t ctrl, strlist_t names) } } + keydb_close_all_files (); err = keydb_lock (hd); if (err) { @@ -1295,7 +1315,7 @@ keydb_clear_some_cert_flags (ctrl_t ctrl, strlist_t names) } } if (rc && rc != -1) - log_error ("keydb_search failed: %s\n", gpg_strerror (rc)); + log_error ("%s failed: %s\n", __func__, gpg_strerror (rc)); leave: xfree (desc); diff --git a/sm/keydb.h b/sm/keydb.h index f4db5d394..226cac226 100644 --- a/sm/keydb.h +++ b/sm/keydb.h @@ -33,6 +33,8 @@ typedef struct keydb_handle *KEYDB_HANDLE; /*-- keydb.c --*/ gpg_error_t keydb_add_resource (ctrl_t ctrl, const char *url, int force, int *auto_created); +void keydb_close_all_files (void); + KEYDB_HANDLE keydb_new (void); void keydb_release (KEYDB_HANDLE hd); int keydb_set_ephemeral (KEYDB_HANDLE hd, int yes); |