/* win32/osdep.h Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-4 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Automatic setting of the common Microsoft C idenfifier MSC. * NOTE: Watcom also defines M_I*86 ! */ #if defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__)) # ifndef MSC # define MSC /* This should work for older MSC, too! */ # endif #endif /* Tell Microsoft Visual C++ 2005 to leave us alone and * let us use standard C functions the way we're supposed to. */ #if defined(_MSC_VER) && (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_NONSTDC_NO_DEPRECATE # define _CRT_NONSTDC_NO_DEPRECATE # endif #endif #if defined(__WATCOMC__) && defined(__386__) # define WATCOMC_386 #endif #if (defined(__CYGWIN32__) && !defined(__CYGWIN__)) # define __CYGWIN__ /* compatibility for CygWin B19 and older */ #endif /* enable multibyte character set support by default */ #ifndef _MBCS # define _MBCS #endif #if defined(__CYGWIN__) # undef _MBCS #endif /* Get types and stat */ #include #include #include #ifndef MSDOS /* * Windows 95 (and Windows NT) file systems are (to some extend) * extensions of MSDOS. Common features include for example: * FAT or (FAT like) file systems, * '\\' as directory separator in paths, * "\r\n" as record (line) terminator in text files, ... */ # define MSDOS /* inherit MS-DOS file system etc. stuff */ #endif #define USE_CASE_MAP #define PROCNAME(n) (action == ADD || action == UPDATE ? wild(n) : \ procname(n, filter_match_case)) #define BROKEN_FSEEK #ifndef __RSXNT__ # define HAVE_FSEEKABLE #endif /* popen * * On Win32 must map to _popen() and _pclose() */ #define popen _popen #define pclose _pclose /* WIN32_OEM * * This enables storing paths in archives on WIN32 in OEM format * which is more work but seems the standard now. It also enables * converting paths in read DOS archives from assumed OEM to ANSI. */ #ifndef NO_WIN32_OEM # define WIN32_OEM #endif /* Large File Support * * If this is set it is assumed that the port * supports 64-bit file calls. The types are * defined here. Any local implementations are * in Win32.c and the prototypes for the calls are * in tailor.h. Note that a port must support * these calls fully or should not set * LARGE_FILE_SUPPORT. */ /* Note also that ZOFF_T_FORMAT_SIZE_PREFIX has to be defined here or tailor.h will define defaults */ /* If port has LARGE_FILE_SUPPORT then define here to make large file support automatic unless overridden */ #ifndef LARGE_FILE_SUPPORT # ifndef NO_LARGE_FILE_SUPPORT /* MS C and VC */ # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__) # define LARGE_FILE_SUPPORT # endif # if defined(__WATCOMC__) # define LARGE_FILE_SUPPORT # endif # endif #endif #ifdef LARGE_FILE_SUPPORT /* 64-bit Large File Support */ /* Only types and the printf format stuff go here. Functions go in tailor.h since ANSI prototypes are required and the OF define is not defined here. */ # if (defined(_MSC_VER) && (_MSC_VER >= 1100)) || defined(__MINGW32__) /* MS C and VC, MinGW32 */ /* these compiler systems use the Microsoft C RTL */ /* base types for file offsets and file sizes */ typedef __int64 zoff_t; typedef unsigned __int64 uzoff_t; /* 64-bit stat struct */ typedef struct _stati64 z_stat; /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "I64" # elif (defined(__GNUC__) || defined(ULONG_LONG_MAX)) /* GNU C */ /* base types for file offsets and file sizes */ typedef long long zoff_t; typedef unsigned long long uzoff_t; # ifdef __CYGWIN__ /* Use Cygwin's own stat struct */ typedef struct stat z_stat; # else /* 64-bit stat struct */ typedef struct _stati64 z_stat; # endif /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) /* WATCOM C */ /* base types for file offsets and file sizes */ typedef __int64 zoff_t; typedef unsigned __int64 uzoff_t; /* 64-bit stat struct */ typedef struct _stati64 z_stat; /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" # elif (defined(__IBMC__) && (__IBMC__ >= 350)) /* IBM C */ /* base types for file offsets and file sizes */ typedef __int64 zoff_t; typedef unsigned __int64 uzoff_t; /* 64-bit stat struct */ /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "I64" # else # undef LARGE_FILE_SUPPORT # endif #endif #if 0 # ifndef ZOFF_T_FORMAT_SIZE_PREFIX /* unsupported WIN32 */ /* base types for file offsets and file sizes */ typedef long long zoff_t; typedef unsigned long long uzoff_t; /* 64-bit stat struct */ typedef struct stat z_stat; /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" # endif #endif /* Automatically set ZIP64_SUPPORT if supported */ /* MS C and VC */ #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__WATCOMC__) # ifdef LARGE_FILE_SUPPORT # ifndef NO_ZIP64_SUPPORT # ifndef ZIP64_SUPPORT # define ZIP64_SUPPORT # endif # endif # endif #endif #ifndef LARGE_FILE_SUPPORT /* No Large File Support */ /* base type for file offsets and file sizes */ typedef long zoff_t; typedef unsigned long uzoff_t; /* stat struct */ typedef struct stat z_stat; /* printf format size prefix for zoff_t values */ # define ZOFF_T_FORMAT_SIZE_PREFIX "l" #endif /* UNICODE */ #ifdef WIN32 /* assume wide character conversion functions */ # ifndef UNICODE_SUPPORT # ifndef NO_UNICODE_SUPPORT # define UNICODE_SUPPORT # endif # endif #endif #if 0 /* this is now generic */ # ifdef UNICODE_SUPPORT /* Set up Unicode support - 9/27/05 EG */ /* type of wide string characters */ # define zchar wchar_t /* default char string used if a wide char can't be converted */ # define zchar_default "_" # else # define zchar char # endif #endif /* File operations--use "b" for binary if allowed or fixed length 512 on VMS * use "S" for sequential access on NT to prevent the NT * file cache eating up memory with large .zip files */ #define FOPR "rb" #define FOPM "r+b" #define FOPW "wbS" #if (defined(__CYGWIN__) && !defined(NO_MKTIME)) # define NO_MKTIME /* Cygnus' mktime() implementation is buggy */ #endif #if (!defined(NT_TZBUG_WORKAROUND) && !defined(NO_NT_TZBUG_WORKAROUND)) # define NT_TZBUG_WORKAROUND #endif #if (defined(UTIL) && defined(NT_TZBUG_WORKAROUND)) # undef NT_TZBUG_WORKAROUND /* the Zip utilities do not use time-stamps */ #endif #if !defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME) # define USE_EF_UT_TIME #endif #if (!defined(NO_NTSD_EAS) && !defined(NTSD_EAS)) # define NTSD_EAS #endif #if (defined(NTSD_EAS) && !defined(ZP_NEED_MEMCOMPR)) # define ZP_NEED_MEMCOMPR #endif #ifdef WINDLL # ifndef NO_ASM # define NO_ASM # endif # ifndef MSWIN # define MSWIN # endif # ifndef REENTRANT # define REENTRANT # endif #endif /* WINDLL */ /* Enable use of optimized x86 assembler version of longest_match() for MSDOS, WIN32 and OS2 per default. */ #if !defined(NO_ASM) && !defined(ASMV) # define ASMV #endif /* Enable use of optimized x86 assembler version of crc32() for MSDOS, WIN32 and OS2 per default. */ #if !defined(NO_ASM) && !defined(ASM_CRC) && !defined(NO_ASM_CRC) # define ASM_CRC #endif #if !defined(__GO32__) && !defined(__EMX__) && !defined(__CYGWIN__) # define NO_UNISTD_H #endif /* Microsoft C requires additional attributes attached to all RTL function * declarations when linking against the CRTL dll. */ #ifdef MSC # ifdef IZ_IMP # undef IZ_IMP # endif # define IZ_IMP _CRTIMP #else # ifndef IZ_IMP # define IZ_IMP # endif #endif /* WIN32 runs solely on little-endian processors; enable support * for the 32-bit optimized CRC-32 C code by default. */ #ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ #endif #if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ) # define IZ_CRC_LE_OPTIMIZ #endif /* the following definitions are considered as "obsolete" by Microsoft and * might be missing in some versions of */ #ifndef AnsiToOem # define AnsiToOem CharToOemA #endif #ifndef OemToAnsi # define OemToAnsi OemToCharA #endif /* handlers for OEM <--> ANSI string conversions */ #if defined(__RSXNT__) || defined(WIN32_CRT_OEM) /* RSXNT uses OEM coded strings in functions supplied by C RTL */ # ifdef CRTL_CP_IS_ISO # undef CRTL_CP_IS_ISO # endif # ifndef CRTL_CP_IS_OEM # define CRTL_CP_IS_OEM # endif #else /* "real" native WIN32 compilers use ANSI coded strings in C RTL calls */ # ifndef CRTL_CP_IS_ISO # define CRTL_CP_IS_ISO # endif # ifdef CRTL_CP_IS_OEM # undef CRTL_CP_IS_OEM # endif #endif #ifdef CRTL_CP_IS_ISO /* C RTL's file system support assumes ANSI coded strings */ # define ISO_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define OEM_TO_INTERN(src, dst) OemToAnsi(src, dst) # define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_OEM(src, dst) AnsiToOem(src, dst) # define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1) # define _ISO_INTERN(str1) {;} # define _INTERN_OEM(str1) INTERN_TO_OEM(str1, str1) # define _INTERN_ISO(str1) {;} #endif /* CRTL_CP_IS_ISO */ #ifdef CRTL_CP_IS_OEM /* C RTL's file system support assumes OEM coded strings */ # define ISO_TO_INTERN(src, dst) AnsiToOem(src, dst) # define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_ISO(src, dst) OemToAnsi(src, dst) # define INTERN_TO_OEM(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define _OEM_INTERN(str1) {;} # define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1) # define _INTERN_OEM(str1) {;} # define _INTERN_ISO(str1) INTERN_TO_ISO(str1, str1) #endif /* CRTL_CP_IS_OEM */ /* The following "OEM vs. ISO Zip entry names" code has been copied from UnZip. * It should be applicable to the generic Zip code. However, currently only * the Win32 port of Zip supplies the required charset conversion functions. * (The Win32 port uses conversion functions supplied by the OS.) */ /* Convert filename (and file comment string) into "internal" charset. * This macro assumes that Zip entry filenames are coded in OEM (IBM DOS) * codepage when made on * -> DOS (this includes 16-bit Windows 3.1) (FS_FAT_) * -> OS/2 (FS_HPFS_) * -> Win95/WinNT with Nico Mak's WinZip (FS_NTFS_ && hostver == "5.0") * EXCEPTIONS: * PKZIP for Windows 2.5, 2.6, and 4.0 flag their entries as "FS_FAT_", but * the filename stored in the local header is coded in Windows ANSI (CP 1252 * resp. ISO 8859-1 on US and western Europe locale settings). * Likewise, PKZIP for UNIX 2.51 flags its entries as "FS_FAT_", but the * filenames stored in BOTH the local and the central header are coded * in the local system's codepage (usually ANSI codings like ISO 8859-1, * but could also be UTF-8 on "modern" setups...). * * All other ports are assumed to code zip entry filenames in ISO (8859-1 * on "Western" localisations). */ #define FS_FAT_ 0 /* filesystem used by MS-DOS, OS/2, Win32 */ #define FS_HPFS_ 6 /* filesystem used by OS/2 (and NT 3.x) */ #define FS_NTFS_ 11 /* filesystem used by Windows NT */ #ifndef Ext_ASCII_TO_Native # define Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr) \ if (((hostnum) == FS_FAT_ && \ !(((islochdr) || (isuxatt)) && \ ((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \ (hostnum) == FS_HPFS_ || \ ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \ _OEM_INTERN((string)); \ } else { \ _ISO_INTERN((string)); \ } #endif #if (defined(__RSXNT__) && defined(__CRTRSXNT__)) # include #endif #ifdef _MBCS # if (!defined(__EMX__) && !defined(__MINGW32__) && !defined(__CYGWIN__)) # include # include # endif # if (defined(__MINGW32__) && !defined(MB_CUR_MAX)) # ifdef __MSVCRT__ IZ_IMP extern int *__p___mb_cur_max(void); # define MB_CUR_MAX (*__p___mb_cur_max()) # else IZ_IMP extern int *_imp____mb_cur_max_dll; # define MB_CUR_MAX (*_imp____mb_cur_max_dll) # endif # endif # if (defined(__LCC__) && !defined(MB_CUR_MAX)) IZ_IMP extern int *_imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # endif #endif #ifdef __LCC__ # include # ifndef tzset # define tzset _tzset # endif # ifndef utime # define utime _utime # endif #endif #ifdef __MINGW32__ IZ_IMP extern void _tzset(void); /* this is missing in */ # ifndef tzset # define tzset _tzset # endif #endif #if (defined(__RSXNT__) || defined(__EMX__)) && !defined(tzset) # define tzset _tzset #endif #ifdef W32_USE_IZ_TIMEZONE # ifdef __BORLANDC__ # define tzname tzname # define IZTZ_DEFINESTDGLOBALS # endif # ifndef tzset # define tzset _tzset # endif # ifndef timezone # define timezone _timezone # endif # ifndef daylight # define daylight _daylight # endif # ifndef tzname # define tzname _tzname # endif # if (!defined(NEED__ISINDST) && !defined(__BORLANDC__)) # define NEED__ISINDST # endif # ifdef IZTZ_GETLOCALETZINFO # undef IZTZ_GETLOCALETZINFO # endif # define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone #endif /* W32_USE_IZ_TIMEZONE */ #ifdef MATCH # undef MATCH #endif #define MATCH dosmatch /* use DOS style wildcard matching */ #ifdef UNICODE_SUPPORT # ifdef WIN32 # define MATCHW dosmatchw # endif #endif #ifdef ZCRYPT_INTERNAL # ifdef WINDLL # define ZCR_SEED2 (unsigned)3141592654L /* use PI as seed pattern */ # else # include /* getpid() declaration for srand seed */ # endif #endif /* Up to now, all versions of Microsoft C runtime libraries lack the support * for customized (non-US) switching rules between daylight saving time and * standard time in the TZ environment variable string. * But non-US timezone rules are correctly supported when timezone information * is read from the OS system settings in the Win32 registry. * The following work-around deletes any TZ environment setting from * the process environment. This results in a fallback of the RTL time * handling code to the (correctly interpretable) OS system settings, read * from the registry. */ #ifdef USE_EF_UT_TIME # if (defined(__WATCOMC__) || defined(__CYGWIN__) || \ defined(W32_USE_IZ_TIMEZONE)) # define iz_w32_prepareTZenv() # else # define iz_w32_prepareTZenv() putenv("TZ=") # endif #endif /* This patch of stat() is useful for at least three compilers. It is */ /* difficult to take a stat() of a root directory under Windows95, so */ /* zstat_zipwin32() detects that case and fills in suitable values. */ #ifndef __RSXNT__ # ifndef W32_STATROOT_FIX # define W32_STATROOT_FIX # endif #endif /* !__RSXNT__ */ #if (defined(NT_TZBUG_WORKAROUND) || defined(W32_STATROOT_FIX)) # define W32_STAT_BANDAID # ifdef LARGE_FILE_SUPPORT /* E. Gordon 9/12/03 */ int zstat_zipwin32(const char *path, z_stat *buf); # else int zstat_zipwin32(const char *path, struct stat *buf); # endif # ifdef UNICODE_SUPPORT # ifdef LARGE_FILE_SUPPORT int zstat_zipwin32w(const wchar_t *pathw, struct _stati64 *buf); # else int zstat_zipwin32w(const wchar_t *pathw, struct _stat *buf); # endif # endif # ifdef SSTAT # undef SSTAT # endif # define SSTAT zstat_zipwin32 # ifdef UNICODE_SUPPORT # define SSTATW zstat_zipwin32w # endif #endif /* NT_TZBUG_WORKAROUND || W32_STATROOT_FIX */ int getch_win32(void); #ifdef __GNUC__ # define IZ_PACKED __attribute__((packed)) #else # define IZ_PACKED #endif /* for some (all ?) versions of IBM C Set/2 and IBM C Set++ */ #ifndef S_IFMT # define S_IFMT 0xF000 #endif /* !S_IFMT */ #ifdef __WATCOMC__ # include /* PATH_MAX is defined here */ # define NO_MKTEMP /* Get asm routines to link properly without using "__cdecl": */ # ifdef __386__ # ifdef ASMV # pragma aux match_init "_*" parm caller [] modify [] # pragma aux longest_match "_*" parm caller [] value [eax] \ modify [eax ecx edx] # endif # if defined(ASM_CRC) && !defined(USE_ZLIB) # pragma aux crc32 "_*" parm caller [] value [eax] modify [eax] # pragma aux get_crc_table "_*" parm caller [] value [eax] \ modify [eax ecx edx] # endif /* ASM_CRC && !USE_ZLIB */ # endif /* __386__ */ /* Watcom C (like the other Win32 C compiler systems) does not support * symlinks on Win32, but defines the S_IFLNK symbol nevertheless. * However, the existence of this symbol is used as "symlinks supported" * indicator in the generic Zip code (see tailor.h). So, for a simple * work-around, this symbol is undefined here. */ # ifdef S_IFLNK # undef S_IFLNK # endif # ifdef UNICODE_SUPPORT /* Watcom C does not supply wide-char definitions in the "standard" * headers like MSC; so we have to pull in a wchar-specific header. */ # include # endif #endif /* __WATCOMC__ */