You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
6.3 KiB

This patch makes zip use libnatspec to recode file names is national charset.
Initially this patch was written for altlinux:
http://sisyphus.ru/ru/srpm/Sisyphus/zip/patches
Later it was a bit improved and improved version was posted here (in Russian):
http://www.opennet.ru/tips/info/2494.shtml
Also I've added natspec support to output of zipnote (thank vapier for notice).
Gentoo reference:
https://bugs.gentoo.org/show_bug.cgi?id=275244
--
pva@gentoo.org
=== modified file 'fileio.c'
--- a/fileio.c
+++ b/fileio.c
@@ -929,7 +929,7 @@
}
if ((zname = in2ex(iname)) == NULL)
return ZE_MEM;
-#ifdef UNICODE_SUPPORT
+#if defined(UNICODE_SUPPORT) && !defined(UNIX)
/* Convert name to display or OEM name */
oname = local_to_display_string(iname);
#else
=== modified file 'globals.c'
--- a/globals.c
+++ b/globals.c
@@ -32,7 +32,7 @@
int scanimage = 1; /* 1=scan through image files */
#endif
int method = BEST; /* one of BEST, DEFLATE (only), or STORE (only) */
-int dosify = 0; /* 1=make new entries look like MSDOS */
+int dosify = 1; /* 1=make new entries look like MSDOS */
int verbose = 0; /* 1=report oddities in zip file structure */
int fix = 0; /* 1=fix the zip file, 2=FF, 3=ZipNote */
int filesync = 0; /* 1=file sync, delete entries not on file system */
=== modified file 'unix/Makefile'
--- a/unix/Makefile
+++ b/unix/Makefile
@@ -38,7 +38,7 @@
MANFLAGS = 644
# target directories - where to install executables and man pages to
-prefix = /usr/local
+prefix = /usr
BINDIR = $(prefix)/bin
MANEXT=1
MANDIR = $(prefix)/man/man$(MANEXT)
@@ -61,6 +61,7 @@
CFLAGS = -O2 $(CFLAGS_NOOPT)
LFLAGS1 =
LFLAGS2 = -s
+LDADD = -lnatspec
# object file lists
OBJZ = zip.o zipfile.o zipup.o fileio.o util.o globals.o crypt.o ttyio.o \
@@ -125,9 +126,9 @@
zipsman: $(ZIPS) $(ZIPMANUALs)
zip$E: $(OBJZ) $(OBJI) $(OBJA) $(LIB_BZ)
- $(BIND) -o zip$E $(LFLAGS1) $(OBJZ) $(OBJI) $(OBJA) $(LFLAGS2)
+ $(BIND) -o zip$E $(LFLAGS1) $(OBJZ) $(OBJI) $(OBJA) $(LFLAGS2) $(LDADD)
zipnote$E: $(OBJN)
- $(BIND) -o zipnote$E $(LFLAGS1) $(OBJN) $(LFLAGS2)
+ $(BIND) -o zipnote$E $(LFLAGS1) $(OBJN) $(LFLAGS2) $(LDADD)
zipcloak$E: $(OBJC) $(OCRCTB)
$(BIND) -o zipcloak$E $(LFLAGS1) $(OBJC) $(LFLAGS2)
zipsplit$E: $(OBJS)
=== modified file 'unix/osdep.h'
--- a/unix/osdep.h
+++ b/unix/osdep.h
@@ -78,3 +78,6 @@
#if !defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)
# define USE_EF_UT_TIME
#endif
+
+/* Set Windows code as archive type */
+# define OS_CODE 0xb00
=== modified file 'unix/unix.c'
--- a/unix/unix.c
+++ b/unix/unix.c
@@ -14,6 +14,11 @@
#include <time.h>
+#ifdef UNIX
+# include <natspec.h>
+# include <locale.h>
+#endif
+
#if defined(MINIX) || defined(__mpexl)
# ifdef S_IWRITE
# undef S_IWRITE
@@ -60,6 +65,7 @@
/* Local functions */
local char *readd OF((DIR *));
+local const char *oem_charset = NULL;
#ifdef NO_DIR /* for AT&T 3B1 */
@@ -262,6 +268,16 @@
if (!pathput)
t = last(t, PATH_END);
+#ifdef UNIX
+ if (!oem_charset) {
+ setlocale(LC_CTYPE, "");
+ oem_charset = natspec_get_charset_by_locale(NATSPEC_DOSCS, "");
+ }
+ /* Convert to internal encoding */
+ if ((n = natspec_convert(t, oem_charset, 0, 0)) == NULL)
+ return NULL;
+ return n;
+#else
/* Malloc space for internal name and copy it */
if ((n = malloc(strlen(t) + 1)) == NULL)
return NULL;
@@ -269,6 +285,7 @@
if (dosify)
msname(n);
+#endif
#ifdef EBCDIC
strtoasc(n, n); /* here because msname() needs native coding */
@@ -289,8 +306,19 @@
{
char *x; /* external file name */
+#ifdef UNIX
+ if (!oem_charset) {
+ oem_charset = natspec_get_charset_by_locale(NATSPEC_DOSCS, "");
+ setlocale(LC_CTYPE, "");
+ }
+ /* Convert to internal encoding */
+ if ((x = natspec_convert(n, 0, oem_charset, 0)) == NULL)
+ return NULL;
+ return x;
+#else
if ((x = malloc(strlen(n) + 1 + PAD)) == NULL)
return NULL;
+#endif
#ifdef EBCDIC
strtoebc(x, n);
#else
=== modified file 'zip.c'
--- a/zip.c
+++ b/zip.c
@@ -2025,6 +2025,7 @@
#endif /* ?MACOS */
{"J", "junk-sfx", o_NO_VALUE, o_NOT_NEGATABLE, 'J', "strip self extractor from archive"},
{"k", "DOS-names", o_NO_VALUE, o_NOT_NEGATABLE, 'k', "force use of 8.3 DOS names"},
+ {"K", "no DOS-names",o_NO_VALUE, o_NOT_NEGATABLE, 'K', "no use 8.3 DOS names"},
{"l", "to-crlf", o_NO_VALUE, o_NOT_NEGATABLE, 'l', "convert text file line ends - LF->CRLF"},
{"ll", "from-crlf", o_NO_VALUE, o_NOT_NEGATABLE, o_ll, "convert text file line ends - CRLF->LF"},
{"lf", "logfile-path",o_REQUIRED_VALUE, o_NOT_NEGATABLE, o_lf, "log to log file at path (default overwrite)"},
@@ -2289,7 +2290,7 @@
dispose = 0; /* 1=remove files after put in zip file */
pathput = 1; /* 1=store path with name */
method = BEST; /* one of BEST, DEFLATE (only), or STORE (only) */
- dosify = 0; /* 1=make new entries look like MSDOS */
+ dosify = 1; /* 1=make new entries look like MSDOS */
verbose = 0; /* 1=report oddities in zip file structure */
fix = 0; /* 1=fix the zip file */
adjust = 0; /* 1=adjust offsets for sfx'd file (keep preamble) */
@@ -2859,6 +2860,8 @@
junk_sfx = 1; break;
case 'k': /* Make entries using DOS names (k for Katz) */
dosify = 1; break;
+ case 'K': /* Make entries using DOS names (K for Kompat) */
+ dosify = 0; break;
case 'l': /* Translate end-of-line */
translate_eol = 1; break;
case o_ll:
=== modified file 'zipnote.c'
--- a/zipnote.c
+++ b/zipnote.c
@@ -21,6 +21,11 @@
#include "revision.h"
#include <signal.h>
+#ifdef UNIX
+# include <natspec.h>
+# include <locale.h>
+#endif
+
/* Calculate size of static line buffer used in write (-w) mode. */
#define WRBUFSIZ 2047
/* The line buffer size should be at least as large as FNMAX. */
@@ -537,7 +542,13 @@
{
for (z = zfiles; z != NULL; z = z->nxt)
{
+#ifdef UNIX
+ char *oem_charset = NULL;
+ oem_charset = natspec_get_charset_by_locale(NATSPEC_DOSCS, "");
+ printf("%c %s\n", MARK, natspec_convert(z->zname, 0, oem_charset, 0));
+#else
printf("%c %s\n", MARK, z->zname);
+#endif
putclean(z->comment, z->com);
printf("%c%s\n", MARK, MARKE);
}