diff options
author | Guillem Jover <guillem@debian.org> | 2013-08-24 01:04:21 +0200 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2013-10-17 08:22:06 +0200 |
commit | 3a30cb6743e05e43b664335faaa889d090403e24 (patch) | |
tree | 9254bc6189d332120f66e0b3829cf47ffc1583cc /dpkg-deb | |
parent | 8911538401d79c17ea347de91ef131365aa86934 (diff) | |
download | dpkg-3a30cb6743e05e43b664335faaa889d090403e24.tar.gz |
dpkg-deb: Refactor file_treewalk_feed() out from do_build()
Diffstat (limited to 'dpkg-deb')
-rw-r--r-- | dpkg-deb/build.c | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c index b67058c1f..8e84a9d55 100644 --- a/dpkg-deb/build.c +++ b/dpkg-deb/build.c @@ -167,6 +167,55 @@ file_info_list_free(struct file_info *fi) } } +static void +file_treewalk_feed(const char *dir, int fd_out) +{ + int pipefd[2]; + pid_t pid; + struct file_info *fi; + struct file_info *symlist = NULL; + struct file_info *symlist_end = NULL; + + m_pipe(pipefd); + + pid = subproc_fork(); + if (pid == 0) { + m_dup2(pipefd[1], 1); + close(pipefd[0]); + close(pipefd[1]); + + if (chdir(dir)) + ohshite(_("failed to chdir to `%.255s'"), dir); + + execlp(FIND, "find", ".", "-path", "./" BUILDCONTROLDIR, "-prune", "-o", + "-print0", NULL); + ohshite(_("unable to execute %s (%s)"), "find", FIND); + } + close(pipefd[1]); + + /* We need to reorder the files so we can make sure that symlinks + * will not appear before their target. */ + while ((fi = file_info_get(dir, pipefd[0])) != NULL) { + if (S_ISLNK(fi->st.st_mode)) { + file_info_list_append(&symlist, &symlist_end, fi); + } else { + if (fd_write(fd_out, fi->fn, strlen(fi->fn) + 1) < 0) + ohshite(_("failed to write filename to tar pipe (%s)"), + _("data member")); + file_info_free(fi); + } + } + + close(pipefd[0]); + subproc_wait_check(pid, "find", 0); + + for (fi = symlist; fi; fi = fi->next) + if (fd_write(fd_out, fi->fn, strlen(fi->fn) + 1) < 0) + ohshite(_("failed to write filename to tar pipe (%s)"), _("data member")); + + file_info_list_free(symlist); +} + static const char *const maintainerscripts[] = { PREINSTFILE, POSTINSTFILE, @@ -393,11 +442,8 @@ do_build(const char *const *argv) bool subdir; char *tfbuf; int arfd; - int p1[2], p2[2], p3[2], gzfd; - pid_t c1,c2,c3; - struct file_info *fi; - struct file_info *symlist = NULL; - struct file_info *symlist_end = NULL; + int p1[2], p2[2], gzfd; + pid_t c1, c2; /* Decode our arguments. */ dir = *argv++; @@ -565,39 +611,12 @@ do_build(const char *const *argv) } close(p2[0]); - /* All the pipes are set, now lets run find, and start feeding + /* All the pipes are set, now lets walk the tree, and start feeding * filenames to tar. */ - m_pipe(p3); - c3 = subproc_fork(); - if (!c3) { - m_dup2(p3[1],1); close(p3[0]); close(p3[1]); - if (chdir(dir)) - ohshite(_("failed to chdir to `%.255s'"), dir); - execlp(FIND, "find", ".", "-path", "./" BUILDCONTROLDIR, "-prune", "-o", - "-print0", NULL); - ohshite(_("unable to execute %s (%s)"), "find", FIND); - } - close(p3[1]); - /* We need to reorder the files so we can make sure that symlinks - * will not appear before their target. */ - while ((fi = file_info_get(dir, p3[0])) != NULL) - if (S_ISLNK(fi->st.st_mode)) - file_info_list_append(&symlist, &symlist_end, fi); - else { - if (fd_write(p1[1], fi->fn, strlen(fi->fn) + 1) < 0) - ohshite(_("failed to write filename to tar pipe (%s)"), - _("data member")); - file_info_free(fi); - } - close(p3[0]); - subproc_wait_check(c3, "find", 0); + file_treewalk_feed(dir, p1[1]); - for (fi= symlist;fi;fi= fi->next) - if (fd_write(p1[1], fi->fn, strlen(fi->fn) + 1) < 0) - ohshite(_("failed to write filename to tar pipe (%s)"), _("data member")); /* All done, clean up wait for tar and gzip to finish their job. */ close(p1[1]); - file_info_list_free(symlist); subproc_wait_check(c2, _("<compress> from tar -cf"), 0); subproc_wait_check(c1, "tar -cf", 0); /* Okay, we have data.tar as well now, add it to the ar wrapper. */ |