📄 extract.c
字号:
if (reached_end) for (i = 0; i < G.xfilespecs; ++i) if (!xn_matched[i]) Info(slide, 0x401, ((char *)slide, LoadFarString(ExclFilenameNotMatched), G.pxnames[i])); free((zvoid *)xn_matched); }/*--------------------------------------------------------------------------- Now, all locally allocated memory has been released. When the central directory processing has been interrupted prematurely, it is safe to return immediately. All completeness checks and summary messages are skipped in this case. ---------------------------------------------------------------------------*/ if (!reached_end) return error_in_archive;/*--------------------------------------------------------------------------- Double-check that we're back at the end-of-central-directory record, and print quick summary of results, if we were just testing the archive. We send the summary to stdout so that people doing the testing in the back- ground and redirecting to a file can just do a "tail" on the output file. ---------------------------------------------------------------------------*/#ifndef SFX if (no_endsig_found) { /* just to make sure */ Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg))); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); if (!error_in_archive) /* don't overwrite stronger error */ error_in_archive = PK_WARN; }#endif /* !SFX */ if (uO.tflag) { ulg num = filnum - num_bad_pwd; if (uO.qflag < 2) { /* GRR 930710: was (uO.qflag == 1) */ if (error_in_archive) Info(slide, 0, ((char *)slide, LoadFarString(ErrorInArchive), (error_in_archive == PK_WARN)? "warning-" : "", G.zipfn)); else if (num == 0L) Info(slide, 0, ((char *)slide, LoadFarString(ZeroFilesTested), G.zipfn)); else if (G.process_all_files && (num_skipped+num_bad_pwd == 0L)) Info(slide, 0, ((char *)slide, LoadFarString(NoErrInCompData), G.zipfn)); else Info(slide, 0, ((char *)slide, LoadFarString(NoErrInTestedFiles) , G.zipfn, num, (num==1L)? "":"s")); if (num_skipped > 0L) Info(slide, 0, ((char *)slide, LoadFarString(FilesSkipped), num_skipped, (num_skipped==1L)? "":"s"));#if CRYPT if (num_bad_pwd > 0L) Info(slide, 0, ((char *)slide, LoadFarString(FilesSkipBadPasswd) , num_bad_pwd, (num_bad_pwd==1L)? "":"s"));#endif /* CRYPT */ } else if ((uO.qflag == 0) && !error_in_archive && (num == 0)) Info(slide, 0, ((char *)slide, LoadFarString(ZeroFilesTested), G.zipfn)); } /* give warning if files not tested or extracted (first condition can still * happen if zipfile is empty and no files specified on command line) */ if ((filnum == 0) && error_in_archive <= PK_WARN) { if (num_skipped > 0L) error_in_archive = IZ_UNSUP; /* unsupport. compression/encryption */ else error_in_archive = PK_FIND; /* no files found at all */ }#if CRYPT else if ((filnum == num_bad_pwd) && error_in_archive <= PK_WARN) error_in_archive = IZ_BADPWD; /* bad passwd => all files skipped */#endif else if ((num_skipped > 0L) && error_in_archive <= PK_WARN) error_in_archive = IZ_UNSUP; /* was PK_WARN; Jean-loup complained */#if CRYPT else if ((num_bad_pwd > 0L) && !error_in_archive) error_in_archive = PK_WARN;#endif return error_in_archive;} /* end function extract_or_test_files() *//***************************//* Function store_info() *//***************************/static int store_info(__G) /* return 0 if skipping, 1 if OK */ __GDEF{#ifdef SFX# ifdef USE_DEFLATE64# define UNKN_COMPR \ (G.crec.compression_method!=STORED && G.crec.compression_method<DEFLATED \ && G.crec.compression_method>ENHDEFLATED)# else# define UNKN_COMPR \ (G.crec.compression_method!=STORED && G.crec.compression_method!=DEFLATED)# endif#else# ifdef COPYRIGHT_CLEAN /* no reduced files */# define UNKN_RED (G.crec.compression_method >= REDUCED1 && \ G.crec.compression_method <= REDUCED4)# else# define UNKN_RED FALSE /* reducing not unknown */# endif# ifdef LZW_CLEAN /* no shrunk files */# define UNKN_SHR (G.crec.compression_method == SHRUNK)# else# define UNKN_SHR FALSE /* unshrinking not unknown */# endif# ifdef USE_DEFLATE64# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ G.crec.compression_method==TOKENIZED || \ G.crec.compression_method>ENHDEFLATED)# else# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ G.crec.compression_method==TOKENIZED || \ G.crec.compression_method>DEFLATED)# endif#endif/*--------------------------------------------------------------------------- Check central directory info for version/compatibility requirements. ---------------------------------------------------------------------------*/ G.pInfo->encrypted = G.crec.general_purpose_bit_flag & 1; /* bit field */ G.pInfo->ExtLocHdr = (G.crec.general_purpose_bit_flag & 8) == 8; /* bit */ G.pInfo->textfile = G.crec.internal_file_attributes & 1; /* bit field */ G.pInfo->crc = G.crec.crc32; G.pInfo->compr_size = G.crec.csize; G.pInfo->uncompr_size = G.crec.ucsize; switch (uO.aflag) { case 0: G.pInfo->textmode = FALSE; /* bit field */ break; case 1: G.pInfo->textmode = G.pInfo->textfile; /* auto-convert mode */ break; default: /* case 2: */ G.pInfo->textmode = TRUE; break; } if (G.crec.version_needed_to_extract[1] == VMS_) { if (G.crec.version_needed_to_extract[0] > VMS_UNZIP_VERSION) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), FnFilter1(G.filename), "VMS", G.crec.version_needed_to_extract[0] / 10, G.crec.version_needed_to_extract[0] % 10, VMS_UNZIP_VERSION / 10, VMS_UNZIP_VERSION % 10)); return 0; }#ifndef VMS /* won't be able to use extra field, but still have data */ else if (!uO.tflag && !IS_OVERWRT_ALL) { /* if -o, extract anyway */ Info(slide, 0x481, ((char *)slide, LoadFarString(VMSFormatQuery), FnFilter1(G.filename))); fgets(G.answerbuf, 9, stdin); if ((*G.answerbuf != 'y') && (*G.answerbuf != 'Y')) return 0; }#endif /* !VMS */ /* usual file type: don't need VMS to extract */ } else if (G.crec.version_needed_to_extract[0] > UNZIP_VERSION) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), FnFilter1(G.filename), "PK", G.crec.version_needed_to_extract[0] / 10, G.crec.version_needed_to_extract[0] % 10, UNZIP_VERSION / 10, UNZIP_VERSION % 10)); return 0; } if UNKN_COMPR { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) {#ifndef SFX if (G.crec.compression_method < NUM_METHODS) Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgName), FnFilter1(G.filename), LoadFarStringSmall(ComprNames[G.crec.compression_method]))); else#endif Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgNum), FnFilter1(G.filename), G.crec.compression_method)); } return 0; }#if (!CRYPT) if (G.pInfo->encrypted) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(SkipEncrypted), FnFilter1(G.filename))); return 0; }#endif /* !CRYPT */#ifndef SFX /* store a copy of the central header filename for later comparison */ if ((G.pInfo->cfilname = zfmalloc(strlen(G.filename) + 1)) == NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(WarnNoMemCFName), FnFilter1(G.filename))); } else zfstrcpy(G.pInfo->cfilname, G.filename);#endif /* !SFX */ /* map whatever file attributes we have into the local format */ mapattr(__G); /* GRR: worry about return value later */ G.pInfo->diskstart = G.crec.disk_number_start; G.pInfo->offset = (Z_OFF_T)G.crec.relative_offset_local_header; return 1;} /* end function store_info() *//******************************************//* Function extract_or_test_entrylist() *//******************************************/static int extract_or_test_entrylist(__G__ numchunk, pfilnum, pnum_bad_pwd, pold_extra_bytes,#ifdef SET_DIR_ATTRIB pnum_dirs, pdirlist,#endif error_in_archive) /* return PK-type error code */ __GDEF unsigned numchunk; ulg *pfilnum; ulg *pnum_bad_pwd; Z_OFF_T *pold_extra_bytes;#ifdef SET_DIR_ATTRIB unsigned *pnum_dirs; direntry **pdirlist;#endif int error_in_archive;{ unsigned i; int renamed, query; int skip_entry; Z_OFF_T bufstart, inbuf_offset, request; int error, errcode;/* possible values for local skip_entry flag: */#define SKIP_NO 0 /* do not skip this entry */#define SKIP_Y_EXISTING 1 /* skip this entry, do not overwrite file */#define SKIP_Y_NONEXIST 2 /* skip this entry, do not create new file */ /*----------------------------------------------------------------------- Second loop: process files in current block, extracting or testing each one. -----------------------------------------------------------------------*/ for (i = 0; i < numchunk; ++i) { (*pfilnum)++; /* *pfilnum = i + blknum*DIR_BLKSIZ + 1; */ G.pInfo = &G.info[i];#ifdef NOVELL_BUG_FAILSAFE G.dne = FALSE; /* assume file exists until stat() says otherwise */#endif /* if the target position is not within the current input buffer * (either haven't yet read far enough, or (maybe) skipping back- * ward), skip to the target position and reset readbuf(). */ /* seek_zipf(__G__ pInfo->offset); */ request = G.pInfo->offset + G.extra_bytes; inbuf_offset = request % INBUFSIZ; bufstart = request - inbuf_offset; Trace((stderr, "\ndebug: request = %ld, inbuf_offset = %ld\n", (long)request, (long)inbuf_offset)); Trace((stderr, "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", (long)bufstart, (long)G.cur_zipfile_bufstart)); if (request < 0) { Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg), G.zipfn, LoadFarString(ReportMsg))); error_in_archive = PK_ERR; if (*pfilnum == 1 && G.extra_bytes != 0L) { Info(slide, 0x401, ((char *)slide, LoadFarString(AttemptRecompensate))); *pold_extra_bytes = G.extra_bytes; G.extra_bytes = 0L; request = G.pInfo->offset; /* could also check if != 0 */ inbuf_offset = request % INBUFSIZ; bufstart = request - inbuf_offset; Trace((stderr, "debug: request = %ld, inbuf_offset = %ld\n", (long)request, (long)inbuf_offset)); Trace((stderr, "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", (long)bufstart, (long)G.cur_zipfile_bufstart)); /* try again */ if (request < 0) { Trace((stderr, "debug: recompensated request still < 0\n")); Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg), G.zipfn, LoadFarString(ReportMsg))); error_in_archive = PK_BADERR; continue; } } else { error_in_archive = PK_BADERR; continue; /* this one hosed; try next */ } } if (bufstart != G.cur_zipfile_bufstart) { Trace((stderr, "debug: bufstart != cur_zipfile_bufstart\n"));#ifdef USE_STRM_INPUT fseek((FILE *)G.zipfd, bufstart, SEEK_SET); G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);#else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = lseek(G.zipfd, bufstart, SEEK_SET);#endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "lseek", (long)bufstart));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -