in util/src/minizip/unzip.c [588:782]
local int unzlocal_GetCurrentFileInfoInternal OF(
(unzFile file,
unz_file_info * pfile_info,
unz_file_info_internal * pfile_info_internal,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
uLong extraFieldBufferSize,
char *szComment,
uLong commentBufferSize));
local int
unzlocal_GetCurrentFileInfoInternal(
unzFile file,
unz_file_info *pfile_info,
unz_file_info_internal *pfile_info_internal,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
uLong extraFieldBufferSize,
char *szComment,
uLong commentBufferSize)
{
unz_s *s;
unz_file_info file_info;
unz_file_info_internal file_info_internal;
int err = UNZ_OK;
uLong uMagic = 0x00000000;
long lSeek = 0;
if (file == NULL)
return UNZ_PARAMERROR;
s = (unz_s *) file;
if (ZSEEK(s->z_filefunc, s->filestream,
s->pos_in_central_dir + s->byte_before_the_zipfile,
ZLIB_FILEFUNC_SEEK_SET) != 0)
err = UNZ_ERRNO;
/* we check the magic */
if (err == UNZ_OK)
{
if (unzlocal_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
err = UNZ_ERRNO;
}
else if (uMagic != 0x02014b50)
{
err = UNZ_BADZIPFILE;
}
if (unzlocal_getShort(&s->z_filefunc, s->filestream, &file_info.version) !=
UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream, &file_info.version_needed) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort(&s->z_filefunc, s->filestream, &file_info.flag) !=
UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream,
&file_info.compression_method) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getLong(&s->z_filefunc, s->filestream, &file_info.dosDate) !=
UNZ_OK)
err = UNZ_ERRNO;
unzlocal_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date);
if (unzlocal_getLong(&s->z_filefunc, s->filestream, &file_info.crc) !=
UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getLong
(&s->z_filefunc, s->filestream, &file_info.compressed_size) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getLong
(&s->z_filefunc, s->filestream, &file_info.uncompressed_size) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream, &file_info.size_filename) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream, &file_info.size_file_extra) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream, &file_info.size_file_comment) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort
(&s->z_filefunc, s->filestream, &file_info.disk_num_start) != UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getShort(&s->z_filefunc, s->filestream, &file_info.internal_fa)
!= UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getLong(&s->z_filefunc, s->filestream, &file_info.external_fa)
!= UNZ_OK)
err = UNZ_ERRNO;
if (unzlocal_getLong
(&s->z_filefunc, s->filestream,
&file_info_internal.offset_curfile) != UNZ_OK)
err = UNZ_ERRNO;
lSeek += file_info.size_filename;
if ((err == UNZ_OK) && (szFileName))
{
uLong uSizeRead;
if (file_info.size_filename < fileNameBufferSize)
{
*(szFileName + file_info.size_filename) = '\0';
uSizeRead = file_info.size_filename;
}
else
uSizeRead = fileNameBufferSize;
if ((file_info.size_filename > 0) && (fileNameBufferSize > 0))
if (ZREAD(s->z_filefunc, s->filestream, szFileName, uSizeRead) !=
uSizeRead)
err = UNZ_ERRNO;
lSeek -= uSizeRead;
}
if ((err == UNZ_OK) && (extraField))
{
uLong uSizeRead;
if (file_info.size_file_extra < extraFieldBufferSize)
uSizeRead = file_info.size_file_extra;
else
uSizeRead = extraFieldBufferSize;
if (lSeek != 0)
{
if (ZSEEK
(s->z_filefunc, s->filestream, lSeek,
ZLIB_FILEFUNC_SEEK_CUR) == 0)
lSeek = 0;
else
err = UNZ_ERRNO;
}
if ((file_info.size_file_extra > 0) && (extraFieldBufferSize > 0))
if (ZREAD(s->z_filefunc, s->filestream, extraField, uSizeRead) !=
uSizeRead)
err = UNZ_ERRNO;
lSeek += file_info.size_file_extra - uSizeRead;
}
else
lSeek += file_info.size_file_extra;
if ((err == UNZ_OK) && (szComment))
{
uLong uSizeRead;
if (file_info.size_file_comment < commentBufferSize)
{
*(szComment + file_info.size_file_comment) = '\0';
uSizeRead = file_info.size_file_comment;
}
else
uSizeRead = commentBufferSize;
if (lSeek != 0)
{
if (ZSEEK
(s->z_filefunc, s->filestream, lSeek,
ZLIB_FILEFUNC_SEEK_CUR) == 0)
lSeek = 0;
else
err = UNZ_ERRNO;
}
if ((file_info.size_file_comment > 0) && (commentBufferSize > 0))
if (ZREAD(s->z_filefunc, s->filestream, szComment, uSizeRead) !=
uSizeRead)
err = UNZ_ERRNO;
lSeek += file_info.size_file_comment - uSizeRead;
}
else
lSeek += file_info.size_file_comment;
if ((err == UNZ_OK) && (pfile_info))
*pfile_info = file_info;
if ((err == UNZ_OK) && (pfile_info_internal))
*pfile_info_internal = file_info_internal;
return err;
}