From dc1dbc43a6bfb2f3e6a1cc2ca089e0318b3af0ed Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 2 Feb 2016 09:03:37 +0100 Subject: [PATCH] g13: Re-factor high level create code. * g13/create.c (g13_create_container): Factor some code out to ... * g13/backend.c (be_take_lock_for_create): new. Signed-off-by: Werner Koch --- g13/backend.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ g13/backend.h | 2 ++ g13/create.c | 31 +++------------------------ 3 files changed, 64 insertions(+), 28 deletions(-) diff --git a/g13/backend.c b/g13/backend.c index 52e1e0a34..b35887be3 100644 --- a/g13/backend.c +++ b/g13/backend.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "g13.h" #include "i18n.h" @@ -88,6 +89,64 @@ be_is_supported_conttype (int conttype) } +/* Create a lock file for the container FNAME and store the lock at + * R_LOCK and return 0. On error return an error code and store NULL + * at R_LOCK. */ +gpg_error_t +be_take_lock_for_create (ctrl_t ctrl, const char *fname, dotlock_t *r_lock) +{ + gpg_error_t err; + dotlock_t lock = NULL; + struct stat sb; + + *r_lock = NULL; + + /* A DM-crypt container requires special treatment by using the + syshelper fucntions. */ + if (ctrl->conttype == CONTTYPE_DM_CRYPT) + { + /* */ + err = gpg_error (GPG_ERR_NOT_IMPLEMENTED); + goto leave; + } + + + /* A quick check to see that no container with that name already + exists. */ + if (!access (fname, F_OK)) + { + err = gpg_error (GPG_ERR_EEXIST); + goto leave; + } + + /* Take a lock and proceed with the creation. If there is a lock we + immediately return an error because for creation it does not make + sense to wait. */ + lock = dotlock_create (fname, 0); + if (!lock) + { + err = gpg_error_from_syserror (); + goto leave; + } + if (dotlock_take (lock, 0)) + { + err = gpg_error_from_syserror (); + goto leave; + } + + /* Check again that the file does not exist. */ + err = stat (fname, &sb)? 0 : gpg_error (GPG_ERR_EEXIST); + + leave: + if (!err) + { + *r_lock = lock; + lock = NULL; + } + dotlock_destroy (lock); + return err; +} + /* If the backend requires a separate file or directory for the container, return its name by computing it from FNAME which gives diff --git a/g13/backend.h b/g13/backend.h index e570fc5a1..be81a04d5 100644 --- a/g13/backend.h +++ b/g13/backend.h @@ -25,6 +25,8 @@ int be_parse_conttype_name (const char *name); int be_is_supported_conttype (int conttype); +gpg_error_t be_take_lock_for_create (ctrl_t ctrl, const char *fname, + dotlock_t *r_lock); gpg_error_t be_get_detached_name (int conttype, const char *fname, char **r_name, int *r_isdir); gpg_error_t be_create_new_keys (int conttype, membuf_t *mb); diff --git a/g13/create.c b/g13/create.c index 91b290cd1..3dac903df 100644 --- a/g13/create.c +++ b/g13/create.c @@ -239,35 +239,10 @@ g13_create_container (ctrl_t ctrl, const char *filename, strlist_t keys) if (!keys) return gpg_error (GPG_ERR_NO_PUBKEY); - /* A quick check to see that no container with that name already - exists. */ - if (!access (filename, F_OK)) - return gpg_error (GPG_ERR_EEXIST); + err = be_take_lock_for_create (ctrl, filename, &lock); + if (err) + goto leave; - /* Take a lock and proceed with the creation. If there is a lock we - immediately return an error because for creation it does not make - sense to wait. */ - lock = dotlock_create (filename, 0); - if (!lock) - return gpg_error_from_syserror (); - if (dotlock_take (lock, 0)) - { - err = gpg_error_from_syserror (); - goto leave; - } - else - err = 0; - - /* Check again that the file does not exist. */ - { - struct stat sb; - - if (!stat (filename, &sb)) - { - err = gpg_error (GPG_ERR_EEXIST); - goto leave; - } - } /* And a possible detached file or directory may not exist either. */ err = be_get_detached_name (ctrl->conttype, filename, &detachedname, &detachedisdir);