diff options
author | Guillem Jover <guillem@debian.org> | 2014-04-06 06:03:24 +0200 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2015-04-01 04:54:50 +0200 |
commit | ce4f0311e6e7a7b5125c4e881a0f2d3a8e1eea45 (patch) | |
tree | 8459663d6f36a9f83497b1f352d441dd599cc951 /dpkg-split | |
parent | 02d0c3228bbbd12a19bea77816ded88f7dd5f78e (diff) | |
download | dpkg-ce4f0311e6e7a7b5125c4e881a0f2d3a8e1eea45.tar.gz |
dpkg-split: Parse deb control file directly from stdin
This reduces the dpkg-deb calls to just one instead of one per field. In
addition we also reduce the parsing and dumping to a single instance.
Diffstat (limited to 'dpkg-split')
-rw-r--r-- | dpkg-split/split.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/dpkg-split/split.c b/dpkg-split/split.c index 47b9c3ee3..28ad64656 100644 --- a/dpkg-split/split.c +++ b/dpkg-split/split.c @@ -40,6 +40,7 @@ #include <dpkg/c-ctype.h> #include <dpkg/dpkg.h> #include <dpkg/dpkg-db.h> +#include <dpkg/parsedump.h> #include <dpkg/path.h> #include <dpkg/string.h> #include <dpkg/subproc.h> @@ -49,14 +50,16 @@ #include "dpkg-split.h" -static char * -deb_field(const char *filename, const char *field) +/** + * Parse the control file from a .deb package into a struct pkginfo. + */ +static struct pkginfo * +deb_parse_control(const char *filename) { - struct dpkg_error err; + struct parsedb_state *ps; + struct pkginfo *pkg; pid_t pid; int p[2]; - struct varbuf buf = VARBUF_INIT; - char *end; m_pipe(p); @@ -67,31 +70,23 @@ deb_field(const char *filename, const char *field) close(p[0]); close(p[1]); - execlp(BACKEND, BACKEND, "--field", filename, field, NULL); + execlp(BACKEND, BACKEND, "--info", filename, "control", NULL); ohshite(_("unable to execute %s (%s)"), _("package field value extraction"), BACKEND); } close(p[1]); - /* Parant reads from pipe. */ - varbuf_reset(&buf); - if (fd_vbuf_copy(p[0], &buf, -1, &err) < 0) - ohshit(_("cannot extract package field value from '%s': %s"), - filename, err.str); - varbuf_end_str(&buf); + /* Parent reads from pipe. */ + ps = parsedb_new(_("<dpkg-deb --info pipe>"), p[0], pdb_parse_binary); + parsedb_load(ps); + parsedb_parse(ps, &pkg); + parsedb_close(ps); close(p[0]); subproc_reap(pid, _("package field value extraction"), SUBPROC_NOPIPE); - /* Trim down trailing junk. */ - for (end = buf.buf + strlen(buf.buf) - 1; end - buf.buf >= 1; end--) - if (c_isspace(*end)) - *end = '\0'; - else - break; - - return varbuf_detach(&buf); + return pkg; } /* Cleanup filename for use in crippled msdos systems. */ @@ -118,11 +113,12 @@ static int mksplit(const char *file_src, const char *prefix, off_t maxpartsize, bool msdos) { + struct pkginfo *pkg; struct dpkg_error err; int fd_src; struct stat st; + const char *version; char hash[MD5HASHLEN + 1]; - char *package, *version, *arch; int nparts, curpart; off_t partsize; off_t cur_partsize, last_partsize; @@ -144,10 +140,8 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, file_src, err.str); lseek(fd_src, 0, SEEK_SET); - /* FIXME: Use libdpkg-deb. */ - package = deb_field(file_src, "Package"); - version = deb_field(file_src, "Version"); - arch = deb_field(file_src, "Architecture"); + pkg = deb_parse_control(file_src); + version = versiondescribe(&pkg->available.version, vdew_always); partsize = maxpartsize - HEADERALLOWANCE; last_partsize = st.st_size % partsize; @@ -157,7 +151,7 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, printf(P_("Splitting package %s into %d part: ", "Splitting package %s into %d parts: ", nparts), - package, nparts); + pkg->set->name, nparts); if (msdos) { char *t; @@ -212,9 +206,9 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, /* Write the debian-split part. */ varbuf_printf(&partmagic, "%s\n%s\n%s\n%s\n%jd\n%jd\n%d/%d\n%s\n", - SPLITVERSION, package, version, hash, + SPLITVERSION, pkg->set->name, version, hash, (intmax_t)st.st_size, (intmax_t)partsize, - curpart, nparts, arch); + curpart, nparts, pkg->available.arch->name); dpkg_ar_member_put_mem(file_dst.buf, fd_dst, PARTMAGIC, partmagic.buf, partmagic.used); varbuf_reset(&partmagic); @@ -234,10 +228,6 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, varbuf_destroy(&partname); varbuf_destroy(&partmagic); - free(package); - free(version); - free(arch); - free(prefixdir); free(msdos_prefix); |