BZFILE *BzFile;
//! \c True if end of file is reached.
bool Eof;
- //! Copy of the original file handle.
- int fd;
-}
+ //! Original file in case a rewind is necessary.
+ FILE *File;
+};
/*!
* Read from bzip file.
{
struct BzlibInternalFile *BData=(struct BzlibInternalFile *)Data;
int nread;
+ int bzerr=BZ_OK;
- nread=BZ2_bzread(BData->BzFile,Buffer,Size);
- if (nread==0) BData->Eof=true;
+ if (BData->Eof) return(0);
+ nread=BZ2_bzRead(&bzerr,BData->BzFile,Buffer,Size);
+ if (bzerr==BZ_STREAM_END)
+ BData->Eof=true;
+ else if (bzerr!=BZ_OK)
+ return(0);
return(nread);
}
static void Bzip_Rewind(void *Data)
{
struct BzlibInternalFile *BData=(struct BzlibInternalFile *)Data;
- int fd;
+ int bzerr=BZ_OK;
- BZ2_bzclose(BData->BzFile);
- fd=dup(BData->fd);
- if (fd==-1)
- {
- debuga(__FILE__,__LINE__,_("Cannot rewind bzip file\n"));
- exit(EXIT_FAILURE);
- }
- BData->BzFile=BZ2_bzdopen(fd,"rb");
+ BZ2_bzReadClose(&bzerr,BData->BzFile);
+ rewind(BData->File);
+ BData->BzFile=BZ2_bzReadOpen(&bzerr,BData->File,0,0,NULL,0);
if (!BData->BzFile)
{
debuga(__FILE__,__LINE__,_("Cannot rewind bzip file\n"));
exit(EXIT_FAILURE);
}
+ BData->Eof=false;
}
/*!
static int Bzip_Close(void *Data)
{
struct BzlibInternalFile *BData=(struct BzlibInternalFile *)Data;
+ int bzerr=BZ_OK;
- BZ2_bzclose(BData->BzFile);
- close(BData->fd);
+ BZ2_bzReadClose(&bzerr,BData->BzFile);
+ fclose(BData->File);
free(BData);
return(0);
}
{
FileObject *File;
struct BzlibInternalFile *BData;
+ int bzerr=BZ_OK;
FileObject_SetLastOpenError(NULL);
File=calloc(1,sizeof(*File));
FileObject_SetLastOpenError(_("Not enough memory"));
return(NULL);
}
- BData->fd=dup(fd);
- if (BData->fd==-1)
+ BData->File=fdopen(fd,"rb");
+ if (BData->File==NULL)
{
free(BData);
free(File);
FileObject_SetLastOpenError(_("Error duplicating file descriptor"));
return(NULL);
}
- File=Data=BData;
- BData->BzFile=BZ2_bzdopen(fd,"rb");
+ File->Data=BData;
+ BData->BzFile=BZ2_bzReadOpen(&bzerr,BData->File,0,0,NULL,0);
if (!BData->BzFile)
{
- close(BData->fd);
+ fclose(BData->File);
free(BData);
free(File);
FileObject_SetLastOpenError(_("Error opening bzip file"));