The following commit has been merged in the master branch:
commit 25f368cb9756f4fe238aff9f0f7ee3b15e2e86a4
Author: Guillem Jover <guil...@debian.org>
Date:   Wed Sep 7 06:38:41 2011 +0200

    dpkg: Refactor control directory creation on unpack

diff --git a/src/processarc.c b/src/processarc.c
index 811b5f2..09269b2 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -154,6 +154,45 @@ deb_verify(const char *filename)
   }
 }
 
+static char *
+get_control_dir(char *cidir)
+{
+  if (f_noact) {
+    char *tmpdir;
+
+    tmpdir = mkdtemp(path_make_temp_template("dpkg"));
+    if (tmpdir == NULL)
+      ohshite(_("unable to create temporary directory"));
+
+    cidir = m_realloc(cidir, strlen(tmpdir) + MAXCONTROLFILENAME + 10);
+
+    strcpy(cidir, tmpdir);
+
+    free(tmpdir);
+  } else {
+    const char *admindir;
+
+    admindir = dpkg_db_get_dir();
+
+    /* The admindir length is always constant on a dpkg execution run. */
+    if (cidir == NULL)
+      cidir = m_malloc(strlen(admindir) + sizeof(CONTROLDIRTMP) +
+                       MAXCONTROLFILENAME + 10);
+
+    /* We want it to be on the same filesystem so that we can
+     * use rename(2) to install the postinst &c. */
+    strcpy(cidir, admindir);
+    strcat(cidir, "/" CONTROLDIRTMP);
+
+    /* Make sure the control information directory is empty. */
+    ensure_pathname_nonexisting(cidir);
+  }
+
+  strcat(cidir, "/");
+
+  return cidir;
+}
+
 #define MAXCONFLICTORS 20
 
 static struct pkginfo *conflictor[MAXCONFLICTORS];
@@ -381,38 +420,11 @@ void process_archive(const char *filename) {
   if (!f_nodebsig)
     deb_verify(filename);
 
-  if (f_noact) {
-    char *tmpdir;
-
-    tmpdir = mkdtemp(path_make_temp_template("dpkg"));
-    if (!tmpdir)
-      ohshite(_("unable to create temporary directory"));
-
-    cidir = m_realloc(cidir, strlen(tmpdir) + MAXCONTROLFILENAME + 10);
-    strcpy(cidir, tmpdir);
-    strcat(cidir,"/");
-
-    cidirrest = cidir + strlen(cidir);
-
-    free(tmpdir);
-  } else {
-    const char *admindir = dpkg_db_get_dir();
-
-    /* We want it to be on the same filesystem so that we can
-     * use rename(2) to install the postinst &c. */
-    if (!cidir)
-      cidir = m_malloc(strlen(admindir) + sizeof(CONTROLDIRTMP) +
-                       MAXCONTROLFILENAME + 10);
-    strcpy(cidir,admindir);
-    strcat(cidir, "/" CONTROLDIRTMP);
-
-    ensure_pathname_nonexisting(cidir);
-
-    strcat(cidir, "/");
-    cidirrest = cidir + strlen(cidir);
-  }
-
+  /* Get the control information directory. */
+  cidir = get_control_dir(cidir);
+  cidirrest = cidir + strlen(cidir);
   push_cleanup(cu_cidir, ~0, NULL, 0, 2, (void *)cidir, (void *)cidirrest);
+
   pid = subproc_fork();
   if (pid == 0) {
     cidirrest[-1] = '\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