📄 process.c
字号:
++NumLoseFiles; else ++NumWinFiles; if (error > error_in_archive) error_in_archive = error; Trace((stderr, "do_seekable(1) returns %d\n", error));#ifdef WINDLL if (error == IZ_CTRLC) { free_G_buffers(__G); return error; }#endif } }#endif /* ?SFX *//*--------------------------------------------------------------------------- Print summary of all zipfiles, assuming zipfile spec was a wildcard (no need for a summary if just one zipfile). ---------------------------------------------------------------------------*/#ifndef SFX if (iswild(G.wildzipfn) && uO.qflag < 3#ifdef TIMESTAMP && !(uO.T_flag && uO.qflag && !uO.zipinfo_mode)#endif ) { if ((NumMissFiles + NumLoseFiles + NumWarnFiles > 0 || NumWinFiles != 1)#ifdef TIMESTAMP && !(uO.T_flag && !uO.zipinfo_mode)#endif && !(uO.tflag && uO.qflag > 1)) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0x401); if ((NumWinFiles > 1) || (NumWinFiles == 1 && NumMissDirs + NumMissFiles + NumLoseFiles + NumWarnFiles > 0)) Info(slide, 0x401, ((char *)slide, LoadFarString(FilesProcessOK), NumWinFiles, (NumWinFiles == 1)? " was" : "s were")); if (NumWarnFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveWarning), NumWarnFiles, (NumWarnFiles == 1)? "" : "s")); if (NumLoseFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveFatalError), NumLoseFiles, (NumLoseFiles == 1)? "" : "s")); if (NumMissFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(FileHadNoZipfileDir), NumMissFiles, (NumMissFiles == 1)? "" : "s")); if (NumMissDirs == 1) Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileWasDir))); else if (NumMissDirs > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ManyZipfilesWereDir), NumMissDirs)); if (NumWinFiles + NumLoseFiles + NumWarnFiles == 0) Info(slide, 0x401, ((char *)slide, LoadFarString(NoZipfileFound))); }#endif /* !SFX */ /* free allocated memory */ free_G_buffers(__G); return error_in_archive;} /* end function process_zipfiles() *//*****************************//* Function free_G_buffers() *//*****************************/void free_G_buffers(__G) /* releases all memory allocated in global vars */ __GDEF{ inflate_free(__G); checkdir(__G__ (char *)NULL, END);#ifdef DYNALLOC_CRCTAB if (CRC_32_TAB) { free_crc_table(); CRC_32_TAB = NULL; }#endif if (G.key != (char *)NULL) { free(G.key); G.key = (char *)NULL; }#if (!defined(VMS) && !defined(SMALL_MEM)) /* VMS uses its own buffer scheme for textmode flush() */ if (G.outbuf2) { free(G.outbuf2); /* malloc'd ONLY if unshrink and -a */ G.outbuf2 = (uch *)NULL; }#endif if (G.outbuf) free(G.outbuf); if (G.inbuf) free(G.inbuf); G.inbuf = G.outbuf = (uch *)NULL;#ifdef MALLOC_WORK if (G.area.Slide) { free(G.area.Slide); G.area.Slide = (uch *)NULL; }#endif} /* end function free_G_buffers() *//**************************//* Function do_seekable() *//**************************/static int do_seekable(__G__ lastchance) /* return PK-type error code */ __GDEF int lastchance;{#ifndef SFX /* static int no_ecrec = FALSE; SKM: moved to globals.h */ int maybe_exe=FALSE; int too_weird_to_continue=FALSE;#ifdef TIMESTAMP time_t uxstamp; unsigned nmember = 0;#endif#endif int error=0, error_in_archive;/*--------------------------------------------------------------------------- Open the zipfile for reading in BINARY mode to prevent CR/LF translation, which would corrupt the bit streams. ---------------------------------------------------------------------------*/ if (SSTAT(G.zipfn, &G.statbuf) || (error = S_ISDIR(G.statbuf.st_mode)) != 0) {#ifndef SFX if (lastchance) {#if defined(UNIX) || defined(QDOS) if (G.no_ecrec) Info(slide, 1, ((char *)slide, LoadFarString(CannotFindZipfileDirMsg), uO.zipinfo_mode? LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip), G.wildzipfn, uO.zipinfo_mode? " " : "", G.wildzipfn, G.zipfn)); else Info(slide, 1, ((char *)slide, LoadFarString(CannotFindEitherZipfile), uO.zipinfo_mode? LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip), G.wildzipfn, G.wildzipfn, G.zipfn));#else /* !UNIX */ if (G.no_ecrec) Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindZipfileDirMsg), uO.zipinfo_mode? LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip), G.wildzipfn, uO.zipinfo_mode? " " : "", G.zipfn)); else Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindEitherZipfile), uO.zipinfo_mode? LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip), G.wildzipfn, G.zipfn));#endif /* ?UNIX */ }#endif /* !SFX */ return error? IZ_DIR : PK_NOZIP; } G.ziplen = G.statbuf.st_size;#ifndef SFX#if defined(UNIX) || defined(DOS_OS2_W32) if (G.statbuf.st_mode & S_IEXEC) /* no extension on Unix exes: might */ maybe_exe = TRUE; /* find unzip, not unzip.zip; etc. */#endif#endif /* !SFX */#ifdef VMS if (check_format(__G)) /* check for variable-length format */ return PK_ERR;#endif if (open_input_file(__G)) /* this should never happen, given */ return PK_NOZIP; /* the stat() test above, but... *//*--------------------------------------------------------------------------- Find and process the end-of-central-directory header. UnZip need only check last 65557 bytes of zipfile: comment may be up to 65535, end-of- central-directory record is 18 bytes, and signature itself is 4 bytes; add some to allow for appended garbage. Since ZipInfo is often used as a debugging tool, search the whole zipfile if zipinfo_mode is true. ---------------------------------------------------------------------------*/ /* initialize the CRC table pointer (once) */ if (CRC_32_TAB == NULL) { if ((CRC_32_TAB = get_crc_table()) == NULL) return PK_MEM; }#if (!defined(SFX) || defined(SFX_EXDIR)) /* check out if specified extraction root directory exists */ if (uO.exdir != (char *)NULL && G.extract_flag) { G.create_dirs = !uO.fflag; if ((error = checkdir(__G__ uO.exdir, ROOT)) > 2) return error; /* out of memory, or file in way */ }#endif /* !SFX || SFX_EXDIR */ G.cur_zipfile_bufstart = 0; G.inptr = G.inbuf;#if (!defined(WINDLL) && !defined(SFX))#ifdef TIMESTAMP if (!uO.zipinfo_mode && !uO.qflag && !uO.T_flag)#else if (!uO.zipinfo_mode && !uO.qflag)#endif#ifdef WIN32 /* Win32 console may require codepage conversion for G.zipfn */ Info(slide, 0, ((char *)slide, "Archive: %s\n", FnFilter1(G.zipfn)));#else Info(slide, 0, ((char *)slide, "Archive: %s\n", G.zipfn));#endif#endif /* !WINDLL && !SFX */ if ((#ifndef NO_ZIPINFO uO.zipinfo_mode && ((error_in_archive = find_ecrec(__G__ G.ziplen)) != 0 || (error_in_archive = zi_end_central(__G)) > PK_WARN)) || (!uO.zipinfo_mode &&#endif ((error_in_archive = find_ecrec(__G__ MIN(G.ziplen,66000L))) != 0 || (error_in_archive = uz_end_central(__G)) > PK_WARN))) { CLOSE_INFILE();#ifdef SFX ++lastchance; /* avoid picky compiler warnings */ return error_in_archive;#else if (maybe_exe) Info(slide, 0x401, ((char *)slide, LoadFarString(MaybeExe), G.zipfn)); if (lastchance) return error_in_archive; else { G.no_ecrec = TRUE; /* assume we found wrong file: e.g., */ return PK_NOZIP; /* unzip instead of unzip.zip */ }#endif /* ?SFX */ } if ((uO.zflag > 0) && !uO.zipinfo_mode) { /* unzip: zflag = comment ONLY */ CLOSE_INFILE(); return error_in_archive; }/*--------------------------------------------------------------------------- Test the end-of-central-directory info for incompatibilities (multi-disk archives) or inconsistencies (missing or extra bytes in zipfile). ---------------------------------------------------------------------------*/#ifdef NO_MULTIPART error = !uO.zipinfo_mode && (G.ecrec.number_this_disk == 1) && (G.ecrec.num_disk_start_cdir == 1);#else error = !uO.zipinfo_mode && (G.ecrec.number_this_disk != 0);#endif#ifndef SFX if (uO.zipinfo_mode && G.ecrec.number_this_disk != G.ecrec.num_disk_start_cdir) { if (G.ecrec.number_this_disk > G.ecrec.num_disk_start_cdir) { Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirNotInZipMsg), G.zipfn, G.ecrec.number_this_disk, G.ecrec.num_disk_start_cdir)); error_in_archive = PK_FIND; too_weird_to_continue = TRUE; } else { Info(slide, 0x401, ((char *)slide, LoadFarString(EndCentDirBogus), G.zipfn, G.ecrec.number_this_disk, G.ecrec.num_disk_start_cdir)); error_in_archive = PK_WARN; }#ifdef NO_MULTIPART /* concatenation of multiple parts works in some cases */ } else if (!uO.zipinfo_mode && !error && G.ecrec.number_this_disk != 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(NoMultiDiskArcSupport), G.zipfn)); error_in_archive = PK_FIND; too_weird_to_continue = TRUE;#endif } if (!too_weird_to_continue) { /* (relatively) normal zipfile: go for it */ if (error) { Info(slide, 0x401, ((char *)slide, LoadFarString(MaybePakBug), G.zipfn)); error_in_archive = PK_WARN; }#endif /* !SFX */ if ((G.extra_bytes = G.real_ecrec_offset-G.expect_ecrec_offset) < (LONGINT)0) { Info(slide, 0x401, ((char *)slide, LoadFarString(MissingBytes), G.zipfn, (long)(-G.extra_bytes))); error_in_archive = PK_ERR; } else if (G.extra_bytes > 0) { if ((G.ecrec.offset_start_central_directory == 0) && (G.ecrec.size_central_directory != 0)) /* zip 1.5 -go bug */ { Info(slide, 0x401, ((char *)slide, LoadFarString(NullCentDirOffset), G.zipfn)); G.ecrec.offset_start_central_directory = G.extra_bytes; G.extra_bytes = 0; error_in_archive = PK_ERR; }#ifndef SFX else { Info(slide, 0x401, ((char *)slide, LoadFarString(ExtraBytesAtStart), G.zipfn, (long)G.extra_bytes, (G.extra_bytes == 1)? "":"s")); error_in_archive = PK_WARN; }#endif /* !SFX */ } /*----------------------------------------------------------------------- Check for empty zipfile and exit now if so. -----------------------------------------------------------------------*/ if (G.expect_ecrec_offset==0L && G.ecrec.size_central_directory==0) { if (uO.zipinfo_mode) Info(slide, 0, ((char *)slide, "%sEmpty zipfile.\n", uO.lflag>9? "\n " : "")); else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -