]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - decomp.c
Restore support for bzip2 files
[thirdparty/sarg.git] / decomp.c
index 28be9076a2e06b8d442d276779e9625d0334ec65..5689d769177d2e66b229925dc504ac8c75ce2938 100644 (file)
--- a/decomp.c
+++ b/decomp.c
@@ -146,9 +146,9 @@ struct BzlibInternalFile
        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.
@@ -163,9 +163,14 @@ static int Bzip_Read(void *Data,void *Buffer,int Size)
 {
        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);
 }
 
@@ -190,21 +195,17 @@ static int Bzip_Eof(void *Data)
 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;
 }
 
 /*!
@@ -217,9 +218,10 @@ static void Bzip_Rewind(void *Data)
 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);
 }
@@ -233,6 +235,7 @@ static FileObject *Bzip_Open(int fd)
 {
        FileObject *File;
        struct BzlibInternalFile *BData;
+       int bzerr=BZ_OK;
 
        FileObject_SetLastOpenError(NULL);
        File=calloc(1,sizeof(*File));
@@ -248,19 +251,19 @@ static FileObject *Bzip_Open(int fd)
                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"));