Add dotlock_get_fd and dotlock_set_fd.
authorWerner Koch <wk@gnupg.org>
Thu, 29 Sep 2011 14:51:48 +0000 (16:51 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 29 Sep 2011 14:51:48 +0000 (16:51 +0200)
common/ChangeLog
common/dotlock.c
common/dotlock.h

index 7ed2673..1c067cd 100644 (file)
@@ -4,6 +4,7 @@
        [DOTLOCK_USE_PTHREAD] (all_lockfiles_mutex): New.
        (LOCK_all_lockfiles, UNLOCK_all_lockfiles): New.  Use them to
        protect access to all_lockfiles.
+       (dotlock_set_fd, dotlock_get_fd): New.
 
 2011-09-28  Werner Koch  <wk@g10code.com>
 
index 1463944..c65f6f6 100644 (file)
      if (dotlock_release (h))
        error ("error releasing lock: %s\n", strerror (errno));
 
-   or, if the lock file is not anymore needed, you may call
-   dotlock_destroy.
+   or, if the lock file is not anymore needed, you may just call
+   dotlock_destroy.  However dotlock_release does some extra checks
+   before releasing the lock and prints diagnostics to help detecting
+   bugs.
 
    If you want to explicitly destroy all lock files you may call
 
 
    before any locks are created.
 
+   There are two convenience functions to store an integer (e.g. a
+   file descriptor) value with the handle:
+
+     void dotlock_set_fd (dotlock_t h, int fd);
+     int  dotlock_get_fd (dotlock_t h);
+
+   If nothing has been stored dotlock_get_fd returns -1.
+
+
 
    How to build:
    =============
@@ -336,6 +347,8 @@ struct dotlock_handle
   unsigned int disable:1;    /* If true, locking is disabled.         */
   unsigned int use_o_excl:1; /* Use open (O_EXCL) for locking.        */
 
+  int extra_fd;              /* A place for the caller to store an FD.  */
+
 #ifdef HAVE_DOSISH_SYSTEM
   HANDLE lockhd;       /* The W32 handle of the lock file.      */
 #else /*!HAVE_DOSISH_SYSTEM */
@@ -769,6 +782,7 @@ dotlock_create (const char *file_to_lock, unsigned int flags)
   h = jnlib_calloc (1, sizeof *h);
   if (!h)
     return NULL;
+  h->extra_fd = -1;
 
   if (never_lock)
     {
@@ -789,6 +803,24 @@ dotlock_create (const char *file_to_lock, unsigned int flags)
 
 
 \f
+/* Convenience function to store a file descriptor (or any any other
+   integer value) in the context of handle H.  */
+void
+dotlock_set_fd (dotlock_t h, int fd)
+{
+  h->extra_fd = fd;
+}
+
+/* Convenience function to retrieve a file descriptor (or any any other
+   integer value) stored in the context of handle H.  */
+int
+dotlock_get_fd (dotlock_t h)
+{
+  return h->extra_fd;
+}
+
+
+\f
 #ifdef HAVE_POSIX_SYSTEM
 /* Unix specific code of destroy_dotlock.  */
 static void
index 666d0b7..6ae7836 100644 (file)
@@ -27,6 +27,8 @@ typedef struct dotlock_handle *dotlock_t;
 
 void dotlock_disable (void);
 dotlock_t dotlock_create (const char *file_to_lock, unsigned int flags);
+void dotlock_set_fd (dotlock_t h, int fd);
+int  dotlock_get_fd (dotlock_t h);
 void dotlock_destroy (dotlock_t h);
 int dotlock_take (dotlock_t h, long timeout);
 int dotlock_release (dotlock_t h);