⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extract.c

📁 zip压缩
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 */    /* 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 = (long)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;    LONGINT *pold_extra_bytes;#ifdef SET_DIR_ATTRIB    unsigned *pnum_dirs;    dirtime **pdirlist;#endif    int error_in_archive;{    unsigned i;    int renamed, query;    int skip_entry;    long 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",          request, inbuf_offset));        Trace((stderr,          "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n",          bufstart, 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",                  request, inbuf_offset));                Trace((stderr,                  "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n",                  bufstart, 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, (LONGINT)bufstart, SEEK_SET);            G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);#else /* !USE_STRM_INPUT */            G.cur_zipfile_bufstart =              lseek(G.zipfd, (LONGINT)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", bufstart));                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", 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), 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", 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), 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 */            }        }        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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -