From ed8e267859a00233fee89a6b1b7fb3d74ceced96 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 28 Sep 2011 15:41:58 +0200 Subject: [PATCH] Add a flag parameter to dotlock_create. This allows us to extend this function in the future. --- common/ChangeLog | 1 + common/asshelp.c | 2 +- common/dotlock.c | 25 ++++++++++++++++++------- common/dotlock.h | 4 ++-- common/t-dotlock.c | 4 ++-- g10/gpg.c | 2 +- g10/gpgv.c | 3 ++- g10/keydb.c | 2 +- g10/keyring.c | 2 +- g10/tdbio.c | 6 +++--- g13/create.c | 2 +- g13/g13.c | 2 +- g13/mount.c | 2 +- sm/gpgsm.c | 2 +- sm/keydb.c | 2 +- 15 files changed, 37 insertions(+), 24 deletions(-) diff --git a/common/ChangeLog b/common/ChangeLog index 0f66a4122..da016bd7c 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -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 diff --git a/common/asshelp.c b/common/asshelp.c index 96d9a242a..c5d8bdf84 100644 --- a/common/asshelp.c +++ b/common/asshelp.c @@ -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 (); diff --git a/common/dotlock.c b/common/dotlock.c index e3e9fa3d2..37a1df3c6 100644 --- a/common/dotlock.c +++ b/common/dotlock.c @@ -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..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; diff --git a/common/dotlock.h b/common/dotlock.h index 5fb7891fa..666d0b72c 100644 --- a/common/dotlock.h +++ b/common/dotlock.h @@ -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); diff --git a/common/t-dotlock.c b/common/t-dotlock.c index a352f6e95..f81b95276 100644 --- a/common/t-dotlock.c +++ b/common/t-dotlock.c @@ -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); diff --git a/g10/gpg.c b/g10/gpg.c index 51661b366..c31a55863 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -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) diff --git a/g10/gpgv.c b/g10/gpgv.c index 9328343a1..8ca675289 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -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; } diff --git a/g10/keydb.c b/g10/keydb.c index e4b97096f..9b9b2ed5f 100644 --- a/g10/keydb.c +++ b/g10/keydb.c @@ -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 diff --git a/g10/keyring.c b/g10/keyring.c index 480c0e9bd..4eb26aab6 100644 --- a/g10/keyring.c +++ b/g10/keyring.c @@ -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; diff --git a/g10/tdbio.c b/g10/tdbio.c index 968d06b3c..1ab11f2e7 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -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__ diff --git a/g13/create.c b/g13/create.c index 60c1d3d31..f907ddbf6 100644 --- a/g13/create.c +++ b/g13/create.c @@ -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)) diff --git a/g13/g13.c b/g13/g13.c index 972a7eaaf..8e5532c47 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -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) diff --git a/g13/mount.c b/g13/mount.c index 198fde076..62eeca1f7 100644 --- a/g13/mount.c +++ b/g13/mount.c @@ -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); diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 87f94e210..dc9f2e032 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -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) diff --git a/sm/keydb.c b/sm/keydb.c index 9d1a6ef01..86301b337 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -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);