1 /* 2 win32/osdep.h 3 4 Copyright (c) 1990-2008 Info-ZIP. All rights reserved. 5 6 See the accompanying file LICENSE, version 2007-Mar-4 or later 7 (the contents of which are also included in zip.h) for terms of use. 8 If, for some reason, all these files are missing, the Info-ZIP license 9 also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html 10 */ 11 12 /* Automatic setting of the common Microsoft C idenfifier MSC. 13 * NOTE: Watcom also defines M_I*86 ! 14 */ 15 #if defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__)) 16 # ifndef MSC 17 # define MSC /* This should work for older MSC, too! */ 18 # endif 19 #endif 20 21 /* Tell Microsoft Visual C++ 2005 to leave us alone and 22 * let us use standard C functions the way we're supposed to. 23 */ 24 #if defined(_MSC_VER) && (_MSC_VER >= 1400) 25 # ifndef _CRT_SECURE_NO_DEPRECATE 26 # define _CRT_SECURE_NO_DEPRECATE 27 # endif 28 # ifndef _CRT_NONSTDC_NO_DEPRECATE 29 # define _CRT_NONSTDC_NO_DEPRECATE 30 # endif 31 #endif 32 33 #if defined(__WATCOMC__) && defined(__386__) 34 # define WATCOMC_386 35 #endif 36 37 #if (defined(__CYGWIN32__) && !defined(__CYGWIN__)) 38 # define __CYGWIN__ /* compatibility for CygWin B19 and older */ 39 #endif 40 41 /* enable multibyte character set support by default */ 42 #ifndef _MBCS 43 # define _MBCS 44 #endif 45 #if defined(__CYGWIN__) 46 # undef _MBCS 47 #endif 48 49 /* Get types and stat */ 50 #include <sys/types.h> 51 #include <sys/stat.h> 52 #include <io.h> 53 54 #ifndef MSDOS 55 /* 56 * Windows 95 (and Windows NT) file systems are (to some extend) 57 * extensions of MSDOS. Common features include for example: 58 * FAT or (FAT like) file systems, 59 * '\\' as directory separator in paths, 60 * "\r\n" as record (line) terminator in text files, ... 61 */ 62 # define MSDOS 63 /* inherit MS-DOS file system etc. stuff */ 64 #endif 65 66 #define USE_CASE_MAP 67 #define PROCNAME(n) (action == ADD || action == UPDATE ? wild(n) : \ 68 procname(n, filter_match_case)) 69 #define BROKEN_FSEEK 70 #ifndef __RSXNT__ 71 # define HAVE_FSEEKABLE 72 #endif 73 74 75 /* popen 76 * 77 * On Win32 must map to _popen() and _pclose() 78 */ 79 #define popen _popen 80 #define pclose _pclose 81 82 /* WIN32_OEM 83 * 84 * This enables storing paths in archives on WIN32 in OEM format 85 * which is more work but seems the standard now. It also enables 86 * converting paths in read DOS archives from assumed OEM to ANSI. 87 */ 88 #ifndef NO_WIN32_OEM 89 # define WIN32_OEM 90 #endif 91 92 /* Large File Support 93 * 94 * If this is set it is assumed that the port 95 * supports 64-bit file calls. The types are 96 * defined here. Any local implementations are 97 * in Win32.c and the prototypes for the calls are 98 * in tailor.h. Note that a port must support 99 * these calls fully or should not set 100 * LARGE_FILE_SUPPORT. 101 */ 102 103 /* Note also that ZOFF_T_FORMAT_SIZE_PREFIX has to be defined here 104 or tailor.h will define defaults */ 105 106 /* If port has LARGE_FILE_SUPPORT then define here 107 to make large file support automatic unless overridden */ 108 109 110 #ifndef LARGE_FILE_SUPPORT 111 # ifndef NO_LARGE_FILE_SUPPORT 112 /* MS C and VC */ 113 # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__) 114 # define LARGE_FILE_SUPPORT 115 # endif 116 # if defined(__WATCOMC__) 117 # define LARGE_FILE_SUPPORT 118 # endif 119 # endif 120 #endif 121 122 #ifdef LARGE_FILE_SUPPORT 123 /* 64-bit Large File Support */ 124 125 /* Only types and the printf format stuff go here. Functions 126 go in tailor.h since ANSI prototypes are required and the OF define 127 is not defined here. */ 128 129 # if (defined(_MSC_VER) && (_MSC_VER >= 1100)) || defined(__MINGW32__) 130 /* MS C and VC, MinGW32 */ 131 /* these compiler systems use the Microsoft C RTL */ 132 133 /* base types for file offsets and file sizes */ 134 typedef __int64 zoff_t; 135 typedef unsigned __int64 uzoff_t; 136 137 /* 64-bit stat struct */ 138 typedef struct _stati64 z_stat; 139 140 /* printf format size prefix for zoff_t values */ 141 # define ZOFF_T_FORMAT_SIZE_PREFIX "I64" 142 143 # elif (defined(__GNUC__) || defined(ULONG_LONG_MAX)) 144 /* GNU C */ 145 146 /* base types for file offsets and file sizes */ 147 typedef long long zoff_t; 148 typedef unsigned long long uzoff_t; 149 150 # ifdef __CYGWIN__ 151 /* Use Cygwin's own stat struct */ 152 typedef struct stat z_stat; 153 # else 154 /* 64-bit stat struct */ 155 typedef struct _stati64 z_stat; 156 # endif 157 158 /* printf format size prefix for zoff_t values */ 159 # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" 160 161 # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) 162 /* WATCOM C */ 163 164 /* base types for file offsets and file sizes */ 165 typedef __int64 zoff_t; 166 typedef unsigned __int64 uzoff_t; 167 168 /* 64-bit stat struct */ 169 typedef struct _stati64 z_stat; 170 171 /* printf format size prefix for zoff_t values */ 172 # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" 173 174 # elif (defined(__IBMC__) && (__IBMC__ >= 350)) 175 /* IBM C */ 176 177 /* base types for file offsets and file sizes */ 178 typedef __int64 zoff_t; 179 typedef unsigned __int64 uzoff_t; 180 181 /* 64-bit stat struct */ 182 183 /* printf format size prefix for zoff_t values */ 184 # define ZOFF_T_FORMAT_SIZE_PREFIX "I64" 185 186 # else 187 # undef LARGE_FILE_SUPPORT 188 # endif 189 190 #endif 191 192 #if 0 193 # ifndef ZOFF_T_FORMAT_SIZE_PREFIX 194 /* unsupported WIN32 */ 195 196 /* base types for file offsets and file sizes */ 197 typedef long long zoff_t; 198 typedef unsigned long long uzoff_t; 199 200 /* 64-bit stat struct */ 201 typedef struct stat z_stat; 202 203 /* printf format size prefix for zoff_t values */ 204 # define ZOFF_T_FORMAT_SIZE_PREFIX "ll" 205 # endif 206 #endif 207 208 209 /* Automatically set ZIP64_SUPPORT if supported */ 210 211 /* MS C and VC */ 212 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__WATCOMC__) 213 # ifdef LARGE_FILE_SUPPORT 214 # ifndef NO_ZIP64_SUPPORT 215 # ifndef ZIP64_SUPPORT 216 # define ZIP64_SUPPORT 217 # endif 218 # endif 219 # endif 220 #endif 221 222 223 #ifndef LARGE_FILE_SUPPORT 224 /* No Large File Support */ 225 226 /* base type for file offsets and file sizes */ 227 typedef long zoff_t; 228 typedef unsigned long uzoff_t; 229 230 /* stat struct */ 231 typedef struct stat z_stat; 232 233 /* printf format size prefix for zoff_t values */ 234 # define ZOFF_T_FORMAT_SIZE_PREFIX "l" 235 #endif 236 237 238 /* UNICODE */ 239 #ifdef WIN32 240 /* assume wide character conversion functions */ 241 # ifndef UNICODE_SUPPORT 242 # ifndef NO_UNICODE_SUPPORT 243 # define UNICODE_SUPPORT 244 # endif 245 # endif 246 #endif 247 248 #if 0 249 /* this is now generic */ 250 # ifdef UNICODE_SUPPORT 251 /* Set up Unicode support - 9/27/05 EG */ 252 253 /* type of wide string characters */ 254 # define zchar wchar_t 255 256 /* default char string used if a wide char can't be converted */ 257 # define zchar_default "_" 258 259 # else 260 # define zchar char 261 # endif 262 #endif 263 264 265 /* File operations--use "b" for binary if allowed or fixed length 512 on VMS 266 * use "S" for sequential access on NT to prevent the NT 267 * file cache eating up memory with large .zip files 268 */ 269 #define FOPR "rb" 270 #define FOPM "r+b" 271 #define FOPW "wbS" 272 273 #if (defined(__CYGWIN__) && !defined(NO_MKTIME)) 274 # define NO_MKTIME /* Cygnus' mktime() implementation is buggy */ 275 #endif 276 #if (!defined(NT_TZBUG_WORKAROUND) && !defined(NO_NT_TZBUG_WORKAROUND)) 277 # define NT_TZBUG_WORKAROUND 278 #endif 279 #if (defined(UTIL) && defined(NT_TZBUG_WORKAROUND)) 280 # undef NT_TZBUG_WORKAROUND /* the Zip utilities do not use time-stamps */ 281 #endif 282 #if !defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME) 283 # define USE_EF_UT_TIME 284 #endif 285 #if (!defined(NO_NTSD_EAS) && !defined(NTSD_EAS)) 286 # define NTSD_EAS 287 #endif 288 289 #if (defined(NTSD_EAS) && !defined(ZP_NEED_MEMCOMPR)) 290 # define ZP_NEED_MEMCOMPR 291 #endif 292 293 #ifdef WINDLL 294 # ifndef NO_ASM 295 # define NO_ASM 296 # endif 297 # ifndef MSWIN 298 # define MSWIN 299 # endif 300 # ifndef REENTRANT 301 # define REENTRANT 302 # endif 303 #endif /* WINDLL */ 304 305 /* Enable use of optimized x86 assembler version of longest_match() for 306 MSDOS, WIN32 and OS2 per default. */ 307 #if !defined(NO_ASM) && !defined(ASMV) 308 # define ASMV 309 #endif 310 311 /* Enable use of optimized x86 assembler version of crc32() for 312 MSDOS, WIN32 and OS2 per default. */ 313 #if !defined(NO_ASM) && !defined(ASM_CRC) && !defined(NO_ASM_CRC) 314 # define ASM_CRC 315 #endif 316 317 #if !defined(__GO32__) && !defined(__EMX__) && !defined(__CYGWIN__) 318 # define NO_UNISTD_H 319 #endif 320 321 /* Microsoft C requires additional attributes attached to all RTL function 322 * declarations when linking against the CRTL dll. 323 */ 324 #ifdef MSC 325 # ifdef IZ_IMP 326 # undef IZ_IMP 327 # endif 328 # define IZ_IMP _CRTIMP 329 #else 330 # ifndef IZ_IMP 331 # define IZ_IMP 332 # endif 333 #endif 334 335 /* WIN32 runs solely on little-endian processors; enable support 336 * for the 32-bit optimized CRC-32 C code by default. 337 */ 338 #ifdef IZ_CRC_BE_OPTIMIZ 339 # undef IZ_CRC_BE_OPTIMIZ 340 #endif 341 #if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ) 342 # define IZ_CRC_LE_OPTIMIZ 343 #endif 344 345 /* the following definitions are considered as "obsolete" by Microsoft and 346 * might be missing in some versions of <windows.h> 347 */ 348 #ifndef AnsiToOem 349 # define AnsiToOem CharToOemA 350 #endif 351 #ifndef OemToAnsi 352 # define OemToAnsi OemToCharA 353 #endif 354 355 /* handlers for OEM <--> ANSI string conversions */ 356 #if defined(__RSXNT__) || defined(WIN32_CRT_OEM) 357 /* RSXNT uses OEM coded strings in functions supplied by C RTL */ 358 # ifdef CRTL_CP_IS_ISO 359 # undef CRTL_CP_IS_ISO 360 # endif 361 # ifndef CRTL_CP_IS_OEM 362 # define CRTL_CP_IS_OEM 363 # endif 364 #else 365 /* "real" native WIN32 compilers use ANSI coded strings in C RTL calls */ 366 # ifndef CRTL_CP_IS_ISO 367 # define CRTL_CP_IS_ISO 368 # endif 369 # ifdef CRTL_CP_IS_OEM 370 # undef CRTL_CP_IS_OEM 371 # endif 372 #endif 373 374 #ifdef CRTL_CP_IS_ISO 375 /* C RTL's file system support assumes ANSI coded strings */ 376 # define ISO_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} 377 # define OEM_TO_INTERN(src, dst) OemToAnsi(src, dst) 378 # define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} 379 # define INTERN_TO_OEM(src, dst) AnsiToOem(src, dst) 380 # define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1) 381 # define _ISO_INTERN(str1) {;} 382 # define _INTERN_OEM(str1) INTERN_TO_OEM(str1, str1) 383 # define _INTERN_ISO(str1) {;} 384 #endif /* CRTL_CP_IS_ISO */ 385 #ifdef CRTL_CP_IS_OEM 386 /* C RTL's file system support assumes OEM coded strings */ 387 # define ISO_TO_INTERN(src, dst) AnsiToOem(src, dst) 388 # define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} 389 # define INTERN_TO_ISO(src, dst) OemToAnsi(src, dst) 390 # define INTERN_TO_OEM(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} 391 # define _OEM_INTERN(str1) {;} 392 # define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1) 393 # define _INTERN_OEM(str1) {;} 394 # define _INTERN_ISO(str1) INTERN_TO_ISO(str1, str1) 395 #endif /* CRTL_CP_IS_OEM */ 396 397 /* The following "OEM vs. ISO Zip entry names" code has been copied from UnZip. 398 * It should be applicable to the generic Zip code. However, currently only 399 * the Win32 port of Zip supplies the required charset conversion functions. 400 * (The Win32 port uses conversion functions supplied by the OS.) 401 */ 402 /* Convert filename (and file comment string) into "internal" charset. 403 * This macro assumes that Zip entry filenames are coded in OEM (IBM DOS) 404 * codepage when made on 405 * -> DOS (this includes 16-bit Windows 3.1) (FS_FAT_) 406 * -> OS/2 (FS_HPFS_) 407 * -> Win95/WinNT with Nico Mak's WinZip (FS_NTFS_ && hostver == "5.0") 408 * EXCEPTIONS: 409 * PKZIP for Windows 2.5, 2.6, and 4.0 flag their entries as "FS_FAT_", but 410 * the filename stored in the local header is coded in Windows ANSI (CP 1252 411 * resp. ISO 8859-1 on US and western Europe locale settings). 412 * Likewise, PKZIP for UNIX 2.51 flags its entries as "FS_FAT_", but the 413 * filenames stored in BOTH the local and the central header are coded 414 * in the local system's codepage (usually ANSI codings like ISO 8859-1, 415 * but could also be UTF-8 on "modern" setups...). 416 * 417 * All other ports are assumed to code zip entry filenames in ISO (8859-1 418 * on "Western" localisations). 419 */ 420 #define FS_FAT_ 0 /* filesystem used by MS-DOS, OS/2, Win32 */ 421 #define FS_HPFS_ 6 /* filesystem used by OS/2 (and NT 3.x) */ 422 #define FS_NTFS_ 11 /* filesystem used by Windows NT */ 423 #ifndef Ext_ASCII_TO_Native 424 # define Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr) \ 425 if (((hostnum) == FS_FAT_ && \ 426 !(((islochdr) || (isuxatt)) && \ 427 ((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \ 428 (hostnum) == FS_HPFS_ || \ 429 ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \ 430 _OEM_INTERN((string)); \ 431 } else { \ 432 _ISO_INTERN((string)); \ 433 } 434 #endif 435 436 #if (defined(__RSXNT__) && defined(__CRTRSXNT__)) 437 # include <crtrsxnt.h> 438 #endif 439 440 #ifdef _MBCS 441 # if (!defined(__EMX__) && !defined(__MINGW32__) && !defined(__CYGWIN__)) 442 # include <stdlib.h> 443 # include <mbstring.h> 444 # endif 445 # if (defined(__MINGW32__) && !defined(MB_CUR_MAX)) 446 # ifdef __MSVCRT__ 447 IZ_IMP extern int *__p___mb_cur_max(void); 448 # define MB_CUR_MAX (*__p___mb_cur_max()) 449 # else 450 IZ_IMP extern int *_imp____mb_cur_max_dll; 451 # define MB_CUR_MAX (*_imp____mb_cur_max_dll) 452 # endif 453 # endif 454 # if (defined(__LCC__) && !defined(MB_CUR_MAX)) 455 IZ_IMP extern int *_imp____mb_cur_max; 456 # define MB_CUR_MAX (*_imp____mb_cur_max) 457 # endif 458 #endif 459 460 #ifdef __LCC__ 461 # include <time.h> 462 # ifndef tzset 463 # define tzset _tzset 464 # endif 465 # ifndef utime 466 # define utime _utime 467 # endif 468 #endif 469 #ifdef __MINGW32__ 470 IZ_IMP extern void _tzset(void); /* this is missing in <time.h> */ 471 # ifndef tzset 472 # define tzset _tzset 473 # endif 474 #endif 475 #if (defined(__RSXNT__) || defined(__EMX__)) && !defined(tzset) 476 # define tzset _tzset 477 #endif 478 #ifdef W32_USE_IZ_TIMEZONE 479 # ifdef __BORLANDC__ 480 # define tzname tzname 481 # define IZTZ_DEFINESTDGLOBALS 482 # endif 483 # ifndef tzset 484 # define tzset _tzset 485 # endif 486 # ifndef timezone 487 # define timezone _timezone 488 # endif 489 # ifndef daylight 490 # define daylight _daylight 491 # endif 492 # ifndef tzname 493 # define tzname _tzname 494 # endif 495 # if (!defined(NEED__ISINDST) && !defined(__BORLANDC__)) 496 # define NEED__ISINDST 497 # endif 498 # ifdef IZTZ_GETLOCALETZINFO 499 # undef IZTZ_GETLOCALETZINFO 500 # endif 501 # define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone 502 #endif /* W32_USE_IZ_TIMEZONE */ 503 504 #ifdef MATCH 505 # undef MATCH 506 #endif 507 #define MATCH dosmatch /* use DOS style wildcard matching */ 508 #ifdef UNICODE_SUPPORT 509 # ifdef WIN32 510 # define MATCHW dosmatchw 511 # endif 512 #endif 513 514 #ifdef ZCRYPT_INTERNAL 515 # ifdef WINDLL 516 # define ZCR_SEED2 (unsigned)3141592654L /* use PI as seed pattern */ 517 # else 518 # include <process.h> /* getpid() declaration for srand seed */ 519 # endif 520 #endif 521 522 /* Up to now, all versions of Microsoft C runtime libraries lack the support 523 * for customized (non-US) switching rules between daylight saving time and 524 * standard time in the TZ environment variable string. 525 * But non-US timezone rules are correctly supported when timezone information 526 * is read from the OS system settings in the Win32 registry. 527 * The following work-around deletes any TZ environment setting from 528 * the process environment. This results in a fallback of the RTL time 529 * handling code to the (correctly interpretable) OS system settings, read 530 * from the registry. 531 */ 532 #ifdef USE_EF_UT_TIME 533 # if (defined(__WATCOMC__) || defined(__CYGWIN__) || \ 534 defined(W32_USE_IZ_TIMEZONE)) 535 # define iz_w32_prepareTZenv() 536 # else 537 # define iz_w32_prepareTZenv() putenv("TZ=") 538 # endif 539 #endif 540 541 /* This patch of stat() is useful for at least three compilers. It is */ 542 /* difficult to take a stat() of a root directory under Windows95, so */ 543 /* zstat_zipwin32() detects that case and fills in suitable values. */ 544 #ifndef __RSXNT__ 545 # ifndef W32_STATROOT_FIX 546 # define W32_STATROOT_FIX 547 # endif 548 #endif /* !__RSXNT__ */ 549 550 #if (defined(NT_TZBUG_WORKAROUND) || defined(W32_STATROOT_FIX)) 551 # define W32_STAT_BANDAID 552 # ifdef LARGE_FILE_SUPPORT /* E. Gordon 9/12/03 */ 553 int zstat_zipwin32(const char *path, z_stat *buf); 554 # else 555 int zstat_zipwin32(const char *path, struct stat *buf); 556 # endif 557 # ifdef UNICODE_SUPPORT 558 # ifdef LARGE_FILE_SUPPORT 559 int zstat_zipwin32w(const wchar_t *pathw, struct _stati64 *buf); 560 # else 561 int zstat_zipwin32w(const wchar_t *pathw, struct _stat *buf); 562 # endif 563 # endif 564 # ifdef SSTAT 565 # undef SSTAT 566 # endif 567 # define SSTAT zstat_zipwin32 568 # ifdef UNICODE_SUPPORT 569 # define SSTATW zstat_zipwin32w 570 # endif 571 #endif /* NT_TZBUG_WORKAROUND || W32_STATROOT_FIX */ 572 573 int getch_win32(void); 574 575 #ifdef __GNUC__ 576 # define IZ_PACKED __attribute__((packed)) 577 #else 578 # define IZ_PACKED 579 #endif 580 581 /* for some (all ?) versions of IBM C Set/2 and IBM C Set++ */ 582 #ifndef S_IFMT 583 # define S_IFMT 0xF000 584 #endif /* !S_IFMT */ 585 586 #ifdef __WATCOMC__ 587 # include <stdio.h> /* PATH_MAX is defined here */ 588 # define NO_MKTEMP 589 590 /* Get asm routines to link properly without using "__cdecl": */ 591 # ifdef __386__ 592 # ifdef ASMV 593 # pragma aux match_init "_*" parm caller [] modify [] 594 # pragma aux longest_match "_*" parm caller [] value [eax] \ 595 modify [eax ecx edx] 596 # endif 597 # if defined(ASM_CRC) && !defined(USE_ZLIB) 598 # pragma aux crc32 "_*" parm caller [] value [eax] modify [eax] 599 # pragma aux get_crc_table "_*" parm caller [] value [eax] \ 600 modify [eax ecx edx] 601 # endif /* ASM_CRC && !USE_ZLIB */ 602 # endif /* __386__ */ 603 /* Watcom C (like the other Win32 C compiler systems) does not support 604 * symlinks on Win32, but defines the S_IFLNK symbol nevertheless. 605 * However, the existence of this symbol is used as "symlinks supported" 606 * indicator in the generic Zip code (see tailor.h). So, for a simple 607 * work-around, this symbol is undefined here. */ 608 # ifdef S_IFLNK 609 # undef S_IFLNK 610 # endif 611 # ifdef UNICODE_SUPPORT 612 /* Watcom C does not supply wide-char definitions in the "standard" 613 * headers like MSC; so we have to pull in a wchar-specific header. 614 */ 615 # include <wchar.h> 616 # endif 617 #endif /* __WATCOMC__ */ 618