Procházet zdrojové kódy

libdpkg: Refactor modstatdb_can_lock() out from modstatdb_lock()

Guillem Jover před 15 roky
rodič
revize
62b91d4678
3 změnil soubory, kde provedl 20 přidání a 7 odebrání
  1. 18 7
      lib/dpkg/dbmodify.c
  2. 1 0
      lib/dpkg/dpkg-db.h
  3. 1 0
      lib/dpkg/libdpkg.Versions

+ 18 - 7
lib/dpkg/dbmodify.c

@@ -209,18 +209,29 @@ modstatdb_is_locked(void)
   return locked;
 }
 
-void
-modstatdb_lock(void)
+bool
+modstatdb_can_lock(void)
 {
+  if (dblockfd >= 0)
+    return true;
+
+  dblockfd = open(lockfile, O_RDWR | O_CREAT | O_TRUNC, 0660);
   if (dblockfd == -1) {
-    dblockfd = open(lockfile, O_RDWR | O_CREAT | O_TRUNC, 0660);
-    if (dblockfd == -1) {
-      if (errno == EACCES || errno == EPERM)
-        ohshit(_("you do not have permission to lock the dpkg status database"));
+    if (errno == EACCES || errno == EPERM)
+      return false;
+    else
       ohshite(_("unable to open/create status database lockfile"));
-    }
   }
 
+  return true;
+}
+
+void
+modstatdb_lock(void)
+{
+  if (!modstatdb_can_lock())
+    ohshit(_("you do not have permission to lock the dpkg status database"));
+
   file_lock(&dblockfd, FILE_LOCK_NOWAIT, lockfile, _("dpkg status database"));
 }
 

+ 1 - 0
lib/dpkg/dpkg-db.h

@@ -225,6 +225,7 @@ enum modstatdb_rw {
 void modstatdb_init(const char *admindir);
 void modstatdb_done(void);
 bool modstatdb_is_locked(void);
+bool modstatdb_can_lock(void);
 void modstatdb_lock(void);
 void modstatdb_unlock(void);
 enum modstatdb_rw modstatdb_open(const char *admindir, enum modstatdb_rw reqrwflags);

+ 1 - 0
lib/dpkg/libdpkg.Versions

@@ -225,6 +225,7 @@ LIBDPKG_PRIVATE {
 	# Log based package on-disk database support
 	modstatdb_init;
 	modstatdb_is_locked;
+	modstatdb_can_lock;
 	modstatdb_lock;
 	modstatdb_unlock;
 	modstatdb_open;