changeset 3136:5481abb52912

Add gcab (and MSVC-specific patch)
author Michael Goffioul <michael.goffioul@gmail.com>
date Sat, 13 Jul 2013 17:10:35 -0400
parents 8147e6f8659a
children 98d994cfc408
files index.html src/gcab.mk src/msvc-gcab-1.patch
diffstat 3 files changed, 403 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/index.html	Sat Jul 13 00:35:02 2013 -0400
+++ b/index.html	Sat Jul 13 17:10:35 2013 -0400
@@ -1184,6 +1184,11 @@
         <td id="gc-website"><a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">gc</a></td>
     </tr>
     <tr>
+        <td id="gcab-package">gcab</td>
+        <td id="gcab-version">0.4</td>
+        <td id="gcab-website"><a href="http://ftp.gnome.org/pub/GNOME/sources/gcab/">gcab</a></td>
+    </tr>
+    <tr>
         <td id="gcc-gmp-package">gcc-gmp</td>
         <td id="gcc-gmp-version">5.0.5</td>
         <td id="gcc-gmp-website"><a href="http://www.gmplib.org/">GMP for GCC</a></td>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gcab.mk	Sat Jul 13 17:10:35 2013 -0400
@@ -0,0 +1,27 @@
+# This file is part of MXE.
+# See index.html for further information.
+
+PKG             := gcab
+$(PKG)_IGNORE   :=
+$(PKG)_CHECKSUM := d81dfe35125e611e3a94c0d4def37ebf62b9187c
+$(PKG)_SUBDIR   := $(PKG)-$($(PKG)_VERSION)
+$(PKG)_FILE     := $(PKG)-$($(PKG)_VERSION).tar.xz
+$(PKG)_URL      := http://ftp.gnome.org/pub/gnome/sources/$(PKG)/$(call SHORT_PKG_VERSION,$(PKG))/$($(PKG)_FILE)
+$(PKG)_DEPS     := glib zlib
+
+define $(PKG)_UPDATE
+    $(WGET) -q -O- 'http://git.gnome.org/browse/$(PKG)/refs/tags' | \
+    $(SED) -n "s,.*tag/?id=\([0-9]\+\.[0-9]*[02468]\.[^']*\).*,\1,p" | \
+    head -1
+endef
+
+define $(PKG)_BUILD
+    mkdir '$(1)/.build'
+    cd '$(1)/.build' && PKG_CONFIG_PATH='$(HOST_LIBDIR)/pkgconfig' '$(1)/configure' \
+        $(HOST_AND_BUILD_CONFIGURE_OPTIONS) \
+        $(ENABLE_SHARED_OR_STATIC) \
+        --prefix='$(HOST_PREFIX)' \
+        && $(CONFIGURE_POST_HOOK)
+    $(MAKE) -C '$(1)/.build' -j '$(JOBS)'
+    $(MAKE) -C '$(1)/.build' -j 1 install
+endef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/msvc-gcab-1.patch	Sat Jul 13 17:10:35 2013 -0400
@@ -0,0 +1,371 @@
+diff -ur gcab-0.4-orig/Makefile.in gcab-0.4/Makefile.in
+--- gcab-0.4-orig/Makefile.in	2013-02-08 10:38:12 -0500
++++ gcab-0.4/Makefile.in	2013-07-13 17:02:16 -0400
+@@ -474,8 +474,8 @@
+ libgcab_1_0_la_LIBADD = -lz $(GLIB_LIBS)
+ libgcab_1_0_la_LDFLAGS = \
+ 	-version-info 0:0:0				\
+-	-Wl,--version-script=${srcdir}/libgcab.syms	\
+ 	-no-undefined					\
++	-export-symbols-regex "gcab_.*"			\
+ 	$(NULL)
+ 
+ libgcab_1_0_la_DEPENDENCIES = libgcab.syms
+diff -ur gcab-0.4-orig/gcab.c gcab-0.4/gcab.c
+--- gcab-0.4-orig/gcab.c	2013-02-08 10:34:05 -0500
++++ gcab-0.4/gcab.c	2013-07-13 16:40:01 -0400
+@@ -94,6 +94,14 @@
+         { NULL }
+     };
+ 
++    gchar *s;
++    GCancellable *cancellable;
++    GCabCabinet *cabinet;
++    GCabFolder *folder;
++    GFile *outputfile;
++    GOutputStream *output;
++    GFile *cwd;
++
+     setlocale (LC_ALL, "");
+     textdomain (GETTEXT_PACKAGE);
+     bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+@@ -105,7 +113,7 @@
+     g_set_prgname (PACKAGE_NAME);
+ 
+     context = g_option_context_new (_("- create a Cabinet file"));
+-    gchar *s = g_strdup_printf (_("Report bugs to <%s>"), PACKAGE_BUGREPORT);
++    s = g_strdup_printf (_("Report bugs to <%s>"), PACKAGE_BUGREPORT);
+     g_option_context_set_description (context, s);
+     g_free(s);
+     g_option_context_set_summary (context, _("\
+@@ -129,12 +137,8 @@
+     if (!args || args[0] == NULL)
+         gcab_error (_("cabinet file must be specified."));
+ 
+-    GCancellable *cancellable = g_cancellable_new ();
+-    GCabCabinet *cabinet = gcab_cabinet_new ();
+-    GCabFolder *folder;
+-    GFile *outputfile;
+-    GOutputStream *output;
+-    GFile *cwd;
++    cancellable = g_cancellable_new ();
++    cabinet = gcab_cabinet_new ();
+ 
+     if (list || extract) {
+         GFile *file = g_file_new_for_commandline_arg (args[0]);
+diff -ur gcab-0.4-orig/libgcab/cabinet.c gcab-0.4/libgcab/cabinet.c
+--- gcab-0.4-orig/libgcab/cabinet.c	2013-02-08 10:12:17 -0500
++++ gcab-0.4/libgcab/cabinet.c	2013-07-13 16:58:14 -0400
+@@ -388,12 +388,15 @@
+              guint8 *data, size_t size, gsize *bytes_written,
+              GCancellable *cancellable, GError **error)
+ {
++    CHECKSUM datacsum;
++    GOutputStream *stream;
++
+     if (!cdata_set(cd, type, data, size))
+         return FALSE;
+ 
+-    CHECKSUM datacsum = compute_checksum(cd->in, cd->ncbytes, 0);
++    datacsum = compute_checksum(cd->in, cd->ncbytes, 0);
+     cd->checksum = compute_checksum ((guint8*)&cd->ncbytes, 4, datacsum);
+-    GOutputStream *stream = g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (out));
++    stream = g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (out));
+ 
+     *bytes_written = 0;
+ 
+@@ -482,10 +485,12 @@
+     }
+ 
+     if (compression == GCAB_COMPRESSION_MSZIP) {
++        z_stream *z;
++
+         if (cd->in[0] != 'C' || cd->in[1] != 'K')
+             goto end;
+ 
+-        z_stream *z = &cd->z;
++        z = &cd->z;
+ 
+         z->avail_in = cd->ncbytes - 2;
+         z->next_in = cd->in + 2;
+diff -ur gcab-0.4-orig/libgcab/gcab-cabinet.c gcab-0.4/libgcab/gcab-cabinet.c
+--- gcab-0.4-orig/libgcab/gcab-cabinet.c	2013-02-08 10:10:26 -0500
++++ gcab-0.4/libgcab/gcab-cabinet.c	2013-07-13 16:49:56 -0400
+@@ -62,8 +62,10 @@
+ static void
+ gcab_cabinet_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+ {
++    GCabCabinet *self;
++
+     g_return_if_fail (GCAB_IS_CABINET (object));
+-    GCabCabinet *self = GCAB_CABINET (object);
++    self = GCAB_CABINET (object);
+ 
+     switch (prop_id) {
+     case PROP_RESERVED:
+@@ -80,8 +82,10 @@
+ static void
+ gcab_cabinet_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+ {
++    GCabCabinet *self;
++
+     g_return_if_fail (GCAB_IS_CABINET (object));
+-    GCabCabinet *self = GCAB_CABINET (object);
++    self = GCAB_CABINET (object);
+ 
+     switch (prop_id) {
+     case PROP_RESERVED:
+@@ -178,22 +182,16 @@
+                     GError **error)
+ {
+     cheader_t header = {
+-        .offsetfiles = CFI_START, // CFHEADER + 1 * CFFOLDER
+-        .nfolders = 1, // a single CAB folder is enough
++        0, 0, 0,
++        /* .offsetfiles =*/ CFI_START, // CFHEADER + 1 * CFFOLDER
++        0, 0, 0,
++        /* .nfolders =*/ 1, // a single CAB folder is enough
+     };
+     cfolder_t folder = { 0, };
+ 
+-    g_return_val_if_fail (GCAB_IS_CABINET (self), FALSE);
+-    g_return_val_if_fail (G_IS_OUTPUT_STREAM (out), FALSE);
+-    g_return_val_if_fail (G_IS_SEEKABLE (out), FALSE);
+-    g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
+-    g_return_val_if_fail (!error || *error == NULL, FALSE);
+-    /* FIXME: current limitation of 1 folder */
+-    g_return_val_if_fail (self->folders->len == 1, FALSE);
+-
+-    GCabFolder *cabfolder = g_ptr_array_index (self->folders, 0);
++    GCabFolder *cabfolder;
+     GCabFile *file;
+-    gsize nfiles = gcab_folder_get_nfiles (cabfolder);
++    gsize nfiles;
+     GInputStream *in = NULL;
+     GDataOutputStream *dstream = NULL;
+     gboolean success = FALSE;
+@@ -206,6 +204,17 @@
+     cfile_t *prevf = NULL;
+     int i;
+ 
++    g_return_val_if_fail (GCAB_IS_CABINET (self), FALSE);
++    g_return_val_if_fail (G_IS_OUTPUT_STREAM (out), FALSE);
++    g_return_val_if_fail (G_IS_SEEKABLE (out), FALSE);
++    g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
++    g_return_val_if_fail (!error || *error == NULL, FALSE);
++    /* FIXME: current limitation of 1 folder */
++    g_return_val_if_fail (self->folders->len == 1, FALSE);
++
++    cabfolder = g_ptr_array_index (self->folders, 0);
++    nfiles = gcab_folder_get_nfiles (cabfolder);
++
+     dstream = g_data_output_stream_new (out);
+     g_data_output_stream_set_byte_order (dstream, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
+ 
+@@ -342,20 +351,23 @@
+                    GCancellable *cancellable,
+                    GError **error)
+ {
++    gboolean success = FALSE;
++    cheader_t cheader;
++    int i;
++    GDataInputStream *in;
++    GPtrArray *folders;
++
+     g_return_val_if_fail (GCAB_IS_CABINET (self), FALSE);
+     g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE);
+     g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
+     g_return_val_if_fail (!error || *error == NULL, FALSE);
+     g_return_val_if_fail (self->folders->len == 0, FALSE);
+ 
+-    gboolean success = FALSE;
+-    cheader_t cheader;
+-    int i;
+-    GDataInputStream *in = g_data_input_stream_new (stream);
++    in = g_data_input_stream_new (stream);
+     g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE);
+     g_data_input_stream_set_byte_order (in, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
+ 
+-    GPtrArray *folders = self->folders;
++    folders = self->folders;
+ 
+     if (!cheader_read (&cheader, in, cancellable, error))
+         goto end;
+@@ -367,10 +379,12 @@
+ 
+     for (i = 0; i < cheader.nfolders; i++) {
+         cfolder_t cfolder = { 0, };
++        GCabFolder *folder;
++
+         if (!cfolder_read (&cfolder, cheader.res_folder, in, cancellable, error))
+             goto end;
+ 
+-        GCabFolder *folder = gcab_folder_new_with_cfolder (&cfolder, stream);
++        folder = gcab_folder_new_with_cfolder (&cfolder, stream);
+         if (cfolder.reserved)
+             g_object_set (folder, "reserved",
+                           g_byte_array_new_take (cfolder.reserved, cheader.res_folder),
+@@ -381,11 +395,14 @@
+ 
+     for (i = 0; i < cheader.nfiles; i++) {
+         cfile_t cfile = { 0, };
++        GCabFile *file;
++        GCabFolder *folder;
++
+         if (!cfile_read (&cfile, in, cancellable, error))
+             goto end;
+ 
+-        GCabFile *file = gcab_file_new_with_cfile (&cfile);
+-        GCabFolder *folder = g_ptr_array_index (folders, cfile.index);
++        file = gcab_file_new_with_cfile (&cfile);
++        folder = g_ptr_array_index (folders, cfile.index);
+         if (!gcab_folder_add_file (folder, file, FALSE, cancellable, error)) {
+             g_object_unref (file);
+             goto end;
+diff -ur gcab-0.4-orig/libgcab/gcab-file.c gcab-0.4/libgcab/gcab-file.c
+--- gcab-0.4-orig/libgcab/gcab-file.c	2013-01-17 21:20:09 -0500
++++ gcab-0.4/libgcab/gcab-file.c	2013-07-13 16:56:03 -0400
+@@ -69,8 +69,10 @@
+ static void
+ gcab_file_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+ {
++    GCabFile *self;
++
+     g_return_if_fail (GCAB_IS_FILE (object));
+-    GCabFile *self = GCAB_FILE (object);
++    self = GCAB_FILE (object);
+ 
+     switch (prop_id) {
+     case PROP_NAME:
+@@ -88,8 +90,10 @@
+ static void
+ gcab_file_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+ {
++    GCabFile *self;
++
+     g_return_if_fail (GCAB_IS_FILE (object));
+-    GCabFile *self = GCAB_FILE(object);
++    self = GCAB_FILE(object);
+ 
+     switch (prop_id) {
+     case PROP_NAME:
+@@ -220,11 +224,13 @@
+ G_GNUC_INTERNAL GCabFile *
+ gcab_file_new_with_cfile (const cfile_t *cfile)
+ {
++    GCabFile *file;
++
+     g_return_val_if_fail (cfile != NULL, NULL);
+ 
+-    GCabFile *file = g_object_new (GCAB_TYPE_FILE,
+-                                   "name", cfile->name,
+-                                   NULL);
++    file = g_object_new (GCAB_TYPE_FILE,
++                         "name", cfile->name,
++                         NULL);
+     file->cfile = *cfile;
+ 
+     return file;
+diff -ur gcab-0.4-orig/libgcab/gcab-folder.c gcab-0.4/libgcab/gcab-folder.c
+--- gcab-0.4-orig/libgcab/gcab-folder.c	2013-02-08 10:27:33 -0500
++++ gcab-0.4/libgcab/gcab-folder.c	2013-07-13 16:54:39 -0400
+@@ -60,8 +60,10 @@
+ static void
+ gcab_folder_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+ {
++    GCabFolder *self;
++
+     g_return_if_fail (GCAB_IS_FOLDER (object));
+-    GCabFolder *self = GCAB_FOLDER (object);
++    self = GCAB_FOLDER (object);
+ 
+     switch (prop_id) {
+     case PROP_COMPTYPE:
+@@ -81,8 +83,10 @@
+ static void
+ gcab_folder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+ {
++    GCabFolder *self;
++
+     g_return_if_fail (GCAB_IS_FOLDER (object));
+-    GCabFolder *self = GCAB_FOLDER (object);
++    self = GCAB_FOLDER (object);
+ 
+     switch (prop_id) {
+     case PROP_COMPRESSION:
+@@ -164,10 +168,12 @@
+     GFileType file_type = g_file_info_get_file_type (info);
+ 
+     if (file_type == G_FILE_TYPE_DIRECTORY) {
++        GFileEnumerator *dir;
++
+         if (!recurse)
+             return TRUE;
+ 
+-        GFileEnumerator *dir = g_file_enumerate_children (file->file, FILE_ATTRS, 0, NULL, error);
++        dir = g_file_enumerate_children (file->file, FILE_ATTRS, 0, NULL, error);
+         if (*error) {
+             g_warning ("Couldn't enumerate directory %s: %s", name, (*error)->message);
+             g_clear_error (error);
+@@ -227,16 +233,19 @@
+                       GError **error)
+ {
+     gboolean success;
++    GFile *gfile;
+ 
+     g_return_val_if_fail (GCAB_IS_FOLDER (self), FALSE);
+     g_return_val_if_fail (GCAB_IS_FILE (file), FALSE);
+     g_return_val_if_fail (!error || *error == NULL, FALSE);
+ 
+-    GFile *gfile = gcab_file_get_file (file);
++    gfile = gcab_file_get_file (file);
+     if (gfile) {
++        GFileInfo *info;
++
+         g_return_val_if_fail (G_IS_FILE (gfile), FALSE);
+ 
+-        GFileInfo *info = g_file_query_info (gfile, FILE_ATTRS, 0, NULL, error);
++        info = g_file_query_info (gfile, FILE_ATTRS, 0, NULL, error);
+         if (*error)
+             return FALSE;
+ 
+@@ -351,18 +360,24 @@
+ 
+     for (f = files; f != NULL; f = f->next) {
+         GCabFile *file = f->data;
++        gchar *fname;
++        int i = 0, len;
++        GFile *gfile;
++        GFile *parent;
++        u4 usize;
++        u4 uoffset;
+ 
+         if (file_callback && !file_callback (file, callback_data))
+             continue;
+ 
+-        gchar *fname = g_strdup (gcab_file_get_extract_name (file));
+-        int i = 0, len = strlen (fname);
++        fname = g_strdup (gcab_file_get_extract_name (file));
++        len = strlen (fname);
+         for (i = 0; i < len; i++)
+             if (fname[i] == '\\')
+                 fname[i] = '/';
+ 
+-        GFile *gfile = g_file_resolve_relative_path (path, fname);
+-        GFile *parent = g_file_get_parent (gfile);
++        gfile = g_file_resolve_relative_path (path, fname);
++        parent = g_file_get_parent (gfile);
+         g_free (fname);
+ 
+         if (!g_file_make_directory_with_parents (parent, cancellable, &my_error)) {
+@@ -383,8 +398,8 @@
+         if (!out)
+             goto end;
+ 
+-        u4 usize = file->cfile.usize;
+-        u4 uoffset = file->cfile.uoffset;
++        usize = file->cfile.usize;
++        uoffset = file->cfile.uoffset;
+         do {
+             if ((nubytes + cdata.nubytes) <= uoffset) {
+                 nubytes += cdata.nubytes;