Browse Source

FileFd(): Drop file name extension check in ReadOnlyGzip mode

Drop the ".gz" extension check in FileFd::Open() in ReadOnlyGzip mode, to not
depend on a particular file extension. This allows rewriting the gzip method
using internal decompression (on ".decomp" files).

This requires a zlib bug workaround in FileFd::Close(): When opening an empty
file with gzdopen(), gzclose() fails with Z_BUF_ERROR. Do not count this as a
failure.
tags/debian/0.8.0
martin@piware.de 11 years ago
parent
commit
d13c2d3f7b
1 changed files with 11 additions and 3 deletions
  1. +11
    -3
      apt-pkg/contrib/fileutl.cc

+ 11
- 3
apt-pkg/contrib/fileutl.cc View File

@@ -608,7 +608,7 @@ bool FileFd::Open(string FileName,OpenMode Mode, unsigned long Perms)

case ReadOnlyGzip:
iFd = open(FileName.c_str(),O_RDONLY);
if (iFd > 0 && FileName.compare(FileName.size()-3, 3, ".gz") == 0) {
if (iFd > 0) {
gz = gzdopen (iFd, "r");
if (gz == NULL) {
close (iFd);
@@ -827,8 +827,16 @@ bool FileFd::Close()
{
bool Res = true;
if ((Flags & AutoClose) == AutoClose)
if ((gz != NULL && gzclose(gz) != 0) || (gz == NULL && iFd > 0 && close(iFd) != 0))
Res &= _error->Errno("close",_("Problem closing the file"));
{
if (gz != NULL) {
int e = gzclose(gz);
// gzdopen() on empty files always fails with "buffer error" here, ignore that
if (e != 0 && e != Z_BUF_ERROR)
Res &= _error->Errno("close",_("Problem closing the gzip file"));
} else
if (iFd > 0 && close(iFd) != 0)
Res &= _error->Errno("close",_("Problem closing the file"));
}
iFd = -1;
gz = NULL;


Loading…
Cancel
Save