Re: Reimplement mksplit.pl in C

2010-04-04 Thread Marcelo E. Magallon
[ I subscribed to the list, thanks for the Cc:'s ]

On Sat, Apr 03, 2010 at 12:20:52PM -0600, Marcelo E. Magallon wrote:

>  The two cases I can think of are splitting an archive that
>  splits to a single piece, splitting to multiple pieces and
>  some failure cases.

 Right now I do something like:

 cat test.deb |
 build-tree/dpkg-split/mksplit test.deb 1024 test 4608 2048 no
 cp test.deb test.deb.orig
 dpkg-split -j test*.deb
 cmp test.deb test.deb.orig && echo OK

 but not much more.

 I did some refactoring, and reused a couple of bits of libdpkg.
 I was hoping for libdpkg to have something like:

package = get_deb_field("my_package.deb", "Package");

 but I didn't find it.  Did I miss it?  Is there something close
 to that?

 Anyways, the updated patches are attached.

 Marcelo
>From 40cbd26e938f3ffda58803c6e25d6e4c9a836b96 Mon Sep 17 00:00:00 2001
From: Marcelo E. Magallon 
Date: Fri, 2 Apr 2010 22:27:50 -0600
Subject: [PATCH 1/5] Reimplement mksplit in C

My original intention was to do without some of the pipes, but for the
initial implementation this is just a translation of the original Perl
program into C, without much in the way of optimization.  It produces
the same output and exits in the same way as the original program (mod
exit status probably).

The reimplementation can use some refactoring love.
---
 dpkg-split/Makefile.am |   12 ++-
 dpkg-split/mksplit.c   |  279 
 2 files changed, 288 insertions(+), 3 deletions(-)
 create mode 100644 dpkg-split/mksplit.c

diff --git a/dpkg-split/Makefile.am b/dpkg-split/Makefile.am
index 6f6043c..3ea9d00 100644
--- a/dpkg-split/Makefile.am
+++ b/dpkg-split/Makefile.am
@@ -24,10 +24,16 @@ dpkg_split_LDADD = \
 	../lib/compat/libcompat.a \
 	$(LIBINTL)
 
+mksplit_SOURCES = \
+	mksplit.c
 
-pkglib_SCRIPTS = mksplit
-EXTRA_DIST = mksplit.pl
-CLEANFILES = $(pkglib_SCRIPTS)
+mksplit_LDADD = \
+	../lib/dpkg/libdpkg.a \
+	../lib/compat/libcompat.a \
+	$(LIBINTL)
+
+pkglib_PROGRAMS = mksplit
+CLEANFILES = $(pkglib_PROGRAMS)
 
 
 do_perl_subst = $(AM_V_GEN) sed -e "s:^\#![:space:]*/usr/bin/perl:\#!$(PERL):"
diff --git a/dpkg-split/mksplit.c b/dpkg-split/mksplit.c
new file mode 100644
index 000..5ca34d6
--- /dev/null
+++ b/dpkg-split/mksplit.c
@@ -0,0 +1,279 @@
+/* This program is only supposed to be called by dpkg-split.
+ * Its arguments are:
+ *  
+ * Stdin is also redirected from the source archive by dpkg-split.
+ *
+ * Copyright © 1995 Ian Jackson 
+ * Copyright © 2010 Marcelo E. Magallon 
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see .
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define MSDOS_PATH_MAX 10
+
+void checked_free(void *ptr)
+{
+if (ptr) free(ptr);
+}
+
+void add(FILE *stream, char* id, char* data, size_t len)
+{
+time_t current_time;
+
+current_time = time(NULL);
+fprintf(stream, "%-16s%-12d0 0 100644  %-10d%c\n",
+id, (int)current_time, (int)len, 0140);
+fwrite(data, 1, len, stream);
+fprintf(stream, "%s", (len & 1) ? "\n" : "");
+}
+
+char* output(char *cmd)
+{
+FILE * file = NULL;
+int len = getpagesize();
+char *result = (char *)malloc(len);
+char *p = result;
+
+if (result == NULL)
+goto error_out;
+
+if ((file = popen(cmd, "r")) == NULL)
+goto error_out;
+
+while (len > 0 && !feof(file))
+{
+int n;
+n = fread(p, 1, len, file);
+if (ferror(file))
+goto error_out;
+p += n;
+len -= n;
+}
+goto out;
+
+error_out:
+if (result)
+{
+free(result);
+result = NULL;
+}
+
+out:
+if (file)
+pclose(file);
+return result;
+}
+
+char* get_field(char *filename, char *field)
+{
+char *result;
+char cmd[PATH_MAX];
+sprintf(cmd, "dpkg-deb --field %s %s", filename, field);
+
+result = output(cmd);
+if (result)
+{
+char *p;
+for (p = result + strlen(result) - 1; p >= result && isspace(*p); --p)
+*p = 0;
+}
+
+return result;
+}
+
+char* get_md5sum(char *filename)
+{
+char *result;
+char cmd[PATH_MAX];
+sprintf(cmd, "md5sum <%s", filename);
+
+result = output(cmd);
+if (result)
+{
+char *p;
+for(p = result; *p && *p != ' '; ++p);
+if

Re: Reimplement mksplit.pl in C

2010-04-04 Thread Marcelo E. Magallon
On Sat, Apr 03, 2010 at 09:23:54PM +0200, Raphael Hertzog wrote:

> The more recent reference is in http://wiki.debian.org/Teams/Dpkg/RoadMap

 Thanks!

 Marcelo


-- 
To UNSUBSCRIBE, email to debian-dpkg-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/20100405034717.gb21...@esk