2316 lines
95 KiB
C
2316 lines
95 KiB
C
|
/*
|
||
|
Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
|
||
|
|
||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||
|
(the contents of which are also included in unzip.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
|
||
|
*/
|
||
|
/*---------------------------------------------------------------------------
|
||
|
|
||
|
zipinfo.c Greg Roelofs et al.
|
||
|
|
||
|
This file contains all of the ZipInfo-specific listing routines for UnZip.
|
||
|
|
||
|
Contains: zi_opts()
|
||
|
zi_end_central()
|
||
|
zipinfo()
|
||
|
zi_long()
|
||
|
zi_short()
|
||
|
zi_time()
|
||
|
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
#define UNZIP_INTERNAL
|
||
|
#include "unzip.h"
|
||
|
|
||
|
|
||
|
#ifndef NO_ZIPINFO /* strings use up too much space in small-memory systems */
|
||
|
|
||
|
/* Define OS-specific attributes for use on ALL platforms--the S_xxxx
|
||
|
* versions of these are defined differently (or not defined) by different
|
||
|
* compilers and operating systems. */
|
||
|
|
||
|
#define UNX_IFMT 0170000 /* Unix file type mask */
|
||
|
#define UNX_IFREG 0100000 /* Unix regular file */
|
||
|
#define UNX_IFSOCK 0140000 /* Unix socket (BSD, not SysV or Amiga) */
|
||
|
#define UNX_IFLNK 0120000 /* Unix symbolic link (not SysV, Amiga) */
|
||
|
#define UNX_IFBLK 0060000 /* Unix block special (not Amiga) */
|
||
|
#define UNX_IFDIR 0040000 /* Unix directory */
|
||
|
#define UNX_IFCHR 0020000 /* Unix character special (not Amiga) */
|
||
|
#define UNX_IFIFO 0010000 /* Unix fifo (BCC, not MSC or Amiga) */
|
||
|
#define UNX_ISUID 04000 /* Unix set user id on execution */
|
||
|
#define UNX_ISGID 02000 /* Unix set group id on execution */
|
||
|
#define UNX_ISVTX 01000 /* Unix directory permissions control */
|
||
|
#define UNX_ENFMT UNX_ISGID /* Unix record locking enforcement flag */
|
||
|
#define UNX_IRWXU 00700 /* Unix read, write, execute: owner */
|
||
|
#define UNX_IRUSR 00400 /* Unix read permission: owner */
|
||
|
#define UNX_IWUSR 00200 /* Unix write permission: owner */
|
||
|
#define UNX_IXUSR 00100 /* Unix execute permission: owner */
|
||
|
#define UNX_IRWXG 00070 /* Unix read, write, execute: group */
|
||
|
#define UNX_IRGRP 00040 /* Unix read permission: group */
|
||
|
#define UNX_IWGRP 00020 /* Unix write permission: group */
|
||
|
#define UNX_IXGRP 00010 /* Unix execute permission: group */
|
||
|
#define UNX_IRWXO 00007 /* Unix read, write, execute: other */
|
||
|
#define UNX_IROTH 00004 /* Unix read permission: other */
|
||
|
#define UNX_IWOTH 00002 /* Unix write permission: other */
|
||
|
#define UNX_IXOTH 00001 /* Unix execute permission: other */
|
||
|
|
||
|
#define VMS_IRUSR UNX_IRUSR /* VMS read/owner */
|
||
|
#define VMS_IWUSR UNX_IWUSR /* VMS write/owner */
|
||
|
#define VMS_IXUSR UNX_IXUSR /* VMS execute/owner */
|
||
|
#define VMS_IRGRP UNX_IRGRP /* VMS read/group */
|
||
|
#define VMS_IWGRP UNX_IWGRP /* VMS write/group */
|
||
|
#define VMS_IXGRP UNX_IXGRP /* VMS execute/group */
|
||
|
#define VMS_IROTH UNX_IROTH /* VMS read/other */
|
||
|
#define VMS_IWOTH UNX_IWOTH /* VMS write/other */
|
||
|
#define VMS_IXOTH UNX_IXOTH /* VMS execute/other */
|
||
|
|
||
|
#define AMI_IFMT 06000 /* Amiga file type mask */
|
||
|
#define AMI_IFDIR 04000 /* Amiga directory */
|
||
|
#define AMI_IFREG 02000 /* Amiga regular file */
|
||
|
#define AMI_IHIDDEN 00200 /* to be supported in AmigaDOS 3.x */
|
||
|
#define AMI_ISCRIPT 00100 /* executable script (text command file) */
|
||
|
#define AMI_IPURE 00040 /* allow loading into resident memory */
|
||
|
#define AMI_IARCHIVE 00020 /* not modified since bit was last set */
|
||
|
#define AMI_IREAD 00010 /* can be opened for reading */
|
||
|
#define AMI_IWRITE 00004 /* can be opened for writing */
|
||
|
#define AMI_IEXECUTE 00002 /* executable image, a loadable runfile */
|
||
|
#define AMI_IDELETE 00001 /* can be deleted */
|
||
|
|
||
|
#define THS_IFMT 0xF000 /* Theos file type mask */
|
||
|
#define THS_IFIFO 0x1000 /* pipe */
|
||
|
#define THS_IFCHR 0x2000 /* char device */
|
||
|
#define THS_IFSOCK 0x3000 /* socket */
|
||
|
#define THS_IFDIR 0x4000 /* directory */
|
||
|
#define THS_IFLIB 0x5000 /* library */
|
||
|
#define THS_IFBLK 0x6000 /* block device */
|
||
|
#define THS_IFREG 0x8000 /* regular file */
|
||
|
#define THS_IFREL 0x9000 /* relative (direct) */
|
||
|
#define THS_IFKEY 0xA000 /* keyed */
|
||
|
#define THS_IFIND 0xB000 /* indexed */
|
||
|
#define THS_IFRND 0xC000 /* ???? */
|
||
|
#define THS_IFR16 0xD000 /* 16 bit real mode program */
|
||
|
#define THS_IFP16 0xE000 /* 16 bit protected mode prog */
|
||
|
#define THS_IFP32 0xF000 /* 32 bit protected mode prog */
|
||
|
#define THS_IMODF 0x0800 /* modified */
|
||
|
#define THS_INHID 0x0400 /* not hidden */
|
||
|
#define THS_IEUSR 0x0200 /* erase permission: owner */
|
||
|
#define THS_IRUSR 0x0100 /* read permission: owner */
|
||
|
#define THS_IWUSR 0x0080 /* write permission: owner */
|
||
|
#define THS_IXUSR 0x0040 /* execute permission: owner */
|
||
|
#define THS_IROTH 0x0004 /* read permission: other */
|
||
|
#define THS_IWOTH 0x0002 /* write permission: other */
|
||
|
#define THS_IXOTH 0x0001 /* execute permission: other */
|
||
|
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
# include "theos/oldstat.h"
|
||
|
#endif
|
||
|
|
||
|
#ifndef NSK_UNSTRUCTURED
|
||
|
# define NSK_UNSTRUCTURED 0
|
||
|
#endif
|
||
|
#ifndef NSK_OBJECTFILECODE
|
||
|
# define NSK_OBJECTFILECODE 100
|
||
|
#endif
|
||
|
#ifndef NSK_EDITFILECODE
|
||
|
# define NSK_EDITFILECODE 101
|
||
|
#endif
|
||
|
|
||
|
#define LFLAG 3 /* short "ls -l" type listing */
|
||
|
|
||
|
static int zi_long OF((__GPRO__ zusz_t *pEndprev, int error_in_archive));
|
||
|
static int zi_short OF((__GPRO));
|
||
|
static void zi_showMacTypeCreator
|
||
|
OF((__GPRO__ uch *ebfield));
|
||
|
static char *zi_time OF((__GPRO__ ZCONST ulg *datetimez,
|
||
|
ZCONST time_t *modtimez, char *d_t_str));
|
||
|
|
||
|
|
||
|
/**********************************************/
|
||
|
/* Strings used in zipinfo.c (ZipInfo half) */
|
||
|
/**********************************************/
|
||
|
|
||
|
static ZCONST char nullStr[] = "";
|
||
|
static ZCONST char PlurSufx[] = "s";
|
||
|
|
||
|
static ZCONST char Far ZipInfHeader2[] =
|
||
|
"Zip file size: %s bytes, number of entries: %s\n";
|
||
|
static ZCONST char Far EndCentDirRec[] = "\nEnd-of-central-directory record:\n";
|
||
|
static ZCONST char Far LineSeparators[] = "-------------------------------\n\n";
|
||
|
static ZCONST char Far ZipFSizeVerbose[] = "\
|
||
|
Zip archive file size: %s (%sh)\n";
|
||
|
static ZCONST char Far ActOffsetCentDir[] = "\
|
||
|
Actual end-cent-dir record offset: %s (%sh)\n\
|
||
|
Expected end-cent-dir record offset: %s (%sh)\n\
|
||
|
(based on the length of the central directory and its expected offset)\n\n";
|
||
|
static ZCONST char Far SinglePartArchive1[] = "\
|
||
|
This zipfile constitutes the sole disk of a single-part archive; its\n\
|
||
|
central directory contains %s %s.\n\
|
||
|
The central directory is %s (%sh) bytes long,\n";
|
||
|
static ZCONST char Far SinglePartArchive2[] = "\
|
||
|
and its (expected) offset in bytes from the beginning of the zipfile\n\
|
||
|
is %s (%sh).\n\n";
|
||
|
static ZCONST char Far MultiPartArchive1[] = "\
|
||
|
This zipfile constitutes disk %lu of a multi-part archive. The central\n\
|
||
|
directory starts on disk %lu at an offset within that archive part\n";
|
||
|
static ZCONST char Far MultiPartArchive2[] = "\
|
||
|
of %s (%sh) bytes. The entire\n\
|
||
|
central directory is %s (%sh) bytes long.\n";
|
||
|
static ZCONST char Far MultiPartArchive3[] = "\
|
||
|
%s of the archive entries %s contained within this zipfile volume,\n\
|
||
|
out of a total of %s %s.\n\n";
|
||
|
|
||
|
static ZCONST char Far CentralDirEntry[] =
|
||
|
"\nCentral directory entry #%lu:\n---------------------------\n\n";
|
||
|
static ZCONST char Far ZipfileStats[] =
|
||
|
"%lu file%s, %s bytes uncompressed, %s bytes compressed: %s%d.%d%%\n";
|
||
|
|
||
|
/* zi_long() strings */
|
||
|
static ZCONST char Far OS_FAT[] = "MS-DOS, OS/2 or NT FAT";
|
||
|
static ZCONST char Far OS_Amiga[] = "Amiga";
|
||
|
static ZCONST char Far OS_VMS[] = "VMS";
|
||
|
static ZCONST char Far OS_Unix[] = "Unix";
|
||
|
static ZCONST char Far OS_VMCMS[] = "VM/CMS";
|
||
|
static ZCONST char Far OS_AtariST[] = "Atari ST";
|
||
|
static ZCONST char Far OS_HPFS[] = "OS/2 or NT HPFS";
|
||
|
static ZCONST char Far OS_Macintosh[] = "Macintosh HFS";
|
||
|
static ZCONST char Far OS_ZSystem[] = "Z-System";
|
||
|
static ZCONST char Far OS_CPM[] = "CP/M";
|
||
|
static ZCONST char Far OS_TOPS20[] = "TOPS-20";
|
||
|
static ZCONST char Far OS_NTFS[] = "NTFS";
|
||
|
static ZCONST char Far OS_QDOS[] = "SMS/QDOS";
|
||
|
static ZCONST char Far OS_Acorn[] = "Acorn RISC OS";
|
||
|
static ZCONST char Far OS_MVS[] = "MVS";
|
||
|
static ZCONST char Far OS_VFAT[] = "Win32 VFAT";
|
||
|
static ZCONST char Far OS_AtheOS[] = "AtheOS";
|
||
|
static ZCONST char Far OS_BeOS[] = "BeOS";
|
||
|
static ZCONST char Far OS_Tandem[] = "Tandem NSK";
|
||
|
static ZCONST char Far OS_Theos[] = "Theos";
|
||
|
static ZCONST char Far OS_MacDarwin[] = "Mac OS/X (Darwin)";
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
static ZCONST char Far OS_TheosOld[] = "Theos (Old)";
|
||
|
#endif /* OLD_THEOS_EXTRA */
|
||
|
|
||
|
static ZCONST char Far MthdNone[] = "none (stored)";
|
||
|
static ZCONST char Far MthdShrunk[] = "shrunk";
|
||
|
static ZCONST char Far MthdRedF1[] = "reduced (factor 1)";
|
||
|
static ZCONST char Far MthdRedF2[] = "reduced (factor 2)";
|
||
|
static ZCONST char Far MthdRedF3[] = "reduced (factor 3)";
|
||
|
static ZCONST char Far MthdRedF4[] = "reduced (factor 4)";
|
||
|
static ZCONST char Far MthdImplode[] = "imploded";
|
||
|
static ZCONST char Far MthdToken[] = "tokenized";
|
||
|
static ZCONST char Far MthdDeflate[] = "deflated";
|
||
|
static ZCONST char Far MthdDeflat64[] = "deflated (enhanced-64k)";
|
||
|
static ZCONST char Far MthdDCLImplode[] = "imploded (PK DCL)";
|
||
|
static ZCONST char Far MthdBZip2[] = "bzipped";
|
||
|
static ZCONST char Far MthdLZMA[] = "LZMA-ed";
|
||
|
static ZCONST char Far MthdTerse[] = "tersed (IBM)";
|
||
|
static ZCONST char Far MthdLZ77[] = "LZ77-compressed (IBM)";
|
||
|
static ZCONST char Far MthdWavPack[] = "WavPacked";
|
||
|
static ZCONST char Far MthdPPMd[] = "PPMd-ed";
|
||
|
|
||
|
static ZCONST char Far DeflNorm[] = "normal";
|
||
|
static ZCONST char Far DeflMax[] = "maximum";
|
||
|
static ZCONST char Far DeflFast[] = "fast";
|
||
|
static ZCONST char Far DeflSFast[] = "superfast";
|
||
|
|
||
|
static ZCONST char Far ExtraBytesPreceding[] =
|
||
|
" There are an extra %s bytes preceding this file.\n\n";
|
||
|
|
||
|
static ZCONST char Far UnknownNo[] = "unknown (%d)";
|
||
|
|
||
|
#ifdef ZIP64_SUPPORT
|
||
|
static ZCONST char Far LocalHeaderOffset[] =
|
||
|
"\n offset of local header from start of archive: %s\n\
|
||
|
(%sh) bytes\n";
|
||
|
#else
|
||
|
static ZCONST char Far LocalHeaderOffset[] =
|
||
|
"\n offset of local header from start of archive: %s (%sh) bytes\n";
|
||
|
#endif
|
||
|
static ZCONST char Far HostOS[] =
|
||
|
" file system or operating system of origin: %s\n";
|
||
|
static ZCONST char Far EncodeSWVer[] =
|
||
|
" version of encoding software: %u.%u\n";
|
||
|
static ZCONST char Far MinOSCompReq[] =
|
||
|
" minimum file system compatibility required: %s\n";
|
||
|
static ZCONST char Far MinSWVerReq[] =
|
||
|
" minimum software version required to extract: %u.%u\n";
|
||
|
static ZCONST char Far CompressMethod[] =
|
||
|
" compression method: %s\n";
|
||
|
static ZCONST char Far SlideWindowSizeImplode[] =
|
||
|
" size of sliding dictionary (implosion): %cK\n";
|
||
|
static ZCONST char Far ShannonFanoTrees[] =
|
||
|
" number of Shannon-Fano trees (implosion): %c\n";
|
||
|
static ZCONST char Far CompressSubtype[] =
|
||
|
" compression sub-type (deflation): %s\n";
|
||
|
static ZCONST char Far FileSecurity[] =
|
||
|
" file security status: %sencrypted\n";
|
||
|
static ZCONST char Far ExtendedLocalHdr[] =
|
||
|
" extended local header: %s\n";
|
||
|
static ZCONST char Far FileModDate[] =
|
||
|
" file last modified on (DOS date/time): %s\n";
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
static ZCONST char Far UT_FileModDate[] =
|
||
|
" file last modified on (UT extra field modtime): %s %s\n";
|
||
|
static ZCONST char Far LocalTime[] = "local";
|
||
|
#ifndef NO_GMTIME
|
||
|
static ZCONST char Far GMTime[] = "UTC";
|
||
|
#endif
|
||
|
#endif /* USE_EF_UT_TIME */
|
||
|
static ZCONST char Far CRC32Value[] =
|
||
|
" 32-bit CRC value (hex): %.8lx\n";
|
||
|
static ZCONST char Far CompressedFileSize[] =
|
||
|
" compressed size: %s bytes\n";
|
||
|
static ZCONST char Far UncompressedFileSize[] =
|
||
|
" uncompressed size: %s bytes\n";
|
||
|
static ZCONST char Far FilenameLength[] =
|
||
|
" length of filename: %u characters\n";
|
||
|
static ZCONST char Far ExtraFieldLength[] =
|
||
|
" length of extra field: %u bytes\n";
|
||
|
static ZCONST char Far FileCommentLength[] =
|
||
|
" length of file comment: %u characters\n";
|
||
|
static ZCONST char Far FileDiskNum[] =
|
||
|
" disk number on which file begins: disk %lu\n";
|
||
|
static ZCONST char Far ApparentFileType[] =
|
||
|
" apparent file type: %s\n";
|
||
|
static ZCONST char Far VMSFileAttributes[] =
|
||
|
" VMS file attributes (%06o octal): %s\n";
|
||
|
static ZCONST char Far AmigaFileAttributes[] =
|
||
|
" Amiga file attributes (%06o octal): %s\n";
|
||
|
static ZCONST char Far UnixFileAttributes[] =
|
||
|
" Unix file attributes (%06o octal): %s\n";
|
||
|
static ZCONST char Far NonMSDOSFileAttributes[] =
|
||
|
" non-MSDOS external file attributes: %06lX hex\n";
|
||
|
static ZCONST char Far MSDOSFileAttributes[] =
|
||
|
" MS-DOS file attributes (%02X hex): none\n";
|
||
|
static ZCONST char Far MSDOSFileAttributesRO[] =
|
||
|
" MS-DOS file attributes (%02X hex): read-only\n";
|
||
|
static ZCONST char Far MSDOSFileAttributesAlpha[] =
|
||
|
" MS-DOS file attributes (%02X hex): %s%s%s%s%s%s%s%s\n";
|
||
|
static ZCONST char Far TheosFileAttributes[] =
|
||
|
" Theos file attributes (%04X hex): %s\n";
|
||
|
|
||
|
static ZCONST char Far TheosFTypLib[] = "Library ";
|
||
|
static ZCONST char Far TheosFTypDir[] = "Directory ";
|
||
|
static ZCONST char Far TheosFTypReg[] = "Sequential ";
|
||
|
static ZCONST char Far TheosFTypRel[] = "Direct ";
|
||
|
static ZCONST char Far TheosFTypKey[] = "Keyed ";
|
||
|
static ZCONST char Far TheosFTypInd[] = "Indexed ";
|
||
|
static ZCONST char Far TheosFTypR16[] = " 86 program ";
|
||
|
static ZCONST char Far TheosFTypP16[] = "286 program ";
|
||
|
static ZCONST char Far TheosFTypP32[] = "386 program ";
|
||
|
static ZCONST char Far TheosFTypUkn[] = "??? ";
|
||
|
|
||
|
static ZCONST char Far ExtraFieldTrunc[] = "\n\
|
||
|
error: EF data block (type 0x%04x) size %u exceeds remaining extra field\n\
|
||
|
space %u; block length has been truncated.\n";
|
||
|
static ZCONST char Far ExtraFields[] = "\n\
|
||
|
The central-directory extra field contains:";
|
||
|
static ZCONST char Far ExtraFieldType[] = "\n\
|
||
|
- A subfield with ID 0x%04x (%s) and %u data bytes";
|
||
|
static ZCONST char Far efPKSZ64[] = "PKWARE 64-bit sizes";
|
||
|
static ZCONST char Far efAV[] = "PKWARE AV";
|
||
|
static ZCONST char Far efOS2[] = "OS/2";
|
||
|
static ZCONST char Far efPKVMS[] = "PKWARE VMS";
|
||
|
static ZCONST char Far efPKWin32[] = "PKWARE Win32";
|
||
|
static ZCONST char Far efPKUnix[] = "PKWARE Unix";
|
||
|
static ZCONST char Far efIZVMS[] = "Info-ZIP VMS";
|
||
|
static ZCONST char Far efIZUnix[] = "old Info-ZIP Unix/OS2/NT";
|
||
|
static ZCONST char Far efIZUnix2[] = "Unix UID/GID (16-bit)";
|
||
|
static ZCONST char Far efIZUnix3[] = "Unix UID/GID (any size)";
|
||
|
static ZCONST char Far efTime[] = "universal time";
|
||
|
static ZCONST char Far efU8Path[] = "UTF8 path name";
|
||
|
static ZCONST char Far efU8Commnt[] = "UTF8 entry comment";
|
||
|
static ZCONST char Far efJLMac[] = "old Info-ZIP Macintosh";
|
||
|
static ZCONST char Far efMac3[] = "new Info-ZIP Macintosh";
|
||
|
static ZCONST char Far efZipIt[] = "ZipIt Macintosh";
|
||
|
static ZCONST char Far efSmartZip[] = "SmartZip Macintosh";
|
||
|
static ZCONST char Far efZipIt2[] = "ZipIt Macintosh (short)";
|
||
|
static ZCONST char Far efVMCMS[] = "VM/CMS";
|
||
|
static ZCONST char Far efMVS[] = "MVS";
|
||
|
static ZCONST char Far efACL[] = "OS/2 ACL";
|
||
|
static ZCONST char Far efNTSD[] = "Security Descriptor";
|
||
|
static ZCONST char Far efAtheOS[] = "AtheOS";
|
||
|
static ZCONST char Far efBeOS[] = "BeOS";
|
||
|
static ZCONST char Far efQDOS[] = "SMS/QDOS";
|
||
|
static ZCONST char Far efAOSVS[] = "AOS/VS";
|
||
|
static ZCONST char Far efSpark[] = "Acorn SparkFS";
|
||
|
static ZCONST char Far efMD5[] = "Fred Kantor MD5";
|
||
|
static ZCONST char Far efASiUnix[] = "ASi Unix";
|
||
|
static ZCONST char Far efTandem[] = "Tandem NSK";
|
||
|
static ZCONST char Far efTheos[] = "Theos";
|
||
|
static ZCONST char Far efUnknown[] = "unknown";
|
||
|
|
||
|
static ZCONST char Far OS2EAs[] = ".\n\
|
||
|
The local extra field has %lu bytes of OS/2 extended attributes.\n\
|
||
|
(May not match OS/2 \"dir\" amount due to storage method)";
|
||
|
static ZCONST char Far izVMSdata[] = ". The extra\n\
|
||
|
field is %s and has %u bytes of VMS %s information%s";
|
||
|
static ZCONST char Far izVMSstored[] = "stored";
|
||
|
static ZCONST char Far izVMSrleenc[] = "run-length encoded";
|
||
|
static ZCONST char Far izVMSdeflat[] = "deflated";
|
||
|
static ZCONST char Far izVMScunknw[] = "compressed(?)";
|
||
|
static ZCONST char Far *izVMScomp[4] =
|
||
|
{izVMSstored, izVMSrleenc, izVMSdeflat, izVMScunknw};
|
||
|
static ZCONST char Far ACLdata[] = ".\n\
|
||
|
The local extra field has %lu bytes of access control list information";
|
||
|
static ZCONST char Far NTSDData[] = ".\n\
|
||
|
The local extra field has %lu bytes of NT security descriptor data";
|
||
|
static ZCONST char Far UTdata[] = ".\n\
|
||
|
The local extra field has UTC/GMT %s time%s";
|
||
|
static ZCONST char Far UTmodification[] = "modification";
|
||
|
static ZCONST char Far UTaccess[] = "access";
|
||
|
static ZCONST char Far UTcreation[] = "creation";
|
||
|
static ZCONST char Far U8PthCmnComplete[] = ".\n\
|
||
|
The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are:\n ";
|
||
|
static ZCONST char Far U8PthCmnF24[] = ". The first\n\
|
||
|
24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are:\n ";
|
||
|
static ZCONST char Far ZipItFname[] = ".\n\
|
||
|
The Mac long filename is %s";
|
||
|
static ZCONST char Far Mac3data[] = ".\n\
|
||
|
The local extra field has %lu bytes of %scompressed Macintosh\n\
|
||
|
finder attributes";
|
||
|
/* MacOSdata[] is used by EF_MAC3, EF_ZIPIT, EF_ZIPIT2 and EF_JLEE e. f. */
|
||
|
static ZCONST char Far MacOSdata[] = ".\n\
|
||
|
The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'";
|
||
|
static ZCONST char Far MacOSdata1[] = ".\n\
|
||
|
The associated file has type code `0x%lx' and creator code `0x%lx'";
|
||
|
static ZCONST char Far MacOSJLEEflags[] = ".\n File is marked as %s";
|
||
|
static ZCONST char Far MacOS_RF[] = "Resource-fork";
|
||
|
static ZCONST char Far MacOS_DF[] = "Data-fork";
|
||
|
static ZCONST char Far MacOSMAC3flags[] = ".\n\
|
||
|
File is marked as %s, File Dates are in %d Bit";
|
||
|
static ZCONST char Far AtheOSdata[] = ".\n\
|
||
|
The local extra field has %lu bytes of %scompressed AtheOS file attributes";
|
||
|
static ZCONST char Far BeOSdata[] = ".\n\
|
||
|
The local extra field has %lu bytes of %scompressed BeOS file attributes";
|
||
|
/* The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'" */
|
||
|
static ZCONST char Far QDOSdata[] = ".\n\
|
||
|
The QDOS extra field subtype is `%c%c%c%c'";
|
||
|
static ZCONST char Far AOSVSdata[] = ".\n\
|
||
|
The AOS/VS extra field revision is %d.%d";
|
||
|
static ZCONST char Far TandemUnstr[] = "Unstructured";
|
||
|
static ZCONST char Far TandemRel[] = "Relative";
|
||
|
static ZCONST char Far TandemEntry[] = "Entry Sequenced";
|
||
|
static ZCONST char Far TandemKey[] = "Key Sequenced";
|
||
|
static ZCONST char Far TandemEdit[] = "Edit";
|
||
|
static ZCONST char Far TandemObj[] = "Object";
|
||
|
static ZCONST char Far *TandemFileformat[6] =
|
||
|
{TandemUnstr, TandemRel, TandemEntry, TandemKey, TandemEdit, TandemObj};
|
||
|
static ZCONST char Far Tandemdata[] = ".\n\
|
||
|
The file was originally a Tandem %s file, with file code %u";
|
||
|
static ZCONST char Far MD5data[] = ".\n\
|
||
|
The 128-bit MD5 signature is %s";
|
||
|
#ifdef CMS_MVS
|
||
|
static ZCONST char Far VmMvsExtraField[] = ".\n\
|
||
|
The stored file open mode (FLDATA TYPE) is \"%s\"";
|
||
|
static ZCONST char Far VmMvsInvalid[] = "[invalid]";
|
||
|
#endif /* CMS_MVS */
|
||
|
|
||
|
static ZCONST char Far First20[] = ". The first\n 20 are: ";
|
||
|
static ZCONST char Far ColonIndent[] = ":\n ";
|
||
|
static ZCONST char Far efFormat[] = " %02x";
|
||
|
|
||
|
static ZCONST char Far lExtraFieldType[] = "\n\
|
||
|
There %s a local extra field with ID 0x%04x (%s) and\n\
|
||
|
%u data bytes (%s).\n";
|
||
|
static ZCONST char Far efIZuid[] =
|
||
|
"GMT modification/access times and Unix UID/GID";
|
||
|
static ZCONST char Far efIZnouid[] = "GMT modification/access times only";
|
||
|
|
||
|
|
||
|
static ZCONST char Far NoFileComment[] = "\n There is no file comment.\n";
|
||
|
static ZCONST char Far FileCommBegin[] = "\n\
|
||
|
------------------------- file comment begins ----------------------------\n";
|
||
|
static ZCONST char Far FileCommEnd[] = "\
|
||
|
-------------------------- file comment ends -----------------------------\n";
|
||
|
|
||
|
/* zi_time() strings */
|
||
|
static ZCONST char Far BogusFmt[] = "%03d";
|
||
|
static ZCONST char Far shtYMDHMTime[] = "%02u-%s-%02u %02u:%02u";
|
||
|
static ZCONST char Far lngYMDHMSTime[] = "%u %s %u %02u:%02u:%02u";
|
||
|
static ZCONST char Far DecimalTime[] = "%04u%02u%02u.%02u%02u%02u";
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
static ZCONST char Far lngYMDHMSTimeError[] = "???? ??? ?? ??:??:??";
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef WINDLL
|
||
|
|
||
|
/************************/
|
||
|
/* Function zi_opts() */
|
||
|
/************************/
|
||
|
|
||
|
int zi_opts(__G__ pargc, pargv)
|
||
|
int *pargc;
|
||
|
char ***pargv;
|
||
|
__GDEF
|
||
|
{
|
||
|
char **argv, *s;
|
||
|
int argc, c, error=FALSE, negative=0;
|
||
|
int hflag_slmv=TRUE, hflag_2=FALSE; /* diff options => diff defaults */
|
||
|
int tflag_slm=TRUE, tflag_2v=FALSE;
|
||
|
int explicit_h=FALSE, explicit_t=FALSE;
|
||
|
|
||
|
|
||
|
#ifdef MACOS
|
||
|
uO.lflag = LFLAG; /* reset default on each call */
|
||
|
#endif
|
||
|
G.extract_flag = FALSE; /* zipinfo does not extract to disk */
|
||
|
argc = *pargc;
|
||
|
argv = *pargv;
|
||
|
|
||
|
while (--argc > 0 && (*++argv)[0] == '-') {
|
||
|
s = argv[0] + 1;
|
||
|
while ((c = *s++) != 0) { /* "!= 0": prevent Turbo C warning */
|
||
|
switch (c) {
|
||
|
case '-':
|
||
|
++negative;
|
||
|
break;
|
||
|
case '1': /* shortest listing: JUST filenames */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 1;
|
||
|
break;
|
||
|
case '2': /* just filenames, plus headers if specified */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 2;
|
||
|
break;
|
||
|
#ifndef CMS_MVS
|
||
|
case ('C'): /* -C: match filenames case-insensitively */
|
||
|
if (negative)
|
||
|
uO.C_flag = FALSE, negative = 0;
|
||
|
else
|
||
|
uO.C_flag = TRUE;
|
||
|
break;
|
||
|
#endif /* !CMS_MVS */
|
||
|
case 'h': /* header line */
|
||
|
if (negative)
|
||
|
hflag_2 = hflag_slmv = FALSE, negative = 0;
|
||
|
else {
|
||
|
hflag_2 = hflag_slmv = explicit_h = TRUE;
|
||
|
if (uO.lflag == -1)
|
||
|
uO.lflag = 0;
|
||
|
}
|
||
|
break;
|
||
|
case 'l': /* longer form of "ls -l" type listing */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 5;
|
||
|
break;
|
||
|
case 'm': /* medium form of "ls -l" type listing */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 4;
|
||
|
break;
|
||
|
#ifdef MORE
|
||
|
case 'M': /* send output through built-in "more" */
|
||
|
if (negative)
|
||
|
G.M_flag = FALSE, negative = 0;
|
||
|
else
|
||
|
G.M_flag = TRUE;
|
||
|
break;
|
||
|
#endif
|
||
|
case 's': /* default: shorter "ls -l" type listing */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 3;
|
||
|
break;
|
||
|
case 't': /* totals line */
|
||
|
if (negative)
|
||
|
tflag_2v = tflag_slm = FALSE, negative = 0;
|
||
|
else {
|
||
|
tflag_2v = tflag_slm = explicit_t = TRUE;
|
||
|
if (uO.lflag == -1)
|
||
|
uO.lflag = 0;
|
||
|
}
|
||
|
break;
|
||
|
case ('T'): /* use (sortable) decimal time format */
|
||
|
if (negative)
|
||
|
uO.T_flag = FALSE, negative = 0;
|
||
|
else
|
||
|
uO.T_flag = TRUE;
|
||
|
break;
|
||
|
#ifdef UNICODE_SUPPORT
|
||
|
case ('U'): /* escape UTF-8, or disable UTF-8 support */
|
||
|
if (negative) {
|
||
|
uO.U_flag = MAX(uO.U_flag-negative,0);
|
||
|
negative = 0;
|
||
|
} else
|
||
|
uO.U_flag++;
|
||
|
break;
|
||
|
#endif /* UNICODE_SUPPORT */
|
||
|
case 'v': /* turbo-verbose listing */
|
||
|
if (negative)
|
||
|
uO.lflag = -2, negative = 0;
|
||
|
else
|
||
|
uO.lflag = 10;
|
||
|
break;
|
||
|
#ifdef WILD_STOP_AT_DIR
|
||
|
case ('W'): /* Wildcard interpretation (stop at '/'?) */
|
||
|
if (negative)
|
||
|
uO.W_flag = FALSE, negative = 0;
|
||
|
else
|
||
|
uO.W_flag = TRUE;
|
||
|
break;
|
||
|
#endif /* WILD_STOP_AT_DIR */
|
||
|
case 'z': /* print zipfile comment */
|
||
|
if (negative)
|
||
|
uO.zflag = negative = 0;
|
||
|
else
|
||
|
uO.zflag = 1;
|
||
|
break;
|
||
|
case 'Z': /* ZipInfo mode: ignore */
|
||
|
break;
|
||
|
default:
|
||
|
error = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ((argc-- == 0) || error) {
|
||
|
*pargc = argc;
|
||
|
*pargv = argv;
|
||
|
return USAGE(error);
|
||
|
}
|
||
|
|
||
|
#ifdef MORE
|
||
|
if (G.M_flag && !isatty(1)) /* stdout redirected: "more" func useless */
|
||
|
G.M_flag = 0;
|
||
|
#endif
|
||
|
|
||
|
/* if no listing options given (or all negated), or if only -h/-t given
|
||
|
* with individual files specified, use default listing format */
|
||
|
if ((uO.lflag < 0) || ((argc > 0) && (uO.lflag == 0)))
|
||
|
uO.lflag = LFLAG;
|
||
|
|
||
|
/* set header and totals flags to default or specified values */
|
||
|
switch (uO.lflag) {
|
||
|
case 0: /* 0: can only occur if either -t or -h explicitly given; */
|
||
|
case 2: /* therefore set both flags equal to normally false value */
|
||
|
uO.hflag = hflag_2;
|
||
|
uO.tflag = tflag_2v;
|
||
|
break;
|
||
|
case 1: /* only filenames, *always* */
|
||
|
uO.hflag = FALSE;
|
||
|
uO.tflag = FALSE;
|
||
|
uO.zflag = FALSE;
|
||
|
break;
|
||
|
case 3:
|
||
|
case 4:
|
||
|
case 5:
|
||
|
uO.hflag = ((argc > 0) && !explicit_h)? FALSE : hflag_slmv;
|
||
|
uO.tflag = ((argc > 0) && !explicit_t)? FALSE : tflag_slm;
|
||
|
break;
|
||
|
case 10:
|
||
|
uO.hflag = hflag_slmv;
|
||
|
uO.tflag = tflag_2v;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*pargc = argc;
|
||
|
*pargv = argv;
|
||
|
return 0;
|
||
|
|
||
|
} /* end function zi_opts() */
|
||
|
|
||
|
#endif /* !WINDLL */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*******************************/
|
||
|
/* Function zi_end_central() */
|
||
|
/*******************************/
|
||
|
|
||
|
void zi_end_central(__G)
|
||
|
__GDEF
|
||
|
{
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Print out various interesting things about the zipfile.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if (uO.lflag > 9) {
|
||
|
/* verbose format */
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(EndCentDirRec)));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(LineSeparators)));
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ZipFSizeVerbose),
|
||
|
FmZofft(G.ziplen, "11", NULL),
|
||
|
FmZofft(G.ziplen, FZOFFT_HEX_DOT_WID, "X")));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ActOffsetCentDir),
|
||
|
FmZofft(G.real_ecrec_offset, "11", "u"),
|
||
|
FmZofft(G.real_ecrec_offset, FZOFFT_HEX_DOT_WID, "X"),
|
||
|
FmZofft(G.expect_ecrec_offset, "11", "u"),
|
||
|
FmZofft(G.expect_ecrec_offset, FZOFFT_HEX_DOT_WID, "X")));
|
||
|
|
||
|
if (G.ecrec.number_this_disk == 0) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(SinglePartArchive1),
|
||
|
FmZofft(G.ecrec.total_entries_central_dir, NULL, "u"),
|
||
|
(G.ecrec.total_entries_central_dir == 1)? "entry" : "entries",
|
||
|
FmZofft(G.ecrec.size_central_directory, NULL, "u"),
|
||
|
FmZofft(G.ecrec.size_central_directory,
|
||
|
FZOFFT_HEX_DOT_WID, "X")));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(SinglePartArchive2),
|
||
|
FmZofft(G.ecrec.offset_start_central_directory, NULL, "u"),
|
||
|
FmZofft(G.ecrec.offset_start_central_directory,
|
||
|
FZOFFT_HEX_DOT_WID, "X")));
|
||
|
} else {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive1),
|
||
|
(ulg)(G.ecrec.number_this_disk + 1),
|
||
|
(ulg)(G.ecrec.num_disk_start_cdir + 1)));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive2),
|
||
|
FmZofft(G.ecrec.offset_start_central_directory, NULL, "u"),
|
||
|
FmZofft(G.ecrec.offset_start_central_directory,
|
||
|
FZOFFT_HEX_DOT_WID, "X"),
|
||
|
FmZofft(G.ecrec.size_central_directory, NULL, "u"),
|
||
|
FmZofft(G.ecrec.size_central_directory,
|
||
|
FZOFFT_HEX_DOT_WID, "X")));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive3),
|
||
|
FmZofft(G.ecrec.num_entries_centrl_dir_ths_disk, NULL, "u"),
|
||
|
(G.ecrec.num_entries_centrl_dir_ths_disk == 1)? "is" : "are",
|
||
|
FmZofft(G.ecrec.total_entries_central_dir, NULL, "u"),
|
||
|
(G.ecrec.total_entries_central_dir == 1) ? "entry" : "entries"));
|
||
|
}
|
||
|
}
|
||
|
else if (uO.hflag) {
|
||
|
/* print zip file size and number of contained entries: */
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ZipInfHeader2),
|
||
|
FmZofft(G.ziplen, NULL, NULL),
|
||
|
FmZofft(G.ecrec.total_entries_central_dir, NULL, "u")));
|
||
|
}
|
||
|
|
||
|
} /* end function zi_end_central() */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/************************/
|
||
|
/* Function zipinfo() */
|
||
|
/************************/
|
||
|
|
||
|
int zipinfo(__G) /* return PK-type error code */
|
||
|
__GDEF
|
||
|
{
|
||
|
int do_this_file=FALSE, error, error_in_archive=PK_COOL;
|
||
|
int *fn_matched=NULL, *xn_matched=NULL;
|
||
|
ulg j, members=0L;
|
||
|
zusz_t tot_csize=0L, tot_ucsize=0L;
|
||
|
zusz_t endprev; /* buffers end of previous entry for zi_long()'s check
|
||
|
* of extra bytes */
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Malloc space for check on unmatched filespecs (no big deal if one or both
|
||
|
are NULL).
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if (G.filespecs > 0 &&
|
||
|
(fn_matched=(int *)malloc(G.filespecs*sizeof(int))) != NULL)
|
||
|
for (j = 0; j < G.filespecs; ++j)
|
||
|
fn_matched[j] = FALSE;
|
||
|
|
||
|
if (G.xfilespecs > 0 &&
|
||
|
(xn_matched=(int *)malloc(G.xfilespecs*sizeof(int))) != NULL)
|
||
|
for (j = 0; j < G.xfilespecs; ++j)
|
||
|
xn_matched[j] = FALSE;
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Set file pointer to start of central directory, then loop through cen-
|
||
|
tral directory entries. Check that directory-entry signature bytes are
|
||
|
actually there (just a precaution), then process the entry. We know
|
||
|
the entire central directory is on this disk: we wouldn't have any of
|
||
|
this information unless the end-of-central-directory record was on this
|
||
|
disk, and we wouldn't have gotten to this routine unless this is also
|
||
|
the disk on which the central directory starts. In practice, this had
|
||
|
better be the *only* disk in the archive, but maybe someday we'll add
|
||
|
multi-disk support.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
uO.L_flag = FALSE; /* zipinfo mode: never convert name to lowercase */
|
||
|
G.pInfo = G.info; /* (re-)initialize, (just to make sure) */
|
||
|
G.pInfo->textmode = 0; /* so one can read on screen (is this ever used?) */
|
||
|
|
||
|
/* reset endprev for new zipfile; account for multi-part archives (?) */
|
||
|
endprev = (G.crec.relative_offset_local_header == 4L)? 4L : 0L;
|
||
|
|
||
|
|
||
|
for (j = 1L;; j++) {
|
||
|
if (readbuf(__G__ G.sig, 4) == 0) {
|
||
|
error_in_archive = PK_EOF;
|
||
|
break;
|
||
|
}
|
||
|
if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */
|
||
|
/* no new central directory entry
|
||
|
* -> is the number of processed entries compatible with the
|
||
|
* number of entries as stored in the end_central record?
|
||
|
*/
|
||
|
if (((j - 1) &
|
||
|
(ulg)(G.ecrec.have_ecr64 ? MASK_ZUCN64 : MASK_ZUCN16))
|
||
|
== (ulg)G.ecrec.total_entries_central_dir)
|
||
|
{
|
||
|
/* "j modulus 4T/64k" matches the reported 64/16-bit-unsigned
|
||
|
* number of directory entries -> probably, the regular
|
||
|
* end of the central directory has been reached
|
||
|
*/
|
||
|
break;
|
||
|
} else {
|
||
|
Info(slide, 0x401,
|
||
|
((char *)slide, LoadFarString(CentSigMsg), j));
|
||
|
Info(slide, 0x401,
|
||
|
((char *)slide, LoadFarString(ReportMsg)));
|
||
|
error_in_archive = PK_BADERR; /* sig not found */
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
/* process_cdir_file_hdr() sets pInfo->hostnum, pInfo->lcflag, ...: */
|
||
|
if ((error = process_cdir_file_hdr(__G)) != PK_COOL) {
|
||
|
error_in_archive = error; /* only PK_EOF defined */
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) !=
|
||
|
PK_COOL)
|
||
|
{
|
||
|
if (error > error_in_archive)
|
||
|
error_in_archive = error;
|
||
|
if (error > PK_WARN) /* fatal */
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!G.process_all_files) { /* check if specified on command line */
|
||
|
unsigned i;
|
||
|
|
||
|
if (G.filespecs == 0)
|
||
|
do_this_file = TRUE;
|
||
|
else { /* check if this entry matches an `include' argument */
|
||
|
do_this_file = FALSE;
|
||
|
for (i = 0; i < G.filespecs; i++)
|
||
|
if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) {
|
||
|
do_this_file = TRUE;
|
||
|
if (fn_matched)
|
||
|
fn_matched[i] = TRUE;
|
||
|
break; /* found match, so stop looping */
|
||
|
}
|
||
|
}
|
||
|
if (do_this_file) { /* check if this is an excluded file */
|
||
|
for (i = 0; i < G.xfilespecs; i++)
|
||
|
if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) {
|
||
|
do_this_file = FALSE; /* ^-- ignore case in match */
|
||
|
if (xn_matched)
|
||
|
xn_matched[i] = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*-----------------------------------------------------------------------
|
||
|
If current file was specified on command line, or if no names were
|
||
|
specified, do the listing for this file. Otherwise, get rid of the
|
||
|
file comment and go back for the next file.
|
||
|
-----------------------------------------------------------------------*/
|
||
|
|
||
|
if (G.process_all_files || do_this_file) {
|
||
|
|
||
|
/* Read the extra field, if any. The extra field info is required
|
||
|
* for resolving the Zip64 sizes/offsets and may be used in more
|
||
|
* analysis of the entry below.
|
||
|
*/
|
||
|
if ((error = do_string(__G__ G.crec.extra_field_length,
|
||
|
EXTRA_FIELD)) != 0)
|
||
|
{
|
||
|
if (G.extra_field != NULL) {
|
||
|
free(G.extra_field);
|
||
|
G.extra_field = NULL;
|
||
|
}
|
||
|
error_in_archive = error;
|
||
|
/* The premature return in case of a "fatal" error (PK_EOF) is
|
||
|
* delayed until we analyze the extra field contents.
|
||
|
* This allows us to display all the other info that has been
|
||
|
* successfully read in.
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
switch (uO.lflag) {
|
||
|
case 1:
|
||
|
case 2:
|
||
|
fnprint(__G);
|
||
|
SKIP_(G.crec.file_comment_length)
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
case 4:
|
||
|
case 5:
|
||
|
if ((error = zi_short(__G)) != PK_COOL) {
|
||
|
error_in_archive = error; /* might be warning */
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 10:
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(CentralDirEntry), j));
|
||
|
if ((error = zi_long(__G__ &endprev,
|
||
|
error_in_archive)) != PK_COOL) {
|
||
|
error_in_archive = error; /* might be warning */
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
SKIP_(G.crec.file_comment_length)
|
||
|
break;
|
||
|
|
||
|
} /* end switch (lflag) */
|
||
|
if (error > PK_WARN) /* fatal */
|
||
|
break;
|
||
|
|
||
|
tot_csize += G.crec.csize;
|
||
|
tot_ucsize += G.crec.ucsize;
|
||
|
if (G.crec.general_purpose_bit_flag & 1)
|
||
|
tot_csize -= 12; /* don't count encryption header */
|
||
|
++members;
|
||
|
|
||
|
#ifdef DLL
|
||
|
if ((G.statreportcb != NULL) &&
|
||
|
(*G.statreportcb)(__G__ UZ_ST_FINISH_MEMBER, G.zipfn,
|
||
|
G.filename, (zvoid *)&G.crec.ucsize)) {
|
||
|
/* cancel operation by user request */
|
||
|
error_in_archive = IZ_CTRLC;
|
||
|
break;
|
||
|
}
|
||
|
#endif
|
||
|
#ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */
|
||
|
UserStop();
|
||
|
#endif
|
||
|
|
||
|
} else { /* not listing this file */
|
||
|
SKIP_(G.crec.extra_field_length)
|
||
|
SKIP_(G.crec.file_comment_length)
|
||
|
if (endprev != 0) endprev = 0;
|
||
|
|
||
|
} /* end if (list member?) */
|
||
|
|
||
|
} /* end for-loop (j: member files) */
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Check that we actually found requested files; if so, print totals.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if ((error_in_archive <= PK_WARN) && uO.tflag) {
|
||
|
char *sgn = "";
|
||
|
int cfactor = ratio(tot_ucsize, tot_csize);
|
||
|
|
||
|
if (cfactor < 0) {
|
||
|
sgn = "-";
|
||
|
cfactor = -cfactor;
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ZipfileStats),
|
||
|
members, (members==1L)? nullStr:PlurSufx,
|
||
|
FmZofft(tot_ucsize, NULL, "u"),
|
||
|
FmZofft(tot_csize, NULL, "u"),
|
||
|
sgn, cfactor/10, cfactor%10));
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Check for unmatched filespecs on command line and print warning if any
|
||
|
found.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if (fn_matched) {
|
||
|
if (error_in_archive <= PK_WARN)
|
||
|
for (j = 0; j < G.filespecs; ++j)
|
||
|
if (!fn_matched[j])
|
||
|
Info(slide, 0x401, ((char *)slide,
|
||
|
LoadFarString(FilenameNotMatched), G.pfnames[j]));
|
||
|
free((zvoid *)fn_matched);
|
||
|
}
|
||
|
if (xn_matched) {
|
||
|
if (error_in_archive <= PK_WARN)
|
||
|
for (j = 0; j < G.xfilespecs; ++j)
|
||
|
if (!xn_matched[j])
|
||
|
Info(slide, 0x401, ((char *)slide,
|
||
|
LoadFarString(ExclFilenameNotMatched), G.pxnames[j]));
|
||
|
free((zvoid *)xn_matched);
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Skip the following checks in case of a premature listing break. */
|
||
|
if (error_in_archive <= PK_WARN) {
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Double check that we're back at the end-of-central-directory record.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if ( (memcmp(G.sig,
|
||
|
(G.ecrec.have_ecr64 ?
|
||
|
end_central64_sig : end_central_sig),
|
||
|
4) != 0)
|
||
|
&& (!G.ecrec.is_zip64_archive)
|
||
|
&& (memcmp(G.sig, end_central_sig, 4) != 0)
|
||
|
) { /* just to make sure again */
|
||
|
Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg)));
|
||
|
error_in_archive = PK_WARN; /* didn't find sig */
|
||
|
}
|
||
|
|
||
|
/* Set specific return code when no files have been found. */
|
||
|
if (members == 0L && error_in_archive <= PK_WARN)
|
||
|
error_in_archive = PK_FIND;
|
||
|
|
||
|
if (uO.lflag >= 10)
|
||
|
(*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0);
|
||
|
}
|
||
|
|
||
|
return error_in_archive;
|
||
|
|
||
|
} /* end function zipinfo() */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/************************/
|
||
|
/* Function zi_long() */
|
||
|
/************************/
|
||
|
|
||
|
static int zi_long(__G__ pEndprev, error_in_archive)
|
||
|
/* return PK-type error code */
|
||
|
__GDEF
|
||
|
zusz_t *pEndprev; /* for zi_long() check of extra bytes */
|
||
|
int error_in_archive; /* may signal premature return */
|
||
|
{
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
iztimes z_utime;
|
||
|
#endif
|
||
|
int error;
|
||
|
unsigned hostnum, hostver, extnum, extver, methid, methnum, xattr;
|
||
|
char workspace[12], attribs[22];
|
||
|
ZCONST char *varmsg_str;
|
||
|
char unkn[16];
|
||
|
static ZCONST char Far *os[NUM_HOSTS] = {
|
||
|
OS_FAT, OS_Amiga, OS_VMS, OS_Unix, OS_VMCMS, OS_AtariST, OS_HPFS,
|
||
|
OS_Macintosh, OS_ZSystem, OS_CPM, OS_TOPS20, OS_NTFS, OS_QDOS,
|
||
|
OS_Acorn, OS_VFAT, OS_MVS, OS_BeOS, OS_Tandem, OS_Theos, OS_MacDarwin,
|
||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||
|
OS_AtheOS
|
||
|
};
|
||
|
static ZCONST char Far *method[NUM_METHODS] = {
|
||
|
MthdNone, MthdShrunk, MthdRedF1, MthdRedF2, MthdRedF3, MthdRedF4,
|
||
|
MthdImplode, MthdToken, MthdDeflate, MthdDeflat64, MthdDCLImplode,
|
||
|
MthdBZip2, MthdLZMA, MthdTerse, MthdLZ77, MthdWavPack, MthdPPMd
|
||
|
};
|
||
|
static ZCONST char Far *dtypelng[4] = {
|
||
|
DeflNorm, DeflMax, DeflFast, DeflSFast
|
||
|
};
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Check whether there's any extra space inside the zipfile. If *pEndprev is
|
||
|
zero, it's probably a signal that OS/2 extra fields are involved (with
|
||
|
unknown compressed size). We won't worry about prepended junk here...
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if (G.crec.relative_offset_local_header != *pEndprev && *pEndprev > 0L) {
|
||
|
/* GRR DEBUG
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
" [crec.relative_offset_local_header = %lu, endprev = %lu]\n",
|
||
|
G.crec.relative_offset_local_header, *pEndprev));
|
||
|
*/
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ExtraBytesPreceding),
|
||
|
FmZofft((G.crec.relative_offset_local_header - (*pEndprev)),
|
||
|
NULL, NULL)));
|
||
|
}
|
||
|
|
||
|
/* calculate endprev for next time around (problem: extra fields may
|
||
|
* differ in length between local and central-directory records) */
|
||
|
*pEndprev = G.crec.relative_offset_local_header + (4L + LREC_SIZE) +
|
||
|
G.crec.filename_length + G.crec.extra_field_length + G.crec.csize;
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Print out various interesting things about the compressed file.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
hostnum = (unsigned)(G.pInfo->hostnum);
|
||
|
hostver = (unsigned)(G.pInfo->hostver);
|
||
|
extnum = (unsigned)MIN(G.crec.version_needed_to_extract[1], NUM_HOSTS);
|
||
|
extver = (unsigned)G.crec.version_needed_to_extract[0];
|
||
|
methid = (unsigned)G.crec.compression_method;
|
||
|
methnum = find_compr_idx(G.crec.compression_method);
|
||
|
|
||
|
(*G.message)((zvoid *)&G, (uch *)" ", 2L, 0); fnprint(__G);
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(LocalHeaderOffset),
|
||
|
FmZofft(G.crec.relative_offset_local_header, NULL, "u"),
|
||
|
FmZofft(G.crec.relative_offset_local_header, FZOFFT_HEX_DOT_WID, "X")));
|
||
|
|
||
|
if (hostnum >= NUM_HOSTS) {
|
||
|
sprintf(unkn, LoadFarString(UnknownNo),
|
||
|
(int)G.crec.version_made_by[1]);
|
||
|
varmsg_str = unkn;
|
||
|
} else {
|
||
|
varmsg_str = LoadFarStringSmall(os[hostnum]);
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
if (hostnum == FS_VFAT_ && hostver == 20) {
|
||
|
/* entry made by old non-official THEOS port zip archive */
|
||
|
varmsg_str = LoadFarStringSmall(OS_TheosOld);
|
||
|
}
|
||
|
#endif /* OLD_THEOS_EXTRA */
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(HostOS), varmsg_str));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(EncodeSWVer), hostver/10,
|
||
|
hostver%10));
|
||
|
|
||
|
if ((extnum >= NUM_HOSTS) || (os[extnum] == NULL)) {
|
||
|
sprintf(unkn, LoadFarString(UnknownNo),
|
||
|
(int)G.crec.version_needed_to_extract[1]);
|
||
|
varmsg_str = unkn;
|
||
|
} else {
|
||
|
varmsg_str = LoadFarStringSmall(os[extnum]);
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MinOSCompReq), varmsg_str));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MinSWVerReq), extver/10,
|
||
|
extver%10));
|
||
|
|
||
|
if (methnum >= NUM_METHODS) {
|
||
|
sprintf(unkn, LoadFarString(UnknownNo), G.crec.compression_method);
|
||
|
varmsg_str = unkn;
|
||
|
} else {
|
||
|
varmsg_str = LoadFarStringSmall(method[methnum]);
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(CompressMethod), varmsg_str));
|
||
|
if (methid == IMPLODED) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(SlideWindowSizeImplode),
|
||
|
(G.crec.general_purpose_bit_flag & 2)? '8' : '4'));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ShannonFanoTrees),
|
||
|
(G.crec.general_purpose_bit_flag & 4)? '3' : '2'));
|
||
|
} else if (methid == DEFLATED || methid == ENHDEFLATED) {
|
||
|
ush dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3);
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(CompressSubtype),
|
||
|
LoadFarStringSmall(dtypelng[dnum])));
|
||
|
}
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileSecurity),
|
||
|
(G.crec.general_purpose_bit_flag & 1) ? nullStr : "not "));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ExtendedLocalHdr),
|
||
|
(G.crec.general_purpose_bit_flag & 8) ? "yes" : "no"));
|
||
|
/* print upper 3 bits for amusement? */
|
||
|
|
||
|
/* For printing of date & time, a "char d_t_buf[21]" is required.
|
||
|
* To save stack space, we reuse the "char attribs[22]" buffer which
|
||
|
* is not used yet.
|
||
|
*/
|
||
|
# define d_t_buf attribs
|
||
|
|
||
|
zi_time(__G__ &G.crec.last_mod_dos_datetime, NULL, d_t_buf);
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileModDate), d_t_buf));
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
if (G.extra_field &&
|
||
|
#ifdef IZ_CHECK_TZ
|
||
|
G.tz_is_valid &&
|
||
|
#endif
|
||
|
(ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1,
|
||
|
G.crec.last_mod_dos_datetime, &z_utime, NULL)
|
||
|
& EB_UT_FL_MTIME))
|
||
|
{
|
||
|
TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0 or Macintosh */
|
||
|
d_t_buf[0] = (char)0; /* signal "show local time" */
|
||
|
zi_time(__G__ &G.crec.last_mod_dos_datetime, &(z_utime.mtime), d_t_buf);
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(UT_FileModDate),
|
||
|
d_t_buf, LoadFarStringSmall(LocalTime)));
|
||
|
#ifndef NO_GMTIME
|
||
|
d_t_buf[0] = (char)1; /* signal "show UTC (GMT) time" */
|
||
|
zi_time(__G__ &G.crec.last_mod_dos_datetime, &(z_utime.mtime), d_t_buf);
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(UT_FileModDate),
|
||
|
d_t_buf, LoadFarStringSmall(GMTime)));
|
||
|
#endif /* !NO_GMTIME */
|
||
|
}
|
||
|
#endif /* USE_EF_UT_TIME */
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(CRC32Value), G.crec.crc32));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(CompressedFileSize),
|
||
|
FmZofft(G.crec.csize, NULL, "u")));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(UncompressedFileSize),
|
||
|
FmZofft(G.crec.ucsize, NULL, "u")));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FilenameLength),
|
||
|
G.crec.filename_length));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ExtraFieldLength),
|
||
|
G.crec.extra_field_length));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileCommentLength),
|
||
|
G.crec.file_comment_length));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileDiskNum),
|
||
|
(ulg)(G.crec.disk_number_start + 1)));
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ApparentFileType),
|
||
|
(G.crec.internal_file_attributes & 1)? "text"
|
||
|
: (G.crec.internal_file_attributes & 2)? "ebcdic"
|
||
|
: "binary")); /* changed to accept EBCDIC */
|
||
|
#ifdef ATARI
|
||
|
printf(" external file attributes (hex): %.8lx\n",
|
||
|
G.crec.external_file_attributes);
|
||
|
#endif
|
||
|
xattr = (unsigned)((G.crec.external_file_attributes >> 16) & 0xFFFF);
|
||
|
if (hostnum == VMS_) {
|
||
|
char *p=attribs, *q=attribs+1;
|
||
|
int i, j, k;
|
||
|
|
||
|
for (k = 0; k < 12; ++k)
|
||
|
workspace[k] = 0;
|
||
|
if (xattr & VMS_IRUSR)
|
||
|
workspace[0] = 'R';
|
||
|
if (xattr & VMS_IWUSR) {
|
||
|
workspace[1] = 'W';
|
||
|
workspace[3] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXUSR)
|
||
|
workspace[2] = 'E';
|
||
|
if (xattr & VMS_IRGRP)
|
||
|
workspace[4] = 'R';
|
||
|
if (xattr & VMS_IWGRP) {
|
||
|
workspace[5] = 'W';
|
||
|
workspace[7] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXGRP)
|
||
|
workspace[6] = 'E';
|
||
|
if (xattr & VMS_IROTH)
|
||
|
workspace[8] = 'R';
|
||
|
if (xattr & VMS_IWOTH) {
|
||
|
workspace[9] = 'W';
|
||
|
workspace[11] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXOTH)
|
||
|
workspace[10] = 'E';
|
||
|
|
||
|
*p++ = '(';
|
||
|
for (k = j = 0; j < 3; ++j) { /* loop over groups of permissions */
|
||
|
for (i = 0; i < 4; ++i, ++k) /* loop over perms within a group */
|
||
|
if (workspace[k])
|
||
|
*p++ = workspace[k];
|
||
|
*p++ = ','; /* group separator */
|
||
|
if (j == 0)
|
||
|
while ((*p++ = *q++) != ',')
|
||
|
; /* system, owner perms are same */
|
||
|
}
|
||
|
*p-- = '\0';
|
||
|
*p = ')'; /* overwrite last comma */
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(VMSFileAttributes), xattr,
|
||
|
attribs));
|
||
|
|
||
|
} else if (hostnum == AMIGA_) {
|
||
|
switch (xattr & AMI_IFMT) {
|
||
|
case AMI_IFDIR: attribs[0] = 'd'; break;
|
||
|
case AMI_IFREG: attribs[0] = '-'; break;
|
||
|
default: attribs[0] = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & AMI_IHIDDEN)? 'h' : '-';
|
||
|
attribs[2] = (xattr & AMI_ISCRIPT)? 's' : '-';
|
||
|
attribs[3] = (xattr & AMI_IPURE)? 'p' : '-';
|
||
|
attribs[4] = (xattr & AMI_IARCHIVE)? 'a' : '-';
|
||
|
attribs[5] = (xattr & AMI_IREAD)? 'r' : '-';
|
||
|
attribs[6] = (xattr & AMI_IWRITE)? 'w' : '-';
|
||
|
attribs[7] = (xattr & AMI_IEXECUTE)? 'e' : '-';
|
||
|
attribs[8] = (xattr & AMI_IDELETE)? 'd' : '-';
|
||
|
attribs[9] = 0; /* better dlm the string */
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(AmigaFileAttributes),
|
||
|
xattr, attribs));
|
||
|
|
||
|
} else if (hostnum == THEOS_) {
|
||
|
ZCONST char Far *fpFtyp;
|
||
|
|
||
|
switch (xattr & THS_IFMT) {
|
||
|
case THS_IFLIB: fpFtyp = TheosFTypLib; break;
|
||
|
case THS_IFDIR: fpFtyp = TheosFTypDir; break;
|
||
|
case THS_IFREG: fpFtyp = TheosFTypReg; break;
|
||
|
case THS_IFREL: fpFtyp = TheosFTypRel; break;
|
||
|
case THS_IFKEY: fpFtyp = TheosFTypKey; break;
|
||
|
case THS_IFIND: fpFtyp = TheosFTypInd; break;
|
||
|
case THS_IFR16: fpFtyp = TheosFTypR16; break;
|
||
|
case THS_IFP16: fpFtyp = TheosFTypP16; break;
|
||
|
case THS_IFP32: fpFtyp = TheosFTypP32; break;
|
||
|
default: fpFtyp = TheosFTypUkn; break;
|
||
|
}
|
||
|
strcpy(attribs, LoadFarStringSmall(fpFtyp));
|
||
|
attribs[12] = (xattr & THS_INHID) ? '.' : 'H';
|
||
|
attribs[13] = (xattr & THS_IMODF) ? '.' : 'M';
|
||
|
attribs[14] = (xattr & THS_IWOTH) ? '.' : 'W';
|
||
|
attribs[15] = (xattr & THS_IROTH) ? '.' : 'R';
|
||
|
attribs[16] = (xattr & THS_IEUSR) ? '.' : 'E';
|
||
|
attribs[17] = (xattr & THS_IXUSR) ? '.' : 'X';
|
||
|
attribs[18] = (xattr & THS_IWUSR) ? '.' : 'W';
|
||
|
attribs[19] = (xattr & THS_IRUSR) ? '.' : 'R';
|
||
|
attribs[20] = 0;
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(TheosFileAttributes),
|
||
|
xattr, attribs));
|
||
|
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
} else if (hostnum == FS_VFAT_ && hostver == 20) {
|
||
|
/* process old non-official THEOS port zip archive */
|
||
|
ZCONST char Far *fpFtyp;
|
||
|
|
||
|
switch (xattr & _THS_IFMT) {
|
||
|
case _THS_IFLIB: fpFtyp = TheosFTypLib; break;
|
||
|
case _THS_IFDIR: fpFtyp = TheosFTypDir; break;
|
||
|
case _THS_IFREG: fpFtyp = TheosFTypReg; break;
|
||
|
case _THS_IODRC: fpFtyp = TheosFTypRel; break;
|
||
|
case _THS_IOKEY: fpFtyp = TheosFTypKey; break;
|
||
|
case _THS_IOIND: fpFtyp = TheosFTypInd; break;
|
||
|
case _THS_IOPRG: fpFtyp = TheosFTypR16; break;
|
||
|
case _THS_IO286: fpFtyp = TheosFTypP16; break;
|
||
|
case _THS_IO386: fpFtyp = TheosFTypP32; break;
|
||
|
default: fpFtyp = TheosFTypUkn; break;
|
||
|
}
|
||
|
strcpy(attribs, LoadFarStringSmall(fpFtyp));
|
||
|
attribs[12] = (xattr & _THS_HIDDN) ? 'H' : '.';
|
||
|
attribs[13] = (xattr & _THS_IXOTH) ? '.' : 'X';
|
||
|
attribs[14] = (xattr & _THS_IWOTH) ? '.' : 'W';
|
||
|
attribs[15] = (xattr & _THS_IROTH) ? '.' : 'R';
|
||
|
attribs[16] = (xattr & _THS_IEUSR) ? '.' : 'E';
|
||
|
attribs[17] = (xattr & _THS_IXUSR) ? '.' : 'X';
|
||
|
attribs[18] = (xattr & _THS_IWUSR) ? '.' : 'W';
|
||
|
attribs[19] = (xattr & _THS_IRUSR) ? '.' : 'R';
|
||
|
attribs[20] = 0;
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(TheosFileAttributes),
|
||
|
xattr, attribs));
|
||
|
#endif /* OLD_THEOS_EXTRA */
|
||
|
|
||
|
} else if ((hostnum != FS_FAT_) && (hostnum != FS_HPFS_) &&
|
||
|
(hostnum != FS_NTFS_) && (hostnum != FS_VFAT_) &&
|
||
|
(hostnum != ACORN_) &&
|
||
|
(hostnum != VM_CMS_) && (hostnum != MVS_))
|
||
|
{ /* assume Unix-like */
|
||
|
switch ((unsigned)(xattr & UNX_IFMT)) {
|
||
|
case (unsigned)UNX_IFDIR: attribs[0] = 'd'; break;
|
||
|
case (unsigned)UNX_IFREG: attribs[0] = '-'; break;
|
||
|
case (unsigned)UNX_IFLNK: attribs[0] = 'l'; break;
|
||
|
case (unsigned)UNX_IFBLK: attribs[0] = 'b'; break;
|
||
|
case (unsigned)UNX_IFCHR: attribs[0] = 'c'; break;
|
||
|
case (unsigned)UNX_IFIFO: attribs[0] = 'p'; break;
|
||
|
case (unsigned)UNX_IFSOCK: attribs[0] = 's'; break;
|
||
|
default: attribs[0] = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & UNX_IRUSR)? 'r' : '-';
|
||
|
attribs[4] = (xattr & UNX_IRGRP)? 'r' : '-';
|
||
|
attribs[7] = (xattr & UNX_IROTH)? 'r' : '-';
|
||
|
|
||
|
attribs[2] = (xattr & UNX_IWUSR)? 'w' : '-';
|
||
|
attribs[5] = (xattr & UNX_IWGRP)? 'w' : '-';
|
||
|
attribs[8] = (xattr & UNX_IWOTH)? 'w' : '-';
|
||
|
|
||
|
if (xattr & UNX_IXUSR)
|
||
|
attribs[3] = (xattr & UNX_ISUID)? 's' : 'x';
|
||
|
else
|
||
|
attribs[3] = (xattr & UNX_ISUID)? 'S' : '-'; /* S = undefined */
|
||
|
if (xattr & UNX_IXGRP)
|
||
|
attribs[6] = (xattr & UNX_ISGID)? 's' : 'x'; /* == UNX_ENFMT */
|
||
|
else
|
||
|
attribs[6] = (xattr & UNX_ISGID)? 'l' : '-';
|
||
|
if (xattr & UNX_IXOTH)
|
||
|
attribs[9] = (xattr & UNX_ISVTX)? 't' : 'x'; /* "sticky bit" */
|
||
|
else
|
||
|
attribs[9] = (xattr & UNX_ISVTX)? 'T' : '-'; /* T = undefined */
|
||
|
attribs[10] = 0;
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(UnixFileAttributes), xattr,
|
||
|
attribs));
|
||
|
|
||
|
} else {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(NonMSDOSFileAttributes),
|
||
|
G.crec.external_file_attributes >> 8));
|
||
|
|
||
|
} /* endif (hostnum: external attributes format) */
|
||
|
|
||
|
if ((xattr=(unsigned)(G.crec.external_file_attributes & 0xFF)) == 0)
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributes),
|
||
|
xattr));
|
||
|
else if (xattr == 1)
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributesRO),
|
||
|
xattr));
|
||
|
else
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributesAlpha),
|
||
|
xattr, (xattr&1)? "rdo " : nullStr,
|
||
|
(xattr&2)? "hid " : nullStr,
|
||
|
(xattr&4)? "sys " : nullStr,
|
||
|
(xattr&8)? "lab " : nullStr,
|
||
|
(xattr&16)? "dir " : nullStr,
|
||
|
(xattr&32)? "arc " : nullStr,
|
||
|
(xattr&64)? "lnk " : nullStr,
|
||
|
(xattr&128)? "exe" : nullStr));
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Analyze the extra field, if any, and print the file comment, if any (the
|
||
|
filename has already been printed, above). That finishes up this file
|
||
|
entry...
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
if (G.crec.extra_field_length > 0) {
|
||
|
uch *ef_ptr = G.extra_field;
|
||
|
ush ef_len = G.crec.extra_field_length;
|
||
|
ush eb_id, eb_datalen;
|
||
|
ZCONST char Far *ef_fieldname;
|
||
|
|
||
|
if (error_in_archive > PK_WARN) /* fatal: can't continue */
|
||
|
/* delayed "fatal error" return from extra field reading */
|
||
|
return error_in_archive;
|
||
|
if (G.extra_field == (uch *)NULL)
|
||
|
return PK_ERR; /* not consistent with crec length */
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ExtraFields)));
|
||
|
|
||
|
while (ef_len >= EB_HEADSIZE) {
|
||
|
eb_id = makeword(&ef_ptr[EB_ID]);
|
||
|
eb_datalen = makeword(&ef_ptr[EB_LEN]);
|
||
|
ef_ptr += EB_HEADSIZE;
|
||
|
ef_len -= EB_HEADSIZE;
|
||
|
|
||
|
if (eb_datalen > (ush)ef_len) {
|
||
|
Info(slide, 0x421, ((char *)slide,
|
||
|
LoadFarString(ExtraFieldTrunc), eb_id, eb_datalen, ef_len));
|
||
|
eb_datalen = ef_len;
|
||
|
}
|
||
|
|
||
|
switch (eb_id) {
|
||
|
case EF_PKSZ64:
|
||
|
ef_fieldname = efPKSZ64;
|
||
|
if ((G.crec.relative_offset_local_header
|
||
|
& (~(zusz_t)0xFFFFFFFFL)) != 0) {
|
||
|
/* Subtract the size of the 64bit local offset from
|
||
|
the local e.f. size, local Z64 e.f. block has no
|
||
|
offset; when only local offset present, the entire
|
||
|
local PKSZ64 block is missing. */
|
||
|
*pEndprev -= (eb_datalen == 8 ? 12 : 8);
|
||
|
}
|
||
|
break;
|
||
|
case EF_AV:
|
||
|
ef_fieldname = efAV;
|
||
|
break;
|
||
|
case EF_OS2:
|
||
|
ef_fieldname = efOS2;
|
||
|
break;
|
||
|
case EF_ACL:
|
||
|
ef_fieldname = efACL;
|
||
|
break;
|
||
|
case EF_NTSD:
|
||
|
ef_fieldname = efNTSD;
|
||
|
break;
|
||
|
case EF_PKVMS:
|
||
|
ef_fieldname = efPKVMS;
|
||
|
break;
|
||
|
case EF_IZVMS:
|
||
|
ef_fieldname = efIZVMS;
|
||
|
break;
|
||
|
case EF_PKW32:
|
||
|
ef_fieldname = efPKWin32;
|
||
|
break;
|
||
|
case EF_PKUNIX:
|
||
|
ef_fieldname = efPKUnix;
|
||
|
break;
|
||
|
case EF_IZUNIX:
|
||
|
ef_fieldname = efIZUnix;
|
||
|
if (hostnum == UNIX_ && *pEndprev > 0L)
|
||
|
*pEndprev += 4L; /* also have UID/GID in local copy */
|
||
|
break;
|
||
|
case EF_IZUNIX2:
|
||
|
ef_fieldname = efIZUnix2;
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += 4L; /* 4 byte UID/GID in local copy */
|
||
|
break;
|
||
|
case EF_IZUNIX3:
|
||
|
ef_fieldname = efIZUnix3;
|
||
|
#if 0
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += 4L; /* 4 byte UID/GID in local copy */
|
||
|
#endif
|
||
|
break;
|
||
|
case EF_TIME:
|
||
|
ef_fieldname = efTime;
|
||
|
break;
|
||
|
case EF_UNIPATH:
|
||
|
ef_fieldname = efU8Path;
|
||
|
break;
|
||
|
case EF_UNICOMNT:
|
||
|
ef_fieldname = efU8Commnt;
|
||
|
break;
|
||
|
case EF_MAC3:
|
||
|
ef_fieldname = efMac3;
|
||
|
break;
|
||
|
case EF_JLMAC:
|
||
|
ef_fieldname = efJLMac;
|
||
|
break;
|
||
|
case EF_ZIPIT:
|
||
|
ef_fieldname = efZipIt;
|
||
|
break;
|
||
|
case EF_ZIPIT2:
|
||
|
ef_fieldname = efZipIt2;
|
||
|
break;
|
||
|
case EF_VMCMS:
|
||
|
ef_fieldname = efVMCMS;
|
||
|
break;
|
||
|
case EF_MVS:
|
||
|
ef_fieldname = efMVS;
|
||
|
break;
|
||
|
case EF_ATHEOS:
|
||
|
ef_fieldname = efAtheOS;
|
||
|
break;
|
||
|
case EF_BEOS:
|
||
|
ef_fieldname = efBeOS;
|
||
|
break;
|
||
|
case EF_QDOS:
|
||
|
ef_fieldname = efQDOS;
|
||
|
break;
|
||
|
case EF_AOSVS:
|
||
|
ef_fieldname = efAOSVS;
|
||
|
break;
|
||
|
case EF_SPARK: /* from RISC OS */
|
||
|
ef_fieldname = efSpark;
|
||
|
break;
|
||
|
case EF_MD5:
|
||
|
ef_fieldname = efMD5;
|
||
|
break;
|
||
|
case EF_ASIUNIX:
|
||
|
ef_fieldname = efASiUnix;
|
||
|
break;
|
||
|
case EF_TANDEM:
|
||
|
ef_fieldname = efTandem;
|
||
|
break;
|
||
|
case EF_SMARTZIP:
|
||
|
ef_fieldname = efSmartZip;
|
||
|
break;
|
||
|
case EF_THEOS:
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
case EF_THEOSO:
|
||
|
#endif
|
||
|
ef_fieldname = efTheos;
|
||
|
break;
|
||
|
default:
|
||
|
ef_fieldname = efUnknown;
|
||
|
break;
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(ExtraFieldType),
|
||
|
eb_id, LoadFarStringSmall(ef_fieldname), eb_datalen));
|
||
|
|
||
|
/* additional, field-specific information: */
|
||
|
switch (eb_id) {
|
||
|
case EF_OS2:
|
||
|
case EF_ACL:
|
||
|
if (eb_datalen >= EB_OS2_HLEN) {
|
||
|
if (eb_id == EF_OS2)
|
||
|
ef_fieldname = OS2EAs;
|
||
|
else
|
||
|
ef_fieldname = ACLdata;
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(ef_fieldname), makelong(ef_ptr)));
|
||
|
*pEndprev = 0L; /* no clue about csize of local */
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_NTSD:
|
||
|
if (eb_datalen >= EB_NTSD_C_LEN) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(NTSDData),
|
||
|
makelong(ef_ptr)));
|
||
|
*pEndprev = 0L; /* no clue about csize of local */
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_IZVMS:
|
||
|
if (eb_datalen >= 8) {
|
||
|
char *p, q[8];
|
||
|
unsigned compr = makeword(ef_ptr+EB_IZVMS_FLGS)
|
||
|
& EB_IZVMS_BCMASK;
|
||
|
|
||
|
*q = '\0';
|
||
|
if (compr > 3)
|
||
|
compr = 3;
|
||
|
switch (makelong(ef_ptr)) {
|
||
|
case 0x42414656: /* "VFAB" */
|
||
|
p = "FAB"; break;
|
||
|
case 0x4C4C4156: /* "VALL" */
|
||
|
p = "XABALL"; break;
|
||
|
case 0x43484656: /* "VFHC" */
|
||
|
p = "XABFHC"; break;
|
||
|
case 0x54414456: /* "VDAT" */
|
||
|
p = "XABDAT"; break;
|
||
|
case 0x54445256: /* "VRDT" */
|
||
|
p = "XABRDT"; break;
|
||
|
case 0x4F525056: /* "VPRO" */
|
||
|
p = "XABPRO"; break;
|
||
|
case 0x59454B56: /* "VKEY" */
|
||
|
p = "XABKEY"; break;
|
||
|
case 0x56534D56: /* "VMSV" */
|
||
|
p = "version";
|
||
|
if (eb_datalen >= 16) {
|
||
|
/* put termitation first, for A_TO_N() */
|
||
|
q[7] = '\0';
|
||
|
q[0] = ' ';
|
||
|
q[1] = '(';
|
||
|
strncpy(q+2,
|
||
|
(char *)ef_ptr+EB_IZVMS_HLEN, 4);
|
||
|
A_TO_N(q+2);
|
||
|
q[6] = ')';
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
p = "unknown";
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(izVMSdata),
|
||
|
LoadFarStringSmall(izVMScomp[compr]),
|
||
|
makeword(ef_ptr+EB_IZVMS_UCSIZ), p, q));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_TIME:
|
||
|
if (eb_datalen > 0) {
|
||
|
char types[80];
|
||
|
int num = 0, len;
|
||
|
|
||
|
*types = '\0';
|
||
|
if (*ef_ptr & 1) {
|
||
|
strcpy(types, LoadFarString(UTmodification));
|
||
|
++num;
|
||
|
}
|
||
|
if (*ef_ptr & 2) {
|
||
|
len = strlen(types);
|
||
|
if (num)
|
||
|
types[len++] = '/';
|
||
|
strcpy(types+len, LoadFarString(UTaccess));
|
||
|
++num;
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += 4L;
|
||
|
}
|
||
|
if (*ef_ptr & 4) {
|
||
|
len = strlen(types);
|
||
|
if (num)
|
||
|
types[len++] = '/';
|
||
|
strcpy(types+len, LoadFarString(UTcreation));
|
||
|
++num;
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += 4L;
|
||
|
}
|
||
|
if (num > 0)
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(UTdata), types,
|
||
|
num == 1? nullStr : PlurSufx));
|
||
|
}
|
||
|
break;
|
||
|
case EF_UNIPATH:
|
||
|
case EF_UNICOMNT:
|
||
|
if (eb_datalen >= 5) {
|
||
|
unsigned i, n;
|
||
|
ulg name_crc = makelong(ef_ptr+1);
|
||
|
|
||
|
if (eb_datalen <= 29) {
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(U8PthCmnComplete),
|
||
|
(unsigned)ef_ptr[0], name_crc));
|
||
|
n = eb_datalen;
|
||
|
} else {
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(U8PthCmnF24),
|
||
|
(unsigned)ef_ptr[0], name_crc));
|
||
|
n = 29;
|
||
|
}
|
||
|
for (i = 5; i < n; ++i)
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(efFormat), ef_ptr[i]));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_MAC3:
|
||
|
if (eb_datalen >= EB_MAC3_HLEN) {
|
||
|
ulg eb_uc = makelong(ef_ptr);
|
||
|
unsigned mac3_flgs = makeword(ef_ptr+EB_FLGS_OFFS);
|
||
|
unsigned eb_is_uc = mac3_flgs & EB_M3_FL_UNCMPR;
|
||
|
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(Mac3data),
|
||
|
eb_uc, eb_is_uc ? "un" : nullStr));
|
||
|
if (eb_is_uc) {
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += makelong(ef_ptr);
|
||
|
} else {
|
||
|
*pEndprev = 0L; /* no clue about csize of local */
|
||
|
}
|
||
|
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(MacOSMAC3flags),
|
||
|
LoadFarStringSmall(mac3_flgs & EB_M3_FL_DATFRK ?
|
||
|
MacOS_DF : MacOS_RF),
|
||
|
(mac3_flgs & EB_M3_FL_TIME64 ? 64 : 32)));
|
||
|
zi_showMacTypeCreator(__G__ &ef_ptr[6]);
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_ZIPIT2:
|
||
|
if (eb_datalen >= 5 &&
|
||
|
makelong(ef_ptr) == 0x5449505A /* "ZPIT" */) {
|
||
|
|
||
|
if (eb_datalen >= 12) {
|
||
|
zi_showMacTypeCreator(__G__ &ef_ptr[4]);
|
||
|
}
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_ZIPIT:
|
||
|
if (eb_datalen >= 5 &&
|
||
|
makelong(ef_ptr) == 0x5449505A /* "ZPIT" */) {
|
||
|
unsigned fnlen = ef_ptr[4];
|
||
|
|
||
|
if ((unsigned)eb_datalen >= fnlen + (5 + 8)) {
|
||
|
uch nullchar = ef_ptr[fnlen+5];
|
||
|
|
||
|
ef_ptr[fnlen+5] = '\0'; /* terminate filename */
|
||
|
A_TO_N(ef_ptr+5);
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(ZipItFname), (char *)ef_ptr+5));
|
||
|
ef_ptr[fnlen+5] = nullchar;
|
||
|
zi_showMacTypeCreator(__G__ &ef_ptr[fnlen+5]);
|
||
|
}
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_JLMAC:
|
||
|
if (eb_datalen >= 40 &&
|
||
|
makelong(ef_ptr) == 0x45454C4A /* "JLEE" */)
|
||
|
{
|
||
|
zi_showMacTypeCreator(__G__ &ef_ptr[4]);
|
||
|
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(MacOSJLEEflags),
|
||
|
LoadFarStringSmall(ef_ptr[31] & 1 ?
|
||
|
MacOS_DF : MacOS_RF)));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_SMARTZIP:
|
||
|
if ((eb_datalen == EB_SMARTZIP_HLEN) &&
|
||
|
makelong(ef_ptr) == 0x70695A64 /* "dZip" */) {
|
||
|
char filenameBuf[32];
|
||
|
zi_showMacTypeCreator(__G__ &ef_ptr[4]);
|
||
|
memcpy(filenameBuf, &ef_ptr[33], 31);
|
||
|
filenameBuf[ef_ptr[32]] = '\0';
|
||
|
A_TO_N(filenameBuf);
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(ZipItFname), filenameBuf));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
#ifdef CMS_MVS
|
||
|
case EF_VMCMS:
|
||
|
case EF_MVS:
|
||
|
{
|
||
|
char type[100];
|
||
|
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(VmMvsExtraField),
|
||
|
(getVMMVSexfield(type, ef_ptr-EB_HEADSIZE,
|
||
|
(unsigned)eb_datalen) > 0)?
|
||
|
type : LoadFarStringSmall(VmMvsInvalid)));
|
||
|
}
|
||
|
break;
|
||
|
#endif /* CMS_MVS */
|
||
|
case EF_ATHEOS:
|
||
|
case EF_BEOS:
|
||
|
if (eb_datalen >= EB_BEOS_HLEN) {
|
||
|
ulg eb_uc = makelong(ef_ptr);
|
||
|
unsigned eb_is_uc =
|
||
|
*(ef_ptr+EB_FLGS_OFFS) & EB_BE_FL_UNCMPR;
|
||
|
|
||
|
if (eb_id == EF_ATHEOS)
|
||
|
ef_fieldname = AtheOSdata;
|
||
|
else
|
||
|
ef_fieldname = BeOSdata;
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(ef_fieldname),
|
||
|
eb_uc, eb_is_uc ? "un" : nullStr));
|
||
|
if (eb_is_uc) {
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += makelong(ef_ptr);
|
||
|
} else {
|
||
|
*pEndprev = 0L; /* no clue about csize of local */
|
||
|
}
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_QDOS:
|
||
|
if (eb_datalen >= 4) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(QDOSdata),
|
||
|
ef_ptr[0], ef_ptr[1], ef_ptr[2], ef_ptr[3]));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_AOSVS:
|
||
|
if (eb_datalen >= 5) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(AOSVSdata),
|
||
|
((int)(uch)ef_ptr[4])/10, ((int)(uch)ef_ptr[4])%10));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_TANDEM:
|
||
|
if (eb_datalen == 20) {
|
||
|
unsigned type, code;
|
||
|
|
||
|
type = (ef_ptr[18] & 0x60) >> 5;
|
||
|
code = makeword(ef_ptr);
|
||
|
/* Arrg..., Tandem e.f. uses BigEndian byte-order */
|
||
|
code = ((code << 8) & 0xff00) | ((code >> 8) & 0x00ff);
|
||
|
if (type == NSK_UNSTRUCTURED) {
|
||
|
if (code == NSK_EDITFILECODE)
|
||
|
type = 4;
|
||
|
else if (code == NSK_OBJECTFILECODE)
|
||
|
type = 5;
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(Tandemdata),
|
||
|
LoadFarStringSmall(TandemFileformat[type]),
|
||
|
code));
|
||
|
} else {
|
||
|
goto ef_default_display;
|
||
|
}
|
||
|
break;
|
||
|
case EF_MD5:
|
||
|
if (eb_datalen >= 19) {
|
||
|
char md5[33];
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < 16; ++i)
|
||
|
sprintf(&md5[i<<1], "%02x", ef_ptr[15-i]);
|
||
|
md5[32] = '\0';
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MD5data),
|
||
|
md5));
|
||
|
break;
|
||
|
} /* else: fall through !! */
|
||
|
default:
|
||
|
ef_default_display:
|
||
|
if (eb_datalen > 0) {
|
||
|
unsigned i, n;
|
||
|
|
||
|
if (eb_datalen <= 24) {
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(ColonIndent)));
|
||
|
n = eb_datalen;
|
||
|
} else {
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(First20)));
|
||
|
n = 20;
|
||
|
}
|
||
|
for (i = 0; i < n; ++i)
|
||
|
Info(slide, 0, ((char *)slide,
|
||
|
LoadFarString(efFormat), ef_ptr[i]));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
(*G.message)((zvoid *)&G, (uch *)".", 1L, 0);
|
||
|
|
||
|
ef_ptr += eb_datalen;
|
||
|
ef_len -= eb_datalen;
|
||
|
}
|
||
|
(*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0);
|
||
|
}
|
||
|
|
||
|
/* high bit == Unix/OS2/NT GMT times (mtime, atime); next bit == UID/GID */
|
||
|
if ((xattr = (unsigned)((G.crec.external_file_attributes & 0xC000) >> 12))
|
||
|
& 8)
|
||
|
{
|
||
|
if (hostnum == UNIX_ || hostnum == FS_HPFS_ || hostnum == FS_NTFS_)
|
||
|
{
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(lExtraFieldType),
|
||
|
"is", EF_IZUNIX, LoadFarStringSmall(efIZUnix),
|
||
|
(unsigned)(xattr&12), (xattr&4)? efIZuid : efIZnouid));
|
||
|
if (*pEndprev > 0L)
|
||
|
*pEndprev += (ulg)(xattr&12);
|
||
|
}
|
||
|
else if (hostnum == FS_FAT_ && !(xattr&4))
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(lExtraFieldType),
|
||
|
"may be", EF_IZUNIX, LoadFarStringSmall(efIZUnix), 8,
|
||
|
efIZnouid));
|
||
|
}
|
||
|
|
||
|
if (!G.crec.file_comment_length)
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(NoFileComment)));
|
||
|
else {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileCommBegin)));
|
||
|
if ((error = do_string(__G__ G.crec.file_comment_length, DISPL_8)) !=
|
||
|
PK_COOL)
|
||
|
{
|
||
|
error_in_archive = error; /* might be warning */
|
||
|
if (error > PK_WARN) /* fatal */
|
||
|
return error;
|
||
|
}
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(FileCommEnd)));
|
||
|
}
|
||
|
|
||
|
return error_in_archive;
|
||
|
|
||
|
} /* end function zi_long() */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*************************/
|
||
|
/* Function zi_short() */
|
||
|
/*************************/
|
||
|
|
||
|
static int zi_short(__G) /* return PK-type error code */
|
||
|
__GDEF
|
||
|
{
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
iztimes z_utime;
|
||
|
time_t *z_modtim;
|
||
|
#endif
|
||
|
int k, error, error_in_archive=PK_COOL;
|
||
|
unsigned hostnum, hostver, methid, methnum, xattr;
|
||
|
char *p, workspace[12], attribs[16];
|
||
|
char methbuf[5];
|
||
|
static ZCONST char dtype[5]="NXFS"; /* normal, maximum, fast, superfast */
|
||
|
static ZCONST char Far os[NUM_HOSTS+1][4] = {
|
||
|
"fat", "ami", "vms", "unx", "cms", "atr", "hpf", "mac", "zzz",
|
||
|
"cpm", "t20", "ntf", "qds", "aco", "vft", "mvs", "be ", "nsk",
|
||
|
"ths", "osx", "???", "???", "???", "???", "???", "???", "???",
|
||
|
"???", "???", "???", "ath", "???"
|
||
|
};
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
static ZCONST char Far os_TheosOld[] = "tho";
|
||
|
#endif
|
||
|
static ZCONST char Far method[NUM_METHODS+1][5] = {
|
||
|
"stor", "shrk", "re:1", "re:2", "re:3", "re:4", "i#:#", "tokn",
|
||
|
"def#", "d64#", "dcli", "bzp2", "lzma", "ters", "lz77", "wavp",
|
||
|
"ppmd", "u###"
|
||
|
};
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Print out various interesting things about the compressed file.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
methid = (unsigned)(G.crec.compression_method);
|
||
|
methnum = find_compr_idx(G.crec.compression_method);
|
||
|
hostnum = (unsigned)(G.pInfo->hostnum);
|
||
|
hostver = (unsigned)(G.pInfo->hostver);
|
||
|
/*
|
||
|
extnum = (unsigned)MIN(G.crec.version_needed_to_extract[1], NUM_HOSTS);
|
||
|
extver = (unsigned)G.crec.version_needed_to_extract[0];
|
||
|
*/
|
||
|
|
||
|
zfstrcpy(methbuf, method[methnum]);
|
||
|
if (methid == IMPLODED) {
|
||
|
methbuf[1] = (char)((G.crec.general_purpose_bit_flag & 2)? '8' : '4');
|
||
|
methbuf[3] = (char)((G.crec.general_purpose_bit_flag & 4)? '3' : '2');
|
||
|
} else if (methid == DEFLATED || methid == ENHDEFLATED) {
|
||
|
ush dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3);
|
||
|
methbuf[3] = dtype[dnum];
|
||
|
} else if (methnum >= NUM_METHODS) { /* unknown */
|
||
|
sprintf(&methbuf[1], "%03u", G.crec.compression_method);
|
||
|
}
|
||
|
|
||
|
for (k = 0; k < 15; ++k)
|
||
|
attribs[k] = ' ';
|
||
|
attribs[15] = 0;
|
||
|
|
||
|
xattr = (unsigned)((G.crec.external_file_attributes >> 16) & 0xFFFF);
|
||
|
switch (hostnum) {
|
||
|
case VMS_:
|
||
|
{ int i, j;
|
||
|
|
||
|
for (k = 0; k < 12; ++k)
|
||
|
workspace[k] = 0;
|
||
|
if (xattr & VMS_IRUSR)
|
||
|
workspace[0] = 'R';
|
||
|
if (xattr & VMS_IWUSR) {
|
||
|
workspace[1] = 'W';
|
||
|
workspace[3] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXUSR)
|
||
|
workspace[2] = 'E';
|
||
|
if (xattr & VMS_IRGRP)
|
||
|
workspace[4] = 'R';
|
||
|
if (xattr & VMS_IWGRP) {
|
||
|
workspace[5] = 'W';
|
||
|
workspace[7] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXGRP)
|
||
|
workspace[6] = 'E';
|
||
|
if (xattr & VMS_IROTH)
|
||
|
workspace[8] = 'R';
|
||
|
if (xattr & VMS_IWOTH) {
|
||
|
workspace[9] = 'W';
|
||
|
workspace[11] = 'D';
|
||
|
}
|
||
|
if (xattr & VMS_IXOTH)
|
||
|
workspace[10] = 'E';
|
||
|
|
||
|
p = attribs;
|
||
|
for (k = j = 0; j < 3; ++j) { /* groups of permissions */
|
||
|
for (i = 0; i < 4; ++i, ++k) /* perms within a group */
|
||
|
if (workspace[k])
|
||
|
*p++ = workspace[k];
|
||
|
*p++ = ','; /* group separator */
|
||
|
}
|
||
|
*--p = ' '; /* overwrite last comma */
|
||
|
if ((p - attribs) < 12)
|
||
|
sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case AMIGA_:
|
||
|
switch (xattr & AMI_IFMT) {
|
||
|
case AMI_IFDIR: attribs[0] = 'd'; break;
|
||
|
case AMI_IFREG: attribs[0] = '-'; break;
|
||
|
default: attribs[0] = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & AMI_IHIDDEN)? 'h' : '-';
|
||
|
attribs[2] = (xattr & AMI_ISCRIPT)? 's' : '-';
|
||
|
attribs[3] = (xattr & AMI_IPURE)? 'p' : '-';
|
||
|
attribs[4] = (xattr & AMI_IARCHIVE)? 'a' : '-';
|
||
|
attribs[5] = (xattr & AMI_IREAD)? 'r' : '-';
|
||
|
attribs[6] = (xattr & AMI_IWRITE)? 'w' : '-';
|
||
|
attribs[7] = (xattr & AMI_IEXECUTE)? 'e' : '-';
|
||
|
attribs[8] = (xattr & AMI_IDELETE)? 'd' : '-';
|
||
|
sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
|
||
|
break;
|
||
|
|
||
|
case THEOS_:
|
||
|
switch (xattr & THS_IFMT) {
|
||
|
case THS_IFLIB: *attribs = 'L'; break;
|
||
|
case THS_IFDIR: *attribs = 'D'; break;
|
||
|
case THS_IFCHR: *attribs = 'C'; break;
|
||
|
case THS_IFREG: *attribs = 'S'; break;
|
||
|
case THS_IFREL: *attribs = 'R'; break;
|
||
|
case THS_IFKEY: *attribs = 'K'; break;
|
||
|
case THS_IFIND: *attribs = 'I'; break;
|
||
|
case THS_IFR16: *attribs = 'P'; break;
|
||
|
case THS_IFP16: *attribs = '2'; break;
|
||
|
case THS_IFP32: *attribs = '3'; break;
|
||
|
default: *attribs = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & THS_INHID) ? '.' : 'H';
|
||
|
attribs[2] = (xattr & THS_IMODF) ? '.' : 'M';
|
||
|
attribs[3] = (xattr & THS_IWOTH) ? '.' : 'W';
|
||
|
attribs[4] = (xattr & THS_IROTH) ? '.' : 'R';
|
||
|
attribs[5] = (xattr & THS_IEUSR) ? '.' : 'E';
|
||
|
attribs[6] = (xattr & THS_IXUSR) ? '.' : 'X';
|
||
|
attribs[7] = (xattr & THS_IWUSR) ? '.' : 'W';
|
||
|
attribs[8] = (xattr & THS_IRUSR) ? '.' : 'R';
|
||
|
sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
|
||
|
break;
|
||
|
|
||
|
case FS_VFAT_:
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
if (hostver == 20) {
|
||
|
switch (xattr & _THS_IFMT) {
|
||
|
case _THS_IFLIB: *attribs = 'L'; break;
|
||
|
case _THS_IFDIR: *attribs = 'd'; break;
|
||
|
case _THS_IFCHR: *attribs = 'c'; break;
|
||
|
case _THS_IFREG: *attribs = 'S'; break;
|
||
|
case _THS_IODRC: *attribs = 'D'; break;
|
||
|
case _THS_IOKEY: *attribs = 'K'; break;
|
||
|
case _THS_IOIND: *attribs = 'I'; break;
|
||
|
case _THS_IOPRG: *attribs = 'P'; break;
|
||
|
case _THS_IO286: *attribs = '2'; break;
|
||
|
case _THS_IO386: *attribs = '3'; break;
|
||
|
default: *attribs = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & _THS_HIDDN) ? 'H' : '.';
|
||
|
attribs[2] = (xattr & _THS_IXOTH) ? '.' : 'X';
|
||
|
attribs[3] = (xattr & _THS_IWOTH) ? '.' : 'W';
|
||
|
attribs[4] = (xattr & _THS_IROTH) ? '.' : 'R';
|
||
|
attribs[5] = (xattr & _THS_IEUSR) ? '.' : 'E';
|
||
|
attribs[6] = (xattr & _THS_IXUSR) ? '.' : 'X';
|
||
|
attribs[7] = (xattr & _THS_IWUSR) ? '.' : 'W';
|
||
|
attribs[8] = (xattr & _THS_IRUSR) ? '.' : 'R';
|
||
|
sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
|
||
|
break;
|
||
|
} /* else: fall through! */
|
||
|
#endif /* OLD_THEOS_EXTRA */
|
||
|
|
||
|
case FS_FAT_:
|
||
|
case FS_HPFS_:
|
||
|
case FS_NTFS_:
|
||
|
case VM_CMS_:
|
||
|
case MVS_:
|
||
|
case ACORN_:
|
||
|
if (hostnum != FS_FAT_ ||
|
||
|
(unsigned)(xattr & 0700) !=
|
||
|
((unsigned)0400 |
|
||
|
((unsigned)!(G.crec.external_file_attributes & 1) << 7) |
|
||
|
((unsigned)(G.crec.external_file_attributes & 0x10) << 2))
|
||
|
)
|
||
|
{
|
||
|
xattr = (unsigned)(G.crec.external_file_attributes & 0xFF);
|
||
|
sprintf(attribs, ".r.-... %u.%u", hostver/10, hostver%10);
|
||
|
attribs[2] = (xattr & 0x01)? '-' : 'w';
|
||
|
attribs[5] = (xattr & 0x02)? 'h' : '-';
|
||
|
attribs[6] = (xattr & 0x04)? 's' : '-';
|
||
|
attribs[4] = (xattr & 0x20)? 'a' : '-';
|
||
|
if (xattr & 0x10) {
|
||
|
attribs[0] = 'd';
|
||
|
attribs[3] = 'x';
|
||
|
} else
|
||
|
attribs[0] = '-';
|
||
|
if (IS_VOLID(xattr))
|
||
|
attribs[0] = 'V';
|
||
|
else if ((p = MBSRCHR(G.filename, '.')) != (char *)NULL) {
|
||
|
++p;
|
||
|
if (STRNICMP(p, "com", 3) == 0 ||
|
||
|
STRNICMP(p, "exe", 3) == 0 ||
|
||
|
STRNICMP(p, "btm", 3) == 0 ||
|
||
|
STRNICMP(p, "cmd", 3) == 0 ||
|
||
|
STRNICMP(p, "bat", 3) == 0)
|
||
|
attribs[3] = 'x';
|
||
|
}
|
||
|
break;
|
||
|
} /* else: fall through! */
|
||
|
|
||
|
default: /* assume Unix-like */
|
||
|
switch ((unsigned)(xattr & UNX_IFMT)) {
|
||
|
case (unsigned)UNX_IFDIR: attribs[0] = 'd'; break;
|
||
|
case (unsigned)UNX_IFREG: attribs[0] = '-'; break;
|
||
|
case (unsigned)UNX_IFLNK: attribs[0] = 'l'; break;
|
||
|
case (unsigned)UNX_IFBLK: attribs[0] = 'b'; break;
|
||
|
case (unsigned)UNX_IFCHR: attribs[0] = 'c'; break;
|
||
|
case (unsigned)UNX_IFIFO: attribs[0] = 'p'; break;
|
||
|
case (unsigned)UNX_IFSOCK: attribs[0] = 's'; break;
|
||
|
default: attribs[0] = '?'; break;
|
||
|
}
|
||
|
attribs[1] = (xattr & UNX_IRUSR)? 'r' : '-';
|
||
|
attribs[4] = (xattr & UNX_IRGRP)? 'r' : '-';
|
||
|
attribs[7] = (xattr & UNX_IROTH)? 'r' : '-';
|
||
|
attribs[2] = (xattr & UNX_IWUSR)? 'w' : '-';
|
||
|
attribs[5] = (xattr & UNX_IWGRP)? 'w' : '-';
|
||
|
attribs[8] = (xattr & UNX_IWOTH)? 'w' : '-';
|
||
|
|
||
|
if (xattr & UNX_IXUSR)
|
||
|
attribs[3] = (xattr & UNX_ISUID)? 's' : 'x';
|
||
|
else
|
||
|
attribs[3] = (xattr & UNX_ISUID)? 'S' : '-'; /* S==undefined */
|
||
|
if (xattr & UNX_IXGRP)
|
||
|
attribs[6] = (xattr & UNX_ISGID)? 's' : 'x'; /* == UNX_ENFMT */
|
||
|
else
|
||
|
/* attribs[6] = (xattr & UNX_ISGID)? 'l' : '-'; real 4.3BSD */
|
||
|
attribs[6] = (xattr & UNX_ISGID)? 'S' : '-'; /* SunOS 4.1.x */
|
||
|
if (xattr & UNX_IXOTH)
|
||
|
attribs[9] = (xattr & UNX_ISVTX)? 't' : 'x'; /* "sticky bit" */
|
||
|
else
|
||
|
attribs[9] = (xattr & UNX_ISVTX)? 'T' : '-'; /* T==undefined */
|
||
|
|
||
|
sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
|
||
|
break;
|
||
|
|
||
|
} /* end switch (hostnum: external attributes format) */
|
||
|
|
||
|
#ifdef OLD_THEOS_EXTRA
|
||
|
Info(slide, 0, ((char *)slide, "%s %s %s ", attribs,
|
||
|
LoadFarStringSmall(((hostnum == FS_VFAT_ && hostver == 20) ?
|
||
|
os_TheosOld :
|
||
|
os[hostnum])),
|
||
|
FmZofft(G.crec.ucsize, "8", "u")));
|
||
|
#else
|
||
|
Info(slide, 0, ((char *)slide, "%s %s %s ", attribs,
|
||
|
LoadFarStringSmall(os[hostnum]),
|
||
|
FmZofft(G.crec.ucsize, "8", "u")));
|
||
|
#endif
|
||
|
Info(slide, 0, ((char *)slide, "%c",
|
||
|
(G.crec.general_purpose_bit_flag & 1)?
|
||
|
((G.crec.internal_file_attributes & 1)? 'T' : 'B') : /* encrypted */
|
||
|
((G.crec.internal_file_attributes & 1)? 't' : 'b'))); /* plaintext */
|
||
|
k = (G.crec.extra_field_length ||
|
||
|
/* a local-only "UX" (old Unix/OS2/NT GMT times "IZUNIX") e.f.? */
|
||
|
((G.crec.external_file_attributes & 0x8000) &&
|
||
|
(hostnum == UNIX_ || hostnum == FS_HPFS_ || hostnum == FS_NTFS_)));
|
||
|
Info(slide, 0, ((char *)slide, "%c", k?
|
||
|
((G.crec.general_purpose_bit_flag & 8)? 'X' : 'x') : /* extra field */
|
||
|
((G.crec.general_purpose_bit_flag & 8)? 'l' : '-'))); /* no extra field */
|
||
|
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ extended local header or not */
|
||
|
|
||
|
if (uO.lflag == 4) {
|
||
|
zusz_t csiz = G.crec.csize;
|
||
|
|
||
|
if (G.crec.general_purpose_bit_flag & 1)
|
||
|
csiz -= 12; /* if encrypted, don't count encryption header */
|
||
|
Info(slide, 0, ((char *)slide, "%3d%%",
|
||
|
(ratio(G.crec.ucsize,csiz)+5)/10));
|
||
|
} else if (uO.lflag == 5)
|
||
|
Info(slide, 0, ((char *)slide, " %s",
|
||
|
FmZofft(G.crec.csize, "8", "u")));
|
||
|
|
||
|
/* For printing of date & time, a "char d_t_buf[16]" is required.
|
||
|
* To save stack space, we reuse the "char attribs[16]" buffer whose
|
||
|
* content is no longer needed.
|
||
|
*/
|
||
|
# define d_t_buf attribs
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
z_modtim = G.extra_field &&
|
||
|
#ifdef IZ_CHECK_TZ
|
||
|
G.tz_is_valid &&
|
||
|
#endif
|
||
|
(ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1,
|
||
|
G.crec.last_mod_dos_datetime, &z_utime, NULL)
|
||
|
& EB_UT_FL_MTIME)
|
||
|
? &z_utime.mtime : NULL;
|
||
|
TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0 or Macintosh */
|
||
|
d_t_buf[0] = (char)0; /* signal "show local time" */
|
||
|
#else
|
||
|
# define z_modtim NULL
|
||
|
#endif
|
||
|
Info(slide, 0, ((char *)slide, " %s %s ", methbuf,
|
||
|
zi_time(__G__ &G.crec.last_mod_dos_datetime, z_modtim, d_t_buf)));
|
||
|
fnprint(__G);
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Skip the file comment, if any (the filename has already been printed,
|
||
|
above). That finishes up this file entry...
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
SKIP_(G.crec.file_comment_length)
|
||
|
|
||
|
return error_in_archive;
|
||
|
|
||
|
} /* end function zi_short() */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/**************************************/
|
||
|
/* Function zi_showMacTypeCreator() */
|
||
|
/**************************************/
|
||
|
|
||
|
static void zi_showMacTypeCreator(__G__ ebfield)
|
||
|
__GDEF
|
||
|
uch *ebfield;
|
||
|
{
|
||
|
/* not every Type / Creator character is printable */
|
||
|
if (isprint(native(ebfield[0])) && isprint(native(ebfield[1])) &&
|
||
|
isprint(native(ebfield[2])) && isprint(native(ebfield[3])) &&
|
||
|
isprint(native(ebfield[4])) && isprint(native(ebfield[5])) &&
|
||
|
isprint(native(ebfield[6])) && isprint(native(ebfield[7]))) {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MacOSdata),
|
||
|
native(ebfield[0]), native(ebfield[1]),
|
||
|
native(ebfield[2]), native(ebfield[3]),
|
||
|
native(ebfield[4]), native(ebfield[5]),
|
||
|
native(ebfield[6]), native(ebfield[7])));
|
||
|
} else {
|
||
|
Info(slide, 0, ((char *)slide, LoadFarString(MacOSdata1),
|
||
|
(((ulg)ebfield[0]) << 24) +
|
||
|
(((ulg)ebfield[1]) << 16) +
|
||
|
(((ulg)ebfield[2]) << 8) +
|
||
|
((ulg)ebfield[3]),
|
||
|
(((ulg)ebfield[4]) << 24) +
|
||
|
(((ulg)ebfield[5]) << 16) +
|
||
|
(((ulg)ebfield[6]) << 8) +
|
||
|
((ulg)ebfield[7])));
|
||
|
}
|
||
|
} /* end function zi_showMacTypeCreator() */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/************************/
|
||
|
/* Function zi_time() */
|
||
|
/************************/
|
||
|
|
||
|
static char *zi_time(__G__ datetimez, modtimez, d_t_str)
|
||
|
__GDEF
|
||
|
ZCONST ulg *datetimez;
|
||
|
ZCONST time_t *modtimez;
|
||
|
char *d_t_str;
|
||
|
{
|
||
|
unsigned yr, mo, dy, hh, mm, ss;
|
||
|
char monthbuf[4];
|
||
|
ZCONST char *monthstr;
|
||
|
static ZCONST char Far month[12][4] = {
|
||
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||
|
};
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
struct tm *t;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Convert the file-modification date and time info to a string of the form
|
||
|
"1991 Feb 23 17:15:00", "23-Feb-91 17:15" or "19910223.171500", depending
|
||
|
on values of lflag and T_flag. If using Unix-time extra fields, convert
|
||
|
to local time or not, depending on value of first character in d_t_str[].
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
#ifdef USE_EF_UT_TIME
|
||
|
if (modtimez != NULL) {
|
||
|
#ifndef NO_GMTIME
|
||
|
/* check for our secret message from above... */
|
||
|
t = (d_t_str[0] == (char)1)? gmtime(modtimez) : localtime(modtimez);
|
||
|
#else
|
||
|
t = localtime(modtimez);
|
||
|
#endif
|
||
|
if (uO.lflag > 9 && t == (struct tm *)NULL)
|
||
|
/* time conversion error in verbose listing format,
|
||
|
* return string with '?' instead of data
|
||
|
*/
|
||
|
return (strcpy(d_t_str, LoadFarString(lngYMDHMSTimeError)));
|
||
|
} else
|
||
|
t = (struct tm *)NULL;
|
||
|
if (t != (struct tm *)NULL) {
|
||
|
mo = (unsigned)(t->tm_mon + 1);
|
||
|
dy = (unsigned)(t->tm_mday);
|
||
|
yr = (unsigned)(t->tm_year);
|
||
|
|
||
|
hh = (unsigned)(t->tm_hour);
|
||
|
mm = (unsigned)(t->tm_min);
|
||
|
ss = (unsigned)(t->tm_sec);
|
||
|
} else
|
||
|
#endif /* USE_EF_UT_TIME */
|
||
|
{
|
||
|
yr = ((unsigned)(*datetimez >> 25) & 0x7f) + 80;
|
||
|
mo = ((unsigned)(*datetimez >> 21) & 0x0f);
|
||
|
dy = ((unsigned)(*datetimez >> 16) & 0x1f);
|
||
|
|
||
|
hh = (((unsigned)*datetimez >> 11) & 0x1f);
|
||
|
mm = (((unsigned)*datetimez >> 5) & 0x3f);
|
||
|
ss = (((unsigned)*datetimez << 1) & 0x3e);
|
||
|
}
|
||
|
|
||
|
if (mo == 0 || mo > 12) {
|
||
|
sprintf(monthbuf, LoadFarString(BogusFmt), mo);
|
||
|
monthstr = monthbuf;
|
||
|
} else
|
||
|
monthstr = LoadFarStringSmall(month[mo-1]);
|
||
|
|
||
|
if (uO.lflag > 9) /* verbose listing format */
|
||
|
sprintf(d_t_str, LoadFarString(lngYMDHMSTime), yr+1900, monthstr, dy,
|
||
|
hh, mm, ss);
|
||
|
else if (uO.T_flag)
|
||
|
sprintf(d_t_str, LoadFarString(DecimalTime), yr+1900, mo, dy,
|
||
|
hh, mm, ss);
|
||
|
else /* was: if ((uO.lflag >= 3) && (uO.lflag <= 5)) */
|
||
|
sprintf(d_t_str, LoadFarString(shtYMDHMTime), yr%100, monthstr, dy,
|
||
|
hh, mm);
|
||
|
|
||
|
return d_t_str;
|
||
|
|
||
|
} /* end function zi_time() */
|
||
|
|
||
|
#endif /* !NO_ZIPINFO */
|