Add a flag parameter to dotlock_create.

This allows us to extend this function in the future.
This commit is contained in:
Werner Koch 2011-09-28 15:41:58 +02:00
parent 567a31c2a0
commit ed8e267859
15 changed files with 37 additions and 24 deletions

View File

@ -2,6 +2,7 @@
* dotlock.c (dotlock_take, dotlock_take_unix, dotlock_take_w32):
Implement arbitrary timeout values.
(dotlock_create): Add arg FLAGS for future extensions.
2011-09-27 Werner Koch <wk@g10code.com>

View File

@ -287,7 +287,7 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name,
if (!fname)
return gpg_error_from_syserror ();
*lock = dotlock_create (fname);
*lock = dotlock_create (fname, 0);
xfree (fname);
if (!*lock)
return gpg_error_from_syserror ();

View File

@ -53,7 +53,7 @@
At program initialization time, the module should be explicitly
initialized:
dotlock_create (NULL);
dotlock_create (NULL, 0);
This installs an atexit handler and may also initialize mutex etc.
It is optional for non-threaded applications. Only the first call
@ -64,7 +64,7 @@
dotlock_t h
h = dotlock_create (fname);
h = dotlock_create (fname, 0);
if (!h)
error ("error creating lock file: %s\n", strerror (errno));
@ -656,17 +656,19 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
#ifdef HAVE_W32CE_SYSTEM
wchar_t *wname = utf8_to_wchar (h->lockname);
h->lockhd = INVALID_HANDLE_VALUE;
if (wname)
h->lockhd = CreateFile (wname,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, 0, NULL);
else
h->lockhd = INVALID_HANDLE_VALUE;
jnlib_free (wname);
#else
h->lockhd = CreateFile (h->lockname,
#endif
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, 0, NULL);
#ifdef HAVE_W32CE_SYSTEM
jnlib_free (wname);
#endif
}
if (h->lockhd == INVALID_HANDLE_VALUE)
@ -696,12 +698,15 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
POSIX systems a temporary file ".#lk.<hostname>.pid[.threadid] is
used.
FLAGS must be 0.
The function returns an new handle which needs to be released using
destroy_dotlock but gets also released at the termination of the
process. On error NULL is returned.
*/
dotlock_t
dotlock_create (const char *file_to_lock)
dotlock_create (const char *file_to_lock, unsigned int flags)
{
static int initialized;
dotlock_t h;
@ -715,6 +720,12 @@ dotlock_create (const char *file_to_lock)
if ( !file_to_lock )
return NULL; /* Only initialization was requested. */
if (flags)
{
jnlib_set_errno (EINVAL);
return NULL;
}
h = jnlib_calloc (1, sizeof *h);
if (!h)
return NULL;

View File

@ -26,8 +26,8 @@ struct dotlock_handle;
typedef struct dotlock_handle *dotlock_t;
void dotlock_disable (void);
dotlock_t dotlock_create (const char *file_to_lock);
void dotlock_destroy ( dotlock_t h );
dotlock_t dotlock_create (const char *file_to_lock, unsigned int flags);
void dotlock_destroy (dotlock_t h);
int dotlock_take (dotlock_t h, long timeout);
int dotlock_release (dotlock_t h);
void dotlock_remove_lockfiles (void);

View File

@ -90,7 +90,7 @@ lock_and_unlock (const char *fname)
{
dotlock_t h;
h = dotlock_create (fname);
h = dotlock_create (fname, 0);
if (!h)
die ("error creating lock file for `%s': %s", fname, strerror (errno));
inf ("lock created");
@ -129,7 +129,7 @@ main (int argc, char **argv)
sigaction (SIGINT, &nact, NULL);
}
dotlock_create (NULL); /* Initialize (optional). */
dotlock_create (NULL, 0); /* Initialize (optional). */
lock_and_unlock (fname);

View File

@ -1969,7 +1969,7 @@ main (int argc, char **argv)
gnupg_init_signals (0, emergency_cleanup);
dotlock_create (NULL); /* Register lock file cleanup. */
dotlock_create (NULL, 0); /* Register lock file cleanup. */
opt.session_env = session_env_new ();
if (!opt.session_env)

View File

@ -507,9 +507,10 @@ dotlock_disable (void)
}
dotlock_t
dotlock_create (const char *file_to_lock)
dotlock_create (const char *file_to_lock, unsigned int flags)
{
(void)file_to_lock;
(void)flags;
return NULL;
}

View File

@ -136,7 +136,7 @@ maybe_create_keyring (char *filename, int force)
/* To avoid races with other instances of gpg trying to create or
update the keyring (it is removed during an update for a short
time), we do the next stuff in a locked state. */
lockhd = dotlock_create (filename);
lockhd = dotlock_create (filename, 0);
if (!lockhd)
{
/* A reason for this to fail is that the directory is not

View File

@ -306,7 +306,7 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
if (!keyring_is_writable(kr))
continue;
if (!kr->lockhd) {
kr->lockhd = dotlock_create( kr->fname );
kr->lockhd = dotlock_create (kr->fname, 0);
if (!kr->lockhd) {
log_info ("can't allocate lock for `%s'\n", kr->fname );
rc = G10ERR_GENERAL;

View File

@ -544,7 +544,7 @@ tdbio_set_dbname( const char *new_dbname, int create )
db_name = fname;
#ifdef __riscos__
if( !lockhandle )
lockhandle = dotlock_create (db_name);
lockhandle = dotlock_create (db_name, 0);
if( !lockhandle )
log_fatal( _("can't create lock for `%s'\n"), db_name );
if( dotlock_make (lockhandle, -1) )
@ -567,7 +567,7 @@ tdbio_set_dbname( const char *new_dbname, int create )
#ifndef __riscos__
if( !lockhandle )
lockhandle = dotlock_create (db_name);
lockhandle = dotlock_create (db_name, 0);
if( !lockhandle )
log_fatal( _("can't create lock for `%s'\n"), db_name );
#endif /* !__riscos__ */
@ -608,7 +608,7 @@ open_db()
assert( db_fd == -1 );
if (!lockhandle )
lockhandle = dotlock_create (db_name);
lockhandle = dotlock_create (db_name, 0);
if (!lockhandle )
log_fatal( _("can't create lock for `%s'\n"), db_name );
#ifdef __riscos__

View File

@ -246,7 +246,7 @@ g13_create_container (ctrl_t ctrl, const char *filename, strlist_t keys)
/* 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);
lock = dotlock_create (filename, 0);
if (!lock)
return gpg_error_from_syserror ();
if (dotlock_take (lock, 0))

View File

@ -383,7 +383,7 @@ main ( int argc, char **argv)
gnupg_init_signals (0, emergency_cleanup);
dotlock_create (NULL); /* Register locking cleanup. */
dotlock_create (NULL, 0); /* Register locking cleanup. */
opt.session_env = session_env_new ();
if (!opt.session_env)

View File

@ -273,7 +273,7 @@ g13_mount_container (ctrl_t ctrl, const char *filename, const char *mountpoint)
}
/* Try to take a lock. */
lock = dotlock_create (filename);
lock = dotlock_create (filename, 0);
if (!lock)
{
xfree (mountpoint_buffer);

View File

@ -928,7 +928,7 @@ main ( int argc, char **argv)
gnupg_init_signals (0, emergency_cleanup);
dotlock_create (NULL); /* Register lockfile cleanup. */
dotlock_create (NULL, 0); /* Register lockfile cleanup. */
opt.session_env = session_env_new ();
if (!opt.session_env)

View File

@ -214,7 +214,7 @@ keydb_add_resource (const char *url, int force, int secret, int *auto_created)
all_resources[used_resources].secret = secret;
all_resources[used_resources].lockhandle
= dotlock_create (filename);
= dotlock_create (filename, 0);
if (!all_resources[used_resources].lockhandle)
log_fatal ( _("can't create lock for `%s'\n"), filename);