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

📄 process.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 4 页
字号:
                ++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 + -