summaryrefslogtreecommitdiff
path: root/dpkg-split
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2014-04-06 06:03:24 +0200
committerGuillem Jover <guillem@debian.org>2015-04-01 04:54:50 +0200
commitce4f0311e6e7a7b5125c4e881a0f2d3a8e1eea45 (patch)
tree8459663d6f36a9f83497b1f352d441dd599cc951 /dpkg-split
parent02d0c3228bbbd12a19bea77816ded88f7dd5f78e (diff)
downloaddpkg-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.c54
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);