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 +#ifdef UNIX +# include +# include +#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 +#ifdef UNIX +# include +# include +#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); }