[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#739411: udpkg: Support for data.tar, control.tar and control.tar.xz



On Tue, 2014-02-18 at 13:01:48 +0100, Guillem Jover wrote:
> Package: udpkg
> Version: 1.16
> Severity: wishlist
> Tags: patch
> X-Debbugs-CC: Philipp Kern <pkern@debian.org>

> Here's a patch series adding data.tar, control.tar and control.tar.xz
> support, the uncompressed member support just out of completeness. To
> create a deb package with a different control.tar compression you can
> use «dpkg-deb --uniform-compression pkg/» for example.
> 
> Note I've only tested «udpkg -c» and «udpkg -f», the changes in unpacking
> are pretty obvious, but testing them would be nice. I've also used cat
> for the uncompressed members as I didn't think further optimization there
> was worth it(?). I've also tried to use the prevailing coding-style,
> which in some cases conflicted with the immediate surrounding code.

And then forgot to attach the patches…

Thanks,
Guillem
From b806fc9a73e79b561fad9e40e34d44d86031e4a1 Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@debian.org>
Date: Sun, 16 Feb 2014 02:25:10 +0100
Subject: [PATCH 1/4] Pass member_base as an argument to get_compression_type()

Allow other member base names, instead of hardcoding data.tar.
---
 udpkg.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/udpkg.c b/udpkg.c
index 2adfd16..73fa9d8 100644
--- a/udpkg.c
+++ b/udpkg.c
@@ -163,7 +163,9 @@ static const char *decompression_tool (const compression_type t) {
 	}
 }
 
-static compression_type get_compression_type (struct package_t *pkg) {
+static compression_type get_compression_type(struct package_t *pkg,
+	const char *member_base)
+{
 	FILE *infp = NULL;
 	char buf[1024];
 	char *extension = NULL;
@@ -177,8 +179,8 @@ static compression_type get_compression_type (struct package_t *pkg) {
 	}
 
 	while (fgets(buf, sizeof(buf), infp)) {
-		if (strncmp(buf, data_member_base, strlen(data_member_base)) == 0) {
-			extension = buf + strlen(data_member_base);
+		if (strncmp(buf, member_base, strlen(member_base)) == 0) {
+			extension = buf + strlen(member_base);
 			if (extension[strlen(extension) - 1] == '\n')
 				extension[strlen(extension) - 1] = '\0';
 			break;
@@ -188,7 +190,7 @@ static compression_type get_compression_type (struct package_t *pkg) {
 
 	if (extension == NULL) {
 		FPRINTF(stderr, "No %s* found in %s\n",
-			data_member_base, pkg->file);
+			member_base, pkg->file);
 		return unknown_compression;
 	}
 
@@ -200,7 +202,7 @@ static compression_type get_compression_type (struct package_t *pkg) {
 	}
 	else {
 		FPRINTF(stderr, "Invalid compression type for %s* of %s\n",
-			data_member_base, pkg->file);
+			member_base, pkg->file);
 		return unknown_compression;
 	}
 }
@@ -226,7 +228,7 @@ static int dpkg_dounpack(struct package_t *pkg)
 
 	DPRINTF("Unpacking %s\n", pkg->package);
 
-	compression_type = get_compression_type(pkg);
+	compression_type = get_compression_type(pkg, data_member_base);
 	if (compression_type == unknown_compression)
 		return 1;
 
@@ -556,7 +558,7 @@ static int dpkg_contents(struct package_t *pkg)
 
 	reqarg(pkg);
 
-	compression_type = get_compression_type(pkg);
+	compression_type = get_compression_type(pkg, data_member_base);
 	if (compression_type == unknown_compression)
 		return 1;
 
-- 
1.9.0.rc3.244.g3497008

From 193c1b896291da42844953bdf693245ec4c8adaa Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@debian.org>
Date: Sun, 16 Feb 2014 02:28:34 +0100
Subject: [PATCH 2/4] Add support for uncompressed deb members

---
 udpkg.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/udpkg.c b/udpkg.c
index 73fa9d8..ef6bdf7 100644
--- a/udpkg.c
+++ b/udpkg.c
@@ -18,7 +18,7 @@
 static int force_configure = 0;
 static int loadtemplate = 1;
 
-static const char *data_member_base = "data.tar.";
+static const char *data_member_base = "data.tar";
 
 /* 
  * Main udpkg implementation routines
@@ -144,21 +144,24 @@ typedef enum compression_type compression_type;
 enum compression_type {
 	gz_compression,
 	xz_compression,
+	no_compression,
 	unknown_compression,
 };
 
 static const char *compression_extension (const compression_type t) {
 	switch (t) {
-		case gz_compression: return "gz";
-		case xz_compression: return "xz";
+		case gz_compression: return ".gz";
+		case xz_compression: return ".xz";
+		case no_compression: return "";
 		default: return "";
 	}
 }
 
 static const char *decompression_tool (const compression_type t) {
 	switch (t) {
-		case gz_compression: return "gunzip";
-		case xz_compression: return "unxz";
+		case gz_compression: return "gunzip -c";
+		case xz_compression: return "unxz -c";
+		case no_compression: return "cat";
 		default: return "";
 	}
 }
@@ -200,6 +203,10 @@ static compression_type get_compression_type(struct package_t *pkg,
 	else if (strcmp(extension, compression_extension(xz_compression)) == 0) {
 		return xz_compression;
 	}
+	else if (strcmp(extension, compression_extension(no_compression)) == 0)
+	{
+		return no_compression;
+	}
 	else {
 		FPRINTF(stderr, "Invalid compression type for %s* of %s\n",
 			member_base, pkg->file);
@@ -239,7 +246,7 @@ static int dpkg_dounpack(struct package_t *pkg)
 		return 1;
 	}
 
-	snprintf(buf, sizeof(buf), "ar -p %s %s%s|%s -c|tar -x",
+	snprintf(buf, sizeof(buf), "ar -p %s %s%s|%s|tar -x",
 		pkg->file, data_member_base,
 		compression_extension(compression_type),
 		decompression_tool(compression_type));
@@ -305,7 +312,7 @@ static int dpkg_dounpack(struct package_t *pkg)
 		 * so oddly...
 		 */
 		snprintf(buf, sizeof(buf),
-			"ar -p %s %s%s|%s -c|tar -t",
+			"ar -p %s %s%s|%s|tar -t",
 			pkg->file, data_member_base,
 			compression_extension(compression_type),
 			decompression_tool(compression_type));
-- 
1.9.0.rc3.244.g3497008

From 2908ab0a20d5a1153325af3a81949674a3efdc32 Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@debian.org>
Date: Sun, 16 Feb 2014 02:35:44 +0100
Subject: [PATCH 3/4] Add support for control.tar and control.tar.xz

---
 udpkg.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/udpkg.c b/udpkg.c
index ef6bdf7..1715222 100644
--- a/udpkg.c
+++ b/udpkg.c
@@ -19,6 +19,7 @@ static int force_configure = 0;
 static int loadtemplate = 1;
 
 static const char *data_member_base = "data.tar";
+static const char *control_member_base = "control.tar";
 
 /* 
  * Main udpkg implementation routines
@@ -382,6 +383,7 @@ static int dpkg_unpackcontrol(struct package_t *pkg)
 	char *p;
 	char buf[1024], buf2[1024];
 	FILE *f;
+	compression_type compression_type;
 
 	p = strrchr(pkg->file, '/');
 	if (p) p++; else p = pkg->file;
@@ -390,6 +392,10 @@ static int dpkg_unpackcontrol(struct package_t *pkg)
 	*p = 0;
 	p = pkg->package;
 
+	compression_type = get_compression_type(pkg, control_member_base);
+	if (compression_type == unknown_compression)
+		return 1;
+
 	cwd = getcwd(0, 0);
 	snprintf(buf, sizeof(buf), "%s%s", DPKGCIDIR, pkg->package);
 	DPRINTF("dir = %s\n", buf);
@@ -403,8 +409,10 @@ static int dpkg_unpackcontrol(struct package_t *pkg)
 		FPRINTF(stderr, "chdir %s: %s\n", buf, strerror(errno));
 		return 1;
 	}
-	snprintf(buf, sizeof(buf), "ar -p %s control.tar.gz|tar -xzf -",
-		pkg->file);
+	snprintf(buf, sizeof(buf), "ar -p %s %s%s|%s|tar -xf -",
+		pkg->file, control_member_base,
+		compression_extension(compression_type),
+		decompression_tool(compression_type));
 	if ((r = di_exec_shell_log(buf)) != 0)
 	{
 		FPRINTF(stderr, "%s exited with status %d\n", buf, r);
@@ -548,10 +556,18 @@ static int dpkg_fields(struct package_t *pkg)
 {  
 	char *command;
 	int ret;
+	compression_type compression_type;
 
 	reqarg(pkg);
 
-	command = xasprintf("ar -p %s control.tar.gz|tar -xzOf - ./control", pkg->file);
+	compression_type = get_compression_type(pkg, control_member_base);
+	if (compression_type == unknown_compression)
+		return 1;
+
+	command = xasprintf("ar -p %s %s%s|%s|tar -xOf - ./control",
+		pkg->file, control_member_base,
+		compression_extension(compression_type),
+		decompression_tool(compression_type));
 	ret = system(command);
 	free(command);
 	return ret;
-- 
1.9.0.rc3.244.g3497008

From c9b009dd7fc451098dda30f18b016650608a0dca Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@debian.org>
Date: Sun, 16 Feb 2014 07:32:03 +0100
Subject: [PATCH 4/4] Update .gitignore

---
 .gitignore | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.gitignore b/.gitignore
index 9cdaca8..5d8f629 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,14 @@
+*.o
 autom4te.cache
 build-stamp
 config.log
 config.h
+config.h.in
 config.cache
+config.guess
 config.status
+config.sub
+configure
 makefile
 udpkg
 
-- 
1.9.0.rc3.244.g3497008


Reply to: