Beispiel #1
0
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)
{
	char buf[46];
	unz_s* s;
	unz_file_info file_info;
	unz_file_info_internal file_info_internal = {0};
	int err=UNZ_OK;
	uLong uMagic;
	long lSeek=0;

	if (file==NULL)
		return UNZ_PARAMERROR;
	s=(unz_s*)file;
	if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0)
		err=UNZ_ERRNO;

	// UTTAR: Reducing the number of calls to fread drastically to improve loading performance
	if(fread(buf, 46, 1, s->file) != 1)
	{
		err = UNZ_ERRNO;
		memset(&file_info, 0, sizeof(file_info));
	}
	else
	{
		uMagic								= LITTLE_INT(*((int*)&buf[0]));
		file_info.version					= LITTLE_SHORT(*((short*)&buf[4]));
		file_info.version_needed			= LITTLE_SHORT(*((short*)&buf[6]));
		file_info.flag						= LITTLE_SHORT(*((short*)&buf[8]));
		file_info.compression_method		= LITTLE_SHORT(*((short*)&buf[10]));
		file_info.dosDate					= LITTLE_INT(*((int*)&buf[12]));
		file_info.crc						= LITTLE_INT(*((int*)&buf[16]));
		file_info.compressed_size			= LITTLE_INT(*((int*)&buf[20]));
		file_info.uncompressed_size			= LITTLE_INT(*((int*)&buf[24]));
		file_info.size_filename				= LITTLE_SHORT(*((short*)&buf[28]));
		file_info.size_file_extra			= LITTLE_SHORT(*((short*)&buf[30]));
		file_info.size_file_comment			= LITTLE_SHORT(*((short*)&buf[32]));
		file_info.disk_num_start			= LITTLE_SHORT(*((short*)&buf[34]));
		file_info.internal_fa				= LITTLE_SHORT(*((short*)&buf[36]));
		file_info.external_fa				= LITTLE_INT(*((int*)&buf[38]));
		file_info_internal.offset_curfile	= LITTLE_INT(*((int*)&buf[42]));

		if (uMagic!=0x02014b50)
			err=UNZ_BADZIPFILE;
		unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
		lSeek+=file_info.size_filename;
	}
	if ((err==UNZ_OK) && (szFileName!=NULL))
	{
		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 (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1)
				err=UNZ_ERRNO;
		lSeek -= uSizeRead;
	}

	
	if ((err==UNZ_OK) && (extraField!=NULL))
	{
		uLong uSizeRead ;
		if (file_info.size_file_extra<extraFieldBufferSize)
			uSizeRead = file_info.size_file_extra;
		else
			uSizeRead = extraFieldBufferSize;

		if (lSeek!=0)
		{
			if (fseek(s->file,lSeek,SEEK_CUR)==0)
				lSeek=0;
			else
				err=UNZ_ERRNO;
		}

		if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
			if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1)
				err=UNZ_ERRNO;
		lSeek += file_info.size_file_extra - uSizeRead;
	}
	else
		lSeek+=file_info.size_file_extra; 

	
	if ((err==UNZ_OK) && (szComment!=NULL))
	{
		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 (fseek(s->file,lSeek,SEEK_CUR)==0)
				lSeek=0;
			else
				err=UNZ_ERRNO;
		}
		
		if ((file_info.size_file_comment>0) && (commentBufferSize>0))
			if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1)
				err=UNZ_ERRNO;
		lSeek+=file_info.size_file_comment - uSizeRead;
	}
	else
		lSeek+=file_info.size_file_comment;

	if ((err==UNZ_OK) && (pfile_info!=NULL))
		*pfile_info=file_info;

	if(err == UNZ_ERRNO)
		return err;
	if (pfile_info_internal!=NULL)
		*pfile_info_internal=file_info_internal;

	return err;
}
Beispiel #2
0
static 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;
	long lSeek=0;

	if (file==NULL)
		return UNZ_PARAMERROR;
	s=(unz_s*)file;
	s->_stream->seek(s->pos_in_central_dir+s->byte_before_the_zipfile, SEEK_SET);
	if (s->_stream->err())
		err=UNZ_ERRNO;


	/* we check the magic */
	if (err==UNZ_OK) {
		if (unzlocal_getLong(s->_stream,&uMagic) != UNZ_OK)
			err=UNZ_ERRNO;
		else if (uMagic!=0x02014b50)
			err=UNZ_BADZIPFILE;
	}

	if (unzlocal_getShort(s->_stream,&file_info.version) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.version_needed) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.flag) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.compression_method) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getLong(s->_stream,&file_info.dosDate) != UNZ_OK)
		err=UNZ_ERRNO;

	unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);

	if (unzlocal_getLong(s->_stream,&file_info.crc) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getLong(s->_stream,&file_info.compressed_size) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getLong(s->_stream,&file_info.uncompressed_size) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.size_filename) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.size_file_extra) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.size_file_comment) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.disk_num_start) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getShort(s->_stream,&file_info.internal_fa) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getLong(s->_stream,&file_info.external_fa) != UNZ_OK)
		err=UNZ_ERRNO;

	if (unzlocal_getLong(s->_stream,&file_info_internal.offset_curfile) != UNZ_OK)
		err=UNZ_ERRNO;

	lSeek+=file_info.size_filename;
	if ((err==UNZ_OK) && (szFileName!=NULL)) {
		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 (s->_stream->read(szFileName,(uInt)uSizeRead)!=uSizeRead)
				err=UNZ_ERRNO;
		lSeek -= uSizeRead;
	}


	if ((err==UNZ_OK) && (extraField!=NULL)) {
		uLong uSizeRead ;
		if (file_info.size_file_extra<extraFieldBufferSize)
			uSizeRead = file_info.size_file_extra;
		else
			uSizeRead = extraFieldBufferSize;

		if (lSeek!=0) {
			s->_stream->seek(lSeek, SEEK_CUR);
			if (s->_stream->err())
				lSeek=0;
			else
				err=UNZ_ERRNO;
		}
		if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
			if (s->_stream->read(extraField,(uInt)uSizeRead)!=uSizeRead)
				err=UNZ_ERRNO;
		lSeek += file_info.size_file_extra - uSizeRead;
	}
	else
		lSeek+=file_info.size_file_extra;


	if ((err==UNZ_OK) && (szComment!=NULL)) {
		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) {
			s->_stream->seek(lSeek, SEEK_CUR);
			if (s->_stream->err())
				lSeek=0;
			else
				err=UNZ_ERRNO;
		}
		if ((file_info.size_file_comment>0) && (commentBufferSize>0))
			if (s->_stream->read(szComment,(uInt)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!=NULL))
		*pfile_info=file_info;

	if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
		*pfile_info_internal=file_info_internal;

	return err;
}
Beispiel #3
0
static int unzlocal_GetCurrentFileInfoInternal(unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, DWORD fileNameBufferSize, void *extraField, DWORD extraFieldBufferSize, char *szComment, DWORD commentBufferSize)
{
  unz_s *s;
  unz_file_info file_info;
  unz_file_info_internal file_info_internal;
  int err = UNZ_OK;
  DWORD uMagic;
  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, 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 != NULL))
  {
    DWORD 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 != NULL))
  {
    DWORD 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, 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 != NULL))
  {
    DWORD 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, 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 != NULL))
  {
    *pfile_info = file_info;
  }

  if ((err == UNZ_OK) && (pfile_info_internal != NULL))
  {
    *pfile_info_internal = file_info_internal;
  }

  return err;
}