The following commit has been merged in the master branch:
commit 0cb6f131d85f48f0dc8a90ca1329af84c6f6ebc1
Author: Guillem Jover <guil...@debian.org>
Date:   Sun Sep 12 07:22:21 2010 +0200

    libdpkg: Refactor file locking error message handling
    
    Pass only the description of the resource being locked, and move generic
    error strings inside the file lock funtions. Instead of changing locking
    behaviour depending on the error strings passed, pass an explicit enum to
    select it.

diff --git a/lib/dpkg/dbmodify.c b/lib/dpkg/dbmodify.c
index fb2aeb2..0366ce4 100644
--- a/lib/dpkg/dbmodify.c
+++ b/lib/dpkg/dbmodify.c
@@ -195,9 +195,7 @@ modstatdb_lock(const char *admindir)
     }
   }
 
-  file_lock(&dblockfd, dblockfile,
-            _("unable to lock dpkg status database"),
-            _("status database area is locked by another process"));
+  file_lock(&dblockfd, FILE_LOCK_NOWAIT, dblockfile, _("dpkg status 
database"));
 
   free(dblockfile);
 }
diff --git a/lib/dpkg/file.c b/lib/dpkg/file.c
index 40fbbea..3c817ee 100644
--- a/lib/dpkg/file.c
+++ b/lib/dpkg/file.c
@@ -67,6 +67,7 @@ static void
 file_unlock_cleanup(int argc, void **argv)
 {
        int lockfd = *(int*)argv[0];
+       const char *lock_desc = argv[1];
        struct flock fl;
 
        assert(lockfd >= 0);
@@ -74,7 +75,7 @@ file_unlock_cleanup(int argc, void **argv)
        file_lock_setup(&fl, F_UNLCK);
 
        if (fcntl(lockfd, F_SETLK, &fl) == -1)
-               ohshite(_("unable to unlock dpkg status database"));
+               ohshite(_("unable to unlock %s"), lock_desc);
 }
 
 void
@@ -108,21 +109,28 @@ file_is_locked(int lockfd, const char *filename)
 /* lockfd must be allocated statically as its addresses is passed to
  * a cleanup handler. */
 void
-file_lock(int *lockfd, const char *filename,
-          const char *emsg, const char *emsg_eagain)
+file_lock(int *lockfd, enum file_lock_flags flags, const char *filename,
+          const char *desc)
 {
        struct flock fl;
+       int lock_cmd;
 
        setcloexec(*lockfd, filename);
 
        file_lock_setup(&fl, F_WRLCK);
 
-       if (fcntl(*lockfd, emsg_eagain ? F_SETLK : F_SETLKW, &fl) == -1) {
-               if (emsg_eagain && (errno == EACCES || errno == EAGAIN))
-                       ohshit(emsg_eagain);
-               ohshite(emsg);
+       if (flags == FILE_LOCK_WAIT)
+               lock_cmd = F_SETLKW;
+       else
+               lock_cmd = F_SETLK;
+
+       if (fcntl(*lockfd, lock_cmd, &fl) == -1) {
+               if (errno == EACCES || errno == EAGAIN)
+                       ohshit(_("%s is locked by another process"), desc);
+               else
+                       ohshite(_("unable to lock %s"), desc);
        }
 
-       push_cleanup(file_unlock_cleanup, ~0, NULL, 0, 1, lockfd);
+       push_cleanup(file_unlock_cleanup, ~0, NULL, 0, 2, lockfd, desc);
 }
 
diff --git a/lib/dpkg/file.h b/lib/dpkg/file.h
index 24dca2c..ce16c04 100644
--- a/lib/dpkg/file.h
+++ b/lib/dpkg/file.h
@@ -32,9 +32,14 @@ DPKG_BEGIN_DECLS
  */
 void file_copy_perms(const char *src, const char *dst);
 
+enum file_lock_flags {
+       FILE_LOCK_NOWAIT,
+       FILE_LOCK_WAIT,
+};
+
 bool file_is_locked(int lockfd, const char *filename);
-void file_lock(int *lockfd, const char *filename,
-               const char *emsg, const char *emsg_eagain);
+void file_lock(int *lockfd, enum file_lock_flags flags, const char *filename,
+               const char *desc);
 void file_unlock(void);
 
 DPKG_END_DECLS
diff --git a/lib/dpkg/trigdeferred.l b/lib/dpkg/trigdeferred.l
index 3be1e83..7bd4e91 100644
--- a/lib/dpkg/trigdeferred.l
+++ b/lib/dpkg/trigdeferred.l
@@ -126,8 +126,7 @@ trigdef_update_start(enum trigdef_updateflags uf, const 
char *admindir)
                        }
                }
 
-               file_lock(&lock_fd, fn.buf, _("unable to lock triggers area"),
-                         NULL);
+               file_lock(&lock_fd, FILE_LOCK_WAIT, fn.buf, _("triggers area"));
        } else {
                /* Dummy for pop_cleanups. */
                push_cleanup(NULL, 0, NULL, 0, 0);

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to