|
@@ -1089,19 +1089,32 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
|
|
|
if (compressor.Name == "." || compressor.Binary.empty() == true)
|
|
if (compressor.Name == "." || compressor.Binary.empty() == true)
|
|
|
return true;
|
|
return true;
|
|
|
|
|
|
|
|
|
|
+#if defined HAVE_ZLIB || defined HAVE_BZ2
|
|
|
|
|
+ // the API to open files is similar, so setup to avoid code duplicates later
|
|
|
|
|
+ // and while at it ensure that we close before opening (if its a reopen)
|
|
|
|
|
+ void* (*compress_open)(int, const char *) = NULL;
|
|
|
|
|
+#define APT_COMPRESS_INIT(NAME,OPEN,CLOSE,STRUCT) \
|
|
|
|
|
+ if (compressor.Name == NAME) \
|
|
|
|
|
+ { \
|
|
|
|
|
+ compress_open = (void*(*)(int, const char *)) OPEN; \
|
|
|
|
|
+ if (d != NULL && STRUCT != NULL) { CLOSE(STRUCT); STRUCT = NULL; } \
|
|
|
|
|
+ }
|
|
|
|
|
+#ifdef HAVE_ZLIB
|
|
|
|
|
+ APT_COMPRESS_INIT("gzip", gzdopen, gzclose, d->gz)
|
|
|
|
|
+#endif
|
|
|
|
|
+#ifdef HAVE_BZ2
|
|
|
|
|
+ APT_COMPRESS_INIT("bzip2", BZ2_bzdopen, BZ2_bzclose, d->bz2)
|
|
|
|
|
+#endif
|
|
|
|
|
+#undef APT_COMPRESS_INIT
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
if (d == NULL)
|
|
if (d == NULL)
|
|
|
{
|
|
{
|
|
|
d = new FileFdPrivate();
|
|
d = new FileFdPrivate();
|
|
|
d->openmode = Mode;
|
|
d->openmode = Mode;
|
|
|
d->compressor = compressor;
|
|
d->compressor = compressor;
|
|
|
- if (AutoClose == false && (
|
|
|
|
|
-#ifdef HAVE_ZLIB
|
|
|
|
|
- compressor.Name == "gzip" ||
|
|
|
|
|
-#endif
|
|
|
|
|
-#ifdef HAVE_BZ2
|
|
|
|
|
- compressor.Name == "bzip2" ||
|
|
|
|
|
-#endif
|
|
|
|
|
- false))
|
|
|
|
|
|
|
+#if defined HAVE_ZLIB || defined HAVE_BZ2
|
|
|
|
|
+ if (AutoClose == false && compress_open != NULL)
|
|
|
{
|
|
{
|
|
|
// Need to duplicate fd here or gz/bz2 close for cleanup will close the fd as well
|
|
// Need to duplicate fd here or gz/bz2 close for cleanup will close the fd as well
|
|
|
int const internFd = dup(iFd);
|
|
int const internFd = dup(iFd);
|
|
@@ -1109,44 +1122,30 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
|
|
|
return FileFdErrno("OpenInternDescriptor", _("Could not open file descriptor %d"), iFd);
|
|
return FileFdErrno("OpenInternDescriptor", _("Could not open file descriptor %d"), iFd);
|
|
|
iFd = internFd;
|
|
iFd = internFd;
|
|
|
}
|
|
}
|
|
|
|
|
+#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#ifdef HAVE_ZLIB
|
|
|
|
|
- if (compressor.Name == "gzip")
|
|
|
|
|
|
|
+#if defined HAVE_ZLIB || defined HAVE_BZ2
|
|
|
|
|
+ if (compress_open != NULL)
|
|
|
{
|
|
{
|
|
|
- if (d->gz != NULL)
|
|
|
|
|
- {
|
|
|
|
|
- gzclose(d->gz);
|
|
|
|
|
- d->gz = NULL;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ void* compress_struct = NULL;
|
|
|
if ((Mode & ReadWrite) == ReadWrite)
|
|
if ((Mode & ReadWrite) == ReadWrite)
|
|
|
- d->gz = gzdopen(iFd, "r+");
|
|
|
|
|
|
|
+ compress_struct = compress_open(iFd, "r+");
|
|
|
else if ((Mode & WriteOnly) == WriteOnly)
|
|
else if ((Mode & WriteOnly) == WriteOnly)
|
|
|
- d->gz = gzdopen(iFd, "w");
|
|
|
|
|
|
|
+ compress_struct = compress_open(iFd, "w");
|
|
|
else
|
|
else
|
|
|
- d->gz = gzdopen(iFd, "r");
|
|
|
|
|
- if (d->gz == NULL)
|
|
|
|
|
|
|
+ compress_struct = compress_open(iFd, "r");
|
|
|
|
|
+ if (compress_struct == NULL)
|
|
|
return false;
|
|
return false;
|
|
|
- Flags |= Compressed;
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+#ifdef HAVE_ZLIB
|
|
|
|
|
+ if (compressor.Name == "gzip")
|
|
|
|
|
+ d->gz = (gzFile) compress_struct;
|
|
|
#endif
|
|
#endif
|
|
|
#ifdef HAVE_BZ2
|
|
#ifdef HAVE_BZ2
|
|
|
- if (compressor.Name == "bzip2")
|
|
|
|
|
- {
|
|
|
|
|
- if (d->bz2 != NULL)
|
|
|
|
|
- {
|
|
|
|
|
- BZ2_bzclose(d->bz2);
|
|
|
|
|
- d->bz2 = NULL;
|
|
|
|
|
- }
|
|
|
|
|
- if ((Mode & ReadWrite) == ReadWrite)
|
|
|
|
|
- d->bz2 = BZ2_bzdopen(iFd, "r+");
|
|
|
|
|
- else if ((Mode & WriteOnly) == WriteOnly)
|
|
|
|
|
- d->bz2 = BZ2_bzdopen(iFd, "w");
|
|
|
|
|
- else
|
|
|
|
|
- d->bz2 = BZ2_bzdopen(iFd, "r");
|
|
|
|
|
- if (d->bz2 == NULL)
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ if (compressor.Name == "bzip2")
|
|
|
|
|
+ d->bz2 = (BZFILE*) compress_struct;
|
|
|
|
|
+#endif
|
|
|
Flags |= Compressed;
|
|
Flags |= Compressed;
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|