summaryrefslogtreecommitdiff
path: root/libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch')
-rw-r--r--libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch b/libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch
new file mode 100644
index 000000000..f7ff098c0
--- /dev/null
+++ b/libre/xarchiver-libre/xarchiver-0.5.2-fix_7z_support.patch
@@ -0,0 +1,110 @@
+diff -Nur xarchiver-0.5.2.orig/src/7zip.c xarchiver-0.5.2/src/7zip.c
+--- xarchiver-0.5.2.orig/src/7zip.c 2008-10-25 00:41:17.000000000 +1300
++++ xarchiver-0.5.2/src/7zip.c 2010-12-15 11:24:26.000000000 +1300
+@@ -64,15 +64,14 @@
+ XEntry *entry;
+ gchar *filename;
+ gpointer item[5];
+- gint linesize = 0,n = 0,a = 0;
+- gboolean dir = FALSE;
++ gint linesize = 0,a = 0;
+
+ if (last_line)
+ return;
+
+ if (jump_header == FALSE)
+ {
+- if (line[0] == '-')
++ if ((line[0] == '-') && (line[3] != NULL))
+ {
+ jump_header = TRUE;
+ return;
+@@ -93,71 +92,42 @@
+ item[4] = line;
+
+ /* Time */
+- for(n=13; n < linesize; ++n)
+- if(line[n] == ' ')
+- break;
+- line[n] = '\0';
++ line[19] = '\0';
+ item[3] = line + 11;
+- a = ++n;
+
+ /* Permissions */
+- for(; n < linesize; n++)
+- if(line[n] == ' ')
+- break;
+- line[n] = '\0';
+- if ((line+a)[0] == 'D')
+- dir = TRUE;
+- item[2] = line + a;
++ line[25] = '\0';
++ item[2] = line + 20;
+
+ /* Size */
+- for(++n; n < linesize; ++n)
+- if(line[n] >= '0' && line[n] <= '9')
++ for(a=26; a < linesize; ++a)
++ if(line[a] >= '0' && line[a] <= '9')
+ break;
+- a = n;
+
+- for(; n < linesize; ++n)
+- if(line[n] == ' ')
+- break;
+-
+- line[n] = '\0';
++ line[38] = '\0';
+ item[0] = line + a;
+ archive->dummy_size += g_ascii_strtoull(item[0],NULL,0);
+
+ /* Compressed */
+- for(++n; n < linesize; ++n)
+- if(line[n] >= '0' && line[n] <= '9')
+- break;
+- a = n;
+-
+- for(; n < linesize; ++n)
+- if(line[n] == ' ')
+- break;
+-
+- line[n] = '\0';
+-
+- if (line[50] != ' ')
++ /* Is this item solid? */
++ if (line[50] == ' ')
+ {
+- n+=2;
+- item[1] = line + a;
+ line[linesize-1] = '\0';
+- filename = g_strdup(line + n);
++ filename = g_strdup(line + 53);
+ }
+- /* Is this a solid archive? */
++
+ else
+ {
+- item[1] = "0";
+- line[n-1] = '\0';
++ for(a=39; a < linesize; ++a)
++ if(line[a] >= '0' && line[a] <= '9')
++ break;
++
++ line[51] = '\0';
++ item[1] = line + a;
++ line[linesize-1] = '\0';
+ filename = g_strdup(line + 53);
+ }
+
+- /* Work around for 7za which doesn't
+- * output / with directories */
+- if (dir)
+- {
+- gchar *filename_with_slash = g_strconcat (filename,"/",NULL);
+- g_free (filename);
+- filename = filename_with_slash;
+- }
+ entry = xa_set_archive_entries_for_each_row (archive,filename,item);
+ g_free(filename);
+ }