Ejemplo n.º 1
0
/* ===========================================================================
 *                     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;
}
Ejemplo n.º 2
0
/* ===========================================================================
 *									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() */