[Reproducible-commits] [dpkg] 21/32: dpkg-deb: Refactor tarball packing into a new function

Jérémy Bobbio lunar at moszumanska.debian.org
Fri Nov 6 14:02:19 UTC 2015


This is an automated email from the git hooks/post-receive script.

lunar pushed a commit to branch pu/reproducible_builds
in repository dpkg.

commit 7a91341446851cd3594a8b752823b8c1f26d652a
Author: Guillem Jover <guillem at debian.org>
Date:   Tue Oct 13 17:39:53 2015 +0200

    dpkg-deb: Refactor tarball packing into a new function
---
 dpkg-deb/build.c | 87 ++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 56 insertions(+), 31 deletions(-)

diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c
index d2ea2f8..b364f9a 100644
--- a/dpkg-deb/build.c
+++ b/dpkg-deb/build.c
@@ -446,6 +446,59 @@ gen_dest_pathname_from_pkg(const char *dir, struct pkginfo *pkg)
   return path;
 }
 
+typedef void filenames_feed_func(const char *dir, int fd_out);
+
+/**
+ * Pack the contents of a directory into a tarball.
+ */
+static void
+tarball_pack(const char *dir, filenames_feed_func *tar_filenames_feeder,
+             struct compress_params *tar_compress_params, int fd_out)
+{
+  int pipe_filenames[2], pipe_tarball[2];
+  pid_t pid_tar, pid_comp;
+
+  /* Fork off a tar. We will feed it a list of filenames on stdin later. */
+  m_pipe(pipe_filenames);
+  m_pipe(pipe_tarball);
+  pid_tar = subproc_fork();
+  if (pid_tar == 0) {
+    m_dup2(pipe_filenames[0], 0);
+    close(pipe_filenames[0]);
+    close(pipe_filenames[1]);
+    m_dup2(pipe_tarball[1], 1);
+    close(pipe_tarball[0]);
+    close(pipe_tarball[1]);
+
+    if (chdir(dir))
+      ohshite(_("failed to chdir to '%.255s'"), dir);
+
+    execlp(TAR, "tar", "-cf", "-", "--format=gnu", "--null", "--no-unquote",
+                       "--no-recursion", "-T", "-", NULL);
+    ohshite(_("unable to execute %s (%s)"), "tar -cf", TAR);
+  }
+  close(pipe_filenames[0]);
+  close(pipe_tarball[1]);
+
+  /* Of course we should not forget to compress the archive as well. */
+  pid_comp = subproc_fork();
+  if (pid_comp == 0) {
+    close(pipe_filenames[1]);
+    compress_filter(tar_compress_params, pipe_tarball[0], fd_out,
+                    _("compressing tar member"));
+    exit(0);
+  }
+  close(pipe_tarball[0]);
+
+  /* All the pipes are set, now lets start feeding filenames to tar. */
+  tar_filenames_feeder(dir, pipe_filenames[1]);
+
+  /* All done, clean up wait for tar and <compress> to finish their job. */
+  close(pipe_filenames[1]);
+  subproc_reap(pid_comp, _("<compress> from tar -cf"), 0);
+  subproc_reap(pid_tar, "tar -cf", 0);
+}
+
 /**
  * Overly complex function that builds a .deb file.
  */
@@ -459,7 +512,7 @@ do_build(const char *const *argv)
   char *debar;
   char *tfbuf;
   int arfd;
-  int p1[2], p2[2], gzfd;
+  int p1[2], gzfd;
   pid_t c1, c2;
 
   /* Decode our arguments. */
@@ -597,38 +650,10 @@ do_build(const char *const *argv)
   } else {
     internerr("unknown deb format version %d.%d", deb_format.major, deb_format.minor);
   }
-  /* Fork off a tar. We will feed it a list of filenames on stdin later. */
-  m_pipe(p1);
-  m_pipe(p2);
-  c1 = subproc_fork();
-  if (!c1) {
-    m_dup2(p1[0],0); close(p1[0]); close(p1[1]);
-    m_dup2(p2[1],1); close(p2[0]); close(p2[1]);
-    if (chdir(dir))
-      ohshite(_("failed to chdir to '%.255s'"), dir);
-    execlp(TAR, "tar", "-cf", "-", "--format=gnu", "--null", "--no-unquote",
-                       "--no-recursion", "-T", "-", NULL);
-    ohshite(_("unable to execute %s (%s)"), "tar -cf", TAR);
-  }
-  close(p1[0]);
-  close(p2[1]);
-  /* Of course we should not forget to compress the archive as well. */
-  c2 = subproc_fork();
-  if (!c2) {
-    close(p1[1]);
-    compress_filter(&compress_params, p2[0], gzfd, _("compressing data member"));
-    exit(0);
-  }
-  close(p2[0]);
 
-  /* All the pipes are set, now lets walk the tree, and start feeding
-   * filenames to tar. */
-  file_treewalk_feed(dir, p1[1]);
+  /* Pack the directory into a tarball, feeding files from the callback. */
+  tarball_pack(dir, file_treewalk_feed, &compress_params, gzfd);
 
-  /* All done, clean up wait for tar and <compress> to finish their job. */
-  close(p1[1]);
-  subproc_reap(c2, _("<compress> from tar -cf"), 0);
-  subproc_reap(c1, "tar -cf", 0);
   /* Okay, we have data.tar as well now, add it to the ar wrapper. */
   if (deb_format.major == 2) {
     char datamember[16 + 1];

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/dpkg.git



More information about the Reproducible-commits mailing list