mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
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 <wk@gnupg.org>
This commit is contained in:
parent
3087197008
commit
dc1dbc43a6
@ -23,6 +23,7 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#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
|
||||
|
@ -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);
|
||||
|
31
g13/create.c
31
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user