📄 extract.c
字号:
error_in_archive = PK_BADERR; continue; /* can still do next file */ } G.inptr = G.inbuf + (int)inbuf_offset; G.incnt -= (int)inbuf_offset; } else { G.incnt += (int)(G.inptr-G.inbuf) - (int)inbuf_offset; G.inptr = G.inbuf + (int)inbuf_offset; } /* should be in proper position now, so check for sig */ if (readbuf(__G__ G.sig, 4) == 0) { /* bad offset */ Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "EOF", (long)request)); error_in_archive = PK_BADERR; continue; /* but can still try next one */ } if (strncmp(G.sig, local_hdr_sig, 4)) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request)); /* GRRDUMP(G.sig, 4) GRRDUMP(local_hdr_sig, 4) */ error_in_archive = PK_ERR; if ((*pfilnum == 1 && G.extra_bytes != 0L) || (G.extra_bytes == 0L && *pold_extra_bytes != 0L)) { Info(slide, 0x401, ((char *)slide, LoadFarString(AttemptRecompensate))); if (G.extra_bytes) { *pold_extra_bytes = G.extra_bytes; G.extra_bytes = 0L; } else G.extra_bytes = *pold_extra_bytes; /* third attempt */ if (((error = seek_zipf(__G__ G.pInfo->offset)) != PK_OK) || (readbuf(__G__ G.sig, 4) == 0)) { /* bad offset */ if (error != PK_BADERR) Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "EOF", (long)request)); error_in_archive = PK_BADERR; continue; /* but can still try next one */ } if (strncmp(G.sig, local_hdr_sig, 4)) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request)); error_in_archive = PK_BADERR; continue; } } else continue; /* this one hosed; try next */ } if ((error = process_local_file_hdr(__G)) != PK_COOL) { Info(slide, 0x421, ((char *)slide, LoadFarString(BadLocalHdr), *pfilnum)); error_in_archive = error; /* only PK_EOF defined */ continue; /* can still try next one */ } if ((error = do_string(__G__ G.lrec.filename_length, DS_FN_L)) != PK_COOL) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { Info(slide, 0x401, ((char *)slide, LoadFarString(FilNamMsg), FnFilter1(G.filename), "local")); continue; /* go on to next one */ } }#ifndef SFX if (G.pInfo->cfilname != (char Far *)NULL) { if (zfstrcmp(G.pInfo->cfilname, G.filename) != 0) {# ifdef SMALL_MEM char *temp_cfilnam = slide + (7 * (WSIZE>>3)); zfstrcpy((char Far *)temp_cfilnam, G.pInfo->cfilname);# define cFile_PrintBuf temp_cfilnam# else# define cFile_PrintBuf G.pInfo->cfilname# endif Info(slide, 0x401, ((char *)slide, LoadFarStringSmall2(LvsCFNamMsg), FnFilter2(cFile_PrintBuf), FnFilter1(G.filename)));# undef cFile_PrintBuf zfstrcpy(G.filename, G.pInfo->cfilname); if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } zffree(G.pInfo->cfilname); G.pInfo->cfilname = (char Far *)NULL; }#endif /* !SFX */ if (G.lrec.compression_method == STORED) { ulg csiz_decrypted = G.lrec.csize; if (G.pInfo->encrypted) csiz_decrypted -= 12; if (G.lrec.ucsize != csiz_decrypted) { Info(slide, 0x401, ((char *)slide, LoadFarStringSmall2(WrnStorUCSizCSizDiff), FnFilter1(G.filename), G.lrec.ucsize, csiz_decrypted)); G.lrec.ucsize = csiz_decrypted; if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } } if (G.extra_field != (uch *)NULL) { free(G.extra_field); G.extra_field = (uch *)NULL; } if ((error = do_string(__G__ G.lrec.extra_field_length, EXTRA_FIELD)) != 0) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { Info(slide, 0x401, ((char *)slide, LoadFarString(ExtFieldMsg), FnFilter1(G.filename), "local")); continue; /* go on */ } }#if CRYPT if (G.pInfo->encrypted && (error = decrypt(__G__ uO.pwdarg)) != PK_COOL) { if (error == PK_WARN) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(SkipIncorrectPasswd), FnFilter1(G.filename))); ++(*pnum_bad_pwd); } else { /* (error > PK_WARN) */ if (error > error_in_archive) error_in_archive = error; Info(slide, 0x401, ((char *)slide, LoadFarString(SkipCannotGetPasswd), FnFilter1(G.filename))); } continue; /* go on to next file */ }#endif /* CRYPT */ /* * just about to extract file: if extracting to disk, check if * already exists, and if so, take appropriate action according to * fflag/uflag/overwrite_all/etc. (we couldn't do this in upper * loop because we don't store the possibly renamed filename[] in * info[]) */#ifdef DLL if (!uO.tflag && !uO.cflag && !G.redirect_data)#else if (!uO.tflag && !uO.cflag)#endif { renamed = FALSE; /* user hasn't renamed output file yet */startover: query = FALSE; skip_entry = SKIP_NO; /* for files from DOS FAT, check for use of backslash instead * of slash as directory separator (bug in some zipper(s); so * far, not a problem in HPFS, NTFS or VFAT systems) */#ifndef SFX if (G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/')) { char *p=G.filename; if (*p) do { if (*p == '\\') { if (!G.reported_backslash) { Info(slide, 0x21, ((char *)slide, LoadFarString(BackslashPathSep), G.zipfn)); G.reported_backslash = TRUE; if (!error_in_archive) error_in_archive = PK_WARN; } *p = '/'; } } while (*PREINCSTR(p)); }#endif /* !SFX */ if (!renamed) { /* remove absolute path specs */ if (G.filename[0] == '/') { Info(slide, 0x401, ((char *)slide, LoadFarString(AbsolutePathWarning), FnFilter1(G.filename))); if (!error_in_archive) error_in_archive = PK_WARN; do { char *p = G.filename + 1; do { *(p-1) = *p; } while (*p++ != '\0'); } while (G.filename[0] == '/'); } } /* mapname can create dirs if not freshening or if renamed */ error = mapname(__G__ renamed); if ((errcode = error & ~MPN_MASK) != PK_OK && error_in_archive < errcode) error_in_archive = errcode; if ((errcode = error & MPN_MASK) > MPN_INF_TRUNC) { if (errcode == MPN_CREATED_DIR) {#ifdef SET_DIR_ATTRIB direntry *d_entry; error = defer_dir_attribs(__G__ &d_entry); if (d_entry == (direntry *)NULL) { /* There may be no dir_attribs info available, or * we have encountered a mem allocation error. * In case of an error, report it and set program * error state to warning level. */ if (error) { Info(slide, 0x401, ((char *)slide, LoadFarString(DirlistEntryNoMem))); if (!error_in_archive) error_in_archive = PK_WARN; } } else { d_entry->next = (*pdirlist); (*pdirlist) = d_entry; ++(*pnum_dirs); }#endif /* SET_DIR_ATTRIB */ } else if (errcode == MPN_VOL_LABEL) {#ifdef DOS_OS2_W32 Info(slide, 0x401, ((char *)slide, LoadFarString(SkipVolumeLabel), FnFilter1(G.filename), uO.volflag? "hard disk " : ""));#else Info(slide, 1, ((char *)slide, LoadFarString(SkipVolumeLabel), FnFilter1(G.filename), ""));#endif } else if (errcode > MPN_INF_SKIP && error_in_archive < PK_ERR) error_in_archive = PK_ERR; Trace((stderr, "mapname(%s) returns error code = %d\n", FnFilter1(G.filename), error)); continue; /* go on to next file */ }#ifdef QDOS QFilename(__G__ G.filename);#endif switch (check_for_newer(__G__ G.filename)) { case DOES_NOT_EXIST:#ifdef NOVELL_BUG_FAILSAFE G.dne = TRUE; /* stat() says file DOES NOT EXIST */#endif /* freshen (no new files): skip unless just renamed */ if (uO.fflag && !renamed) skip_entry = SKIP_Y_NONEXIST; break; case EXISTS_AND_OLDER:#ifdef UNIXBACKUP if (!uO.B_flag)#endif { if (IS_OVERWRT_NONE) /* never overwrite: skip file */ skip_entry = SKIP_Y_EXISTING; else if (!IS_OVERWRT_ALL) query = TRUE; } break; case EXISTS_AND_NEWER: /* (or equal) */#ifdef UNIXBACKUP if ((!uO.B_flag && IS_OVERWRT_NONE) ||#else if (IS_OVERWRT_NONE ||#endif (uO.uflag && !renamed)) { /* skip if update/freshen & orig name */ skip_entry = SKIP_Y_EXISTING; } else {#ifdef UNIXBACKUP if (!IS_OVERWRT_ALL && !uO.B_flag)#else if (!IS_OVERWRT_ALL)#endif query = TRUE; } break; } if (query) {#ifdef WINDLL switch (G.lpUserFunctions->replace != NULL ? (*G.lpUserFunctions->replace)(G.filename) : IDM_REPLACE_NONE) { case IDM_REPLACE_RENAME: _ISO_INTERN(G.filename); renamed = TRUE; goto startover; case IDM_REPLACE_ALL: G.overwrite_mode = OVERWRT_ALWAYS; /* FALL THROUGH, extract */ case IDM_REPLACE_YES: break; case IDM_REPLACE_NONE: G.overwrite_mode = OVERWRT_NEVER; /* FALL THROUGH, skip */ case IDM_REPLACE_NO: skip_entry = SKIP_Y_EXISTING; break; }#else /* !WINDLL */ extent fnlen;reprompt: Info(slide, 0x81, ((char *)slide, LoadFarString(ReplaceQuery), FnFilter1(G.filename))); if (fgets(G.answerbuf, 9, stdin) == (char *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(AssumeNone))); *G.answerbuf = 'N'; if (!error_in_archive) error_in_archive = 1; /* not extracted: warning */ } switch (*G.answerbuf) { case 'r': case 'R':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -