| 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); |
| } |
| |