Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/process.c view on Meta::CPAN
error_in_archive = PK_WARN;
}
#endif /* !SFX */
if ((G.extra_bytes = G.real_ecrec_offset-G.expect_ecrec_offset) <
(zoff_t)0)
{
Info(slide, 0x401, ((char *)slide, LoadFarString(MissingBytes),
G.zipfn, FmZofft((-G.extra_bytes), NULL, NULL)));
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,
FmZofft(G.extra_bytes, NULL, NULL),
(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
Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileEmpty),
G.zipfn));
CLOSE_INFILE();
return (error_in_archive > PK_WARN)? error_in_archive : PK_WARN;
}
/*-----------------------------------------------------------------------
Compensate for missing or extra bytes, and seek to where the start
of central directory should be. If header not found, uncompensate
and try again (necessary for at least some Atari archives created
with STZip, as well as archives created by J.H. Holm's ZIPSPLIT 1.1).
-----------------------------------------------------------------------*/
error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
if (error == PK_BADERR) {
CLOSE_INFILE();
return PK_BADERR;
}
#ifdef OLD_SEEK_TEST
if (error != PK_OK || readbuf(__G__ G.sig, 4) == 0) {
CLOSE_INFILE();
return PK_ERR; /* file may be locked, or possibly disk error(?) */
}
if (memcmp(G.sig, central_hdr_sig, 4))
#else
if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) ||
memcmp(G.sig, central_hdr_sig, 4))
#endif
{
#ifndef SFX
zoff_t tmp = G.extra_bytes;
#endif
G.extra_bytes = 0;
error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) ||
memcmp(G.sig, central_hdr_sig, 4))
{
if (error != PK_BADERR)
Info(slide, 0x401, ((char *)slide,
LoadFarString(CentDirStartNotFound), G.zipfn,
LoadFarStringSmall(ReportMsg)));
CLOSE_INFILE();
return (error != PK_OK ? error : PK_BADERR);
}
#ifndef SFX
Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirTooLong),
G.zipfn, FmZofft((-tmp), NULL, NULL)));
#endif
error_in_archive = PK_ERR;
}
/*-----------------------------------------------------------------------
Seek to the start of the central directory one last time, since we
have just read the first entry's signature bytes; then list, extract
or test member files as instructed, and close the zipfile.
-----------------------------------------------------------------------*/
error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
if (error != PK_OK) {
CLOSE_INFILE();
return error;
}
Trace((stderr, "about to extract/list files (error = %d)\n",
error_in_archive));
#ifdef DLL
/* G.fValidate is used only to look at an archive to see if
it appears to be a valid archive. There is no interest
in what the archive contains, nor in validating that the
entries in the archive are in good condition. This is
currently used only in the Windows DLLs for purposes of
checking archives within an archive to determine whether
or not to display the inner archives.
*/
if (!G.fValidate)
#endif
{
#ifndef NO_ZIPINFO
if (uO.zipinfo_mode)
error = zipinfo(__G); /* ZIPINFO 'EM */
( run in 1.237 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )