/* =========================================================================== * Function process_zipfiles() * return PK-type error code */ void UnzOpr::process_zipfiles(void) { int NumWinFiles, NumLoseFiles, NumWarnFiles; int NumMissDirs, NumMissFiles; unsigned int error; // , error_in_archive = 0; if (Verbose < 0) Notify(ITRACE, _T("In process_zipfiles")); fhold = finbuf + INBUFSIZ; /* to check for boundary-spanning sigs */ if (Verbose < 0) Notify(ITRACE, _T("two")); /* --------------------------------------------------------------------------- * Match (possible) wildcard zipfile specification with existing files and * attempt to process each. If no hits, try again after appending ".zip" * suffix. If still no luck, give up. *--------------------------------------------------------------------------- */ NumWinFiles = NumLoseFiles = NumWarnFiles = 0; NumMissDirs = NumMissFiles = 0; if (Verbose < 0) Notify(ITRACE, _T("four in process.c")); // - ready to dowild"); if (DZ_ERR(error = do_seekable(0)) == PK_WARN) ++NumWarnFiles; else if (error == IZ_DIR) ++NumMissDirs; else if (DZ_ERR(error) == PK_NOZIP) ++NumMissFiles; else if (error) ++NumLoseFiles; else ++NumWinFiles; if (Verbose < 0) { Notify(ITRACE, _T( "after do_seekable, warn=%d missdir=%d missfi=%d losefi=%d winfi=%d") , NumWarnFiles, NumMissDirs, NumMissFiles, NumLoseFiles, NumWinFiles); Notify(ITRACE, _T("do_seekable(0) returns %d"), error); } if (Verbose < 0) Notify(ITRACE, _T("six")); /* --------------------------------------------------------------------------- * Print summary of all zipfiles, assuming zipfile spec was a wildcard (no * need for a summary if just one zipfile). *--------------------------------------------------------------------------- */ if ((NumWinFiles > 1) || (NumWinFiles == 1 && NumMissDirs + NumMissFiles + NumLoseFiles + NumWarnFiles > 0)) Notify(0, _T("files processed OK")); if (NumWarnFiles > 0) Notify(0, _T("warnings were given")); if (NumLoseFiles > 0 || NumMissFiles > 0) Notify(0, _T("file(s) not found")); if (NumMissDirs == 1) Notify(0, _T("zip file was dir")); else if (NumMissDirs > 0) Notify(0, _T("many zip file were dirs")); if (NumWinFiles + NumLoseFiles + NumWarnFiles == 0) Notify(0, _T("no files found")); if (Verbose < 0) Notify(ITRACE, _T("seven")); /* free allocated memory */ inflate_free(); if (foutbuf2) delete[]foutbuf2; return; }
/* =========================================================================== * Function process_zipfiles() * return PK-type error code */ void process_zipfiles( struct Globals *pG ) { char *lastzipfn = (char *)NULL; int NumWinFiles, NumLoseFiles, NumWarnFiles; int NumMissDirs, NumMissFiles; int error; //, error_in_archive = 0; diag( pG, "In process_zipfiles" ); /*--------------------------------------------------------------------------- * Start by allocating buffers and (re)constructing the various PK signature * strings. *---------------------------------------------------------------------------*/ pG->inbuf = (uch *)MALLOC( INBUFSIZ + 4 ); /* 4 extra for hold[] (below) */ if ( pG->inbuf == NULL ) { UnzErr( pG, UEN_MEM03 ); return; } /* Normally realbuf and outbuf will be the same. However, if the data * are redirected to a large memory buffer, realbuf will point to the * new location while outbuf will remain pointing to the malloc'd * memory buffer. (The extra "1" is for string termination.) */ pG->realbuf = pG->outbuf = (uch *)MALLOC( OUTBUFSIZ + 1 ); if ( pG->outbuf == NULL ) { FREE( pG->inbuf ); UnzErr( pG, UEN_MEM01 ); return; } pG->hold = pG->inbuf + INBUFSIZ; /* to check for boundary-spanning sigs */ diag( pG, "two" ); pG->local_hdr_sig[0] /* = extd_local_sig[0] */ = 0x50; /* ASCII 'P', */ pG->central_hdr_sig[0] = pG->end_central_sig[0] = 0x50; /* not EBCDIC */ pG->local_hdr_sig[1] /* = extd_local_sig[1] */ = 0x4B; /* ASCII 'K', */ pG->central_hdr_sig[1] = pG->end_central_sig[1] = 0x4B; /* not EBCDIC */ /* GRR FIX: no need for these to be in global struct; OK to "overwrite" */ lstrcpy( pG->local_hdr_sig + 2, LOCAL_HDR_SIG ); lstrcpy( pG->central_hdr_sig + 2, CENTRAL_HDR_SIG ); lstrcpy( pG->end_central_sig + 2, END_CENTRAL_SIG ); /*--------------------------------------------------------------------------- * Match (possible) wildcard zipfile specification with existing files and * attempt to process each. If no hits, try again after appending ".zip" * suffix. If still no luck, give up. *---------------------------------------------------------------------------*/ NumWinFiles = NumLoseFiles = NumWarnFiles = 0; NumMissDirs = NumMissFiles = 0; diag( pG, "four in process.c - ready to dowild" ); // dowild() gives us the real name of zipfile, in case wildcard was used. while ( (pG->zipfn = do_wild( pG, pG->wildzipfn )) != NULL ) { Trace( (pG, "back from do_wild( %s ) returned %s\n", pG->wildzipfn, pG->zipfn) ); lastzipfn = pG->zipfn; if ( (error = do_seekable( pG, 0 )) == PK_WARN ) ++NumWarnFiles; else if ( error == IZ_DIR ) ++NumMissDirs; else if ( error == PK_NOZIP ) ++NumMissFiles; else if ( error ) ++NumLoseFiles; else ++NumWinFiles; Trace( (pG, "after do_seekable, warn=%d missdir=%d missfi=%d losefi=%d winfi=%d", NumWarnFiles, NumMissDirs, NumMissFiles, NumLoseFiles, NumWinFiles) ); // if ( error != IZ_DIR && error > error_in_archive ) error_in_archive = error; Trace( (pG, "do_seekable(0) returns %d (see unzpriv.h, PK_*)\n", error) ); } /* end while-loop (wildcard zipfiles) */ diag( pG, "five in process.c" ); if ( (NumWinFiles + NumWarnFiles + NumLoseFiles) == 0 && (NumMissDirs + NumMissFiles) == 1 && lastzipfn != (char *)NULL ) { NumMissDirs = NumMissFiles = 0; // if ( error_in_archive == PK_NOZIP ) error_in_archive = PK_COOL; if ( iswild( pG->wildzipfn ) ) printf( "Error: No wildcard match on zipfile: %s", pG->wildzipfn ); else { char *p = lastzipfn + lstrlen( lastzipfn ); pG->zipfn = lastzipfn; lstrcpy( p, ZSUFX ); error = do_seekable( pG, 1 ); if ( error == PK_WARN ) /* GRR: make this a switch/case stmt ... */ ++NumWarnFiles; else if ( error == IZ_DIR ) ++NumMissDirs; else if ( error == PK_NOZIP ) /* increment again => bug: "1 file had no zipfile directory." */ /* ++NumMissFiles */ ; else if ( error ) ++NumLoseFiles; else ++NumWinFiles; // if ( error > error_in_archive ) error_in_archive = error; Trace( (pG, "do_seekable(1) returns %d\n", error) ); } } diag( pG, "six" ); /*--------------------------------------------------------------------------- * Print summary of all zipfiles, assuming zipfile spec was a wildcard (no * need for a summary if just one zipfile). *---------------------------------------------------------------------------*/ if ( (NumWinFiles > 1) || (NumWinFiles == 1 && NumMissDirs + NumMissFiles + NumLoseFiles + NumWarnFiles > 0) ) printf( "files processed OK" ); if ( NumWarnFiles > 0 ) printf( "warnings were given" ); if ( NumLoseFiles > 0 || NumMissFiles > 0 ) printf( "file(s) not found" ); if ( NumMissDirs == 1 ) printf( "zip file was dir" ); else if ( NumMissDirs > 0 ) printf( "many zip file were dirs" ); if ( NumWinFiles + NumLoseFiles + NumWarnFiles == 0 ) printf( "no files found" ); diag( pG, "seven" ); /* free allocated memory */ inflate_free( pG ); checkdir( pG, (char *)NULL, END ); #ifdef DYNALLOC_CRCTAB if ( pG->extract_flag && CRC_32_TAB ) FREE( CRC_32_TAB ); #endif /* DYNALLOC_CRCTAB */ if ( pG->outbuf2 ) FREE( pG->outbuf2 ); /* malloc'd ONLY if unshrink and -a */ FREE( pG->outbuf ); FREE( pG->inbuf ); return; } /* end function process_zipfiles() */