]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/fileutl.cc
fix calling style of FileFd (no functional change)
[apt.git] / apt-pkg / contrib / fileutl.cc
index 1cf2253298929df90888ce97fa30b93c5bc19fbb..7a24b6bb0f23e31a29284536eb27ea5121c47849 100644 (file)
@@ -905,8 +905,6 @@ bool FileFd::Open(string FileName,unsigned int const Mode,CompressMode Compress,
 bool FileFd::Open(string FileName,unsigned int const Mode,APT::Configuration::Compressor const &compressor, unsigned long const Perms)
 {
    Close();
-   d = new FileFdPrivate;
-   d->openmode = Mode;
    Flags = AutoClose;
 
    if ((Mode & WriteOnly) != WriteOnly && (Mode & (Atomic | Create | Empty | Exclusive)) != 0)
@@ -1000,8 +998,6 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compre
 bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration::Compressor const &compressor, bool AutoClose)
 {
    Close();
-   d = new FileFdPrivate;
-   d->openmode = Mode;
    Flags = (AutoClose) ? FileFd::AutoClose : 0;
    iFd = Fd;
    this->FileName = "";
@@ -1015,12 +1011,22 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration:
 }
 bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor)
 {
-   d->compressor = compressor;
+   if (d == NULL)
+   {
+      d = new FileFdPrivate();
+      d->openmode = Mode;
+      d->compressor = compressor;
+   }
    if (compressor.Name == "." || compressor.Binary.empty() == true)
       return true;
 #ifdef HAVE_ZLIB
    else if (compressor.Name == "gzip")
    {
+      if (d->gz != NULL)
+      {
+        gzclose(d->gz);
+        d->gz = NULL;
+      }
       if ((Mode & ReadWrite) == ReadWrite)
         d->gz = gzdopen(iFd, "r+");
       else if ((Mode & WriteOnly) == WriteOnly)
@@ -1036,6 +1042,11 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
 #ifdef HAVE_BZ2
    else 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)
@@ -1049,14 +1060,20 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
    }
 #endif
 
+   // collect zombies here in case we reopen
+   if (d->compressor_pid > 0)
+      ExecWait(d->compressor_pid, "FileFdCompressor", true);
 
    if ((Mode & ReadWrite) == ReadWrite)
+   {
+      Flags |= Fail;
       return _error->Error("ReadWrite mode is not supported for file %s", FileName.c_str());
+   }
 
    bool const Comp = (Mode & WriteOnly) == WriteOnly;
-   // Handle 'decompression' of empty files
    if (Comp == false)
    {
+      // Handle 'decompression' of empty files
       struct stat Buf;
       fstat(iFd, &Buf);
       if (Buf.st_size == 0 && S_ISFIFO(Buf.st_mode) == false)
@@ -1074,7 +1091,10 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
    // Create a data pipe
    int Pipe[2] = {-1,-1};
    if (pipe(Pipe) != 0)
+   {
+      Flags |= Fail;
       return _error->Errno("pipe",_("Failed to create subprocess IPC"));
+   }
    for (int J = 0; J != 2; J++)
       SetCloseExec(Pipe[J],true);
 
@@ -1353,7 +1373,10 @@ bool FileFd::Seek(unsigned long long To)
         return Skip(To - seekpos);
 
       if ((d->openmode & ReadOnly) != ReadOnly)
+      {
+        Flags |= Fail;
         return _error->Error("Reopen is only implemented for read-only files!");
+      }
 #ifdef HAVE_BZ2
       if (d->bz2 != NULL)
         BZ2_bzclose(d->bz2);
@@ -1371,11 +1394,17 @@ bool FileFd::Seek(unsigned long long To)
            if (lseek(d->compressed_fd, 0, SEEK_SET) != 0)
               iFd = d->compressed_fd;
         if (iFd <= 0)
+        {
+           Flags |= Fail;
            return _error->Error("Reopen is not implemented for pipes opened with FileFd::OpenDescriptor()!");
+        }
       }
 
       if (OpenInternDescriptor(d->openmode, d->compressor) == false)
+      {
+        Flags |= Fail;
         return _error->Error("Seek on file %s because it couldn't be reopened", FileName.c_str());
+      }
 
       if (To != 0)
         return Skip(To);
@@ -1417,7 +1446,10 @@ bool FileFd::Skip(unsigned long long Over)
       {
         unsigned long long toread = std::min((unsigned long long) sizeof(buffer), Over);
         if (Read(buffer, toread) == false)
+        {
+           Flags |= Fail;
            return _error->Error("Unable to seek ahead %llu",Over);
+        }
         Over -= toread;
       }
       return true;
@@ -1485,7 +1517,10 @@ unsigned long long FileFd::Tell()
 #endif
      Res = lseek(iFd,0,SEEK_CUR);
    if (Res == (off_t)-1)
+   {
+      Flags |= Fail;
       _error->Errno("lseek","Failed to determine the current file position");
+   }
    d->seekpos = Res;
    return Res;
 }
@@ -1497,7 +1532,10 @@ unsigned long long FileFd::FileSize()
 {
    struct stat Buf;
    if (d->pipe == false && fstat(iFd,&Buf) != 0)
+   {
+      Flags |= Fail;
       return _error->Errno("fstat","Unable to determine the file size");
+   }
 
    // for compressor pipes st_size is undefined and at 'best' zero
    if (d->pipe == true || S_ISFIFO(Buf.st_mode))
@@ -1506,7 +1544,10 @@ unsigned long long FileFd::FileSize()
       // in theory the Open-methods should take care of it already
       d->pipe = true;
       if (stat(FileName.c_str(), &Buf) != 0)
+      {
+        Flags |= Fail;
         return _error->Errno("stat","Unable to determine the file size");
+      }
    }
 
    return Buf.st_size;
@@ -1548,10 +1589,16 @@ unsigned long long FileFd::Size()
        * bits of the file */
        // FIXME: Size for gz-files is limited by 32bit… no largefile support
        if (lseek(iFd, -4, SEEK_END) < 0)
-          return _error->Errno("lseek","Unable to seek to end of gzipped file");
+       {
+         Flags |= Fail;
+         return _error->Errno("lseek","Unable to seek to end of gzipped file");
+       }
        size = 0L;
        if (read(iFd, &size, 4) != 4)
-          return _error->Errno("read","Unable to read original size of gzipped file");
+       {
+         Flags |= Fail;
+         return _error->Errno("read","Unable to read original size of gzipped file");
+       }
 
 #ifdef WORDS_BIGENDIAN
        uint32_t tmp_size = size;
@@ -1561,7 +1608,10 @@ unsigned long long FileFd::Size()
 #endif
 
        if (lseek(iFd, oldPos, SEEK_SET) < 0)
-          return _error->Errno("lseek","Unable to seek in gzipped file");
+       {
+         Flags |= Fail;
+         return _error->Errno("lseek","Unable to seek in gzipped file");
+       }
 
        return size;
    }
@@ -1578,6 +1628,7 @@ time_t FileFd::ModificationTime()
    struct stat Buf;
    if (d->pipe == false && fstat(iFd,&Buf) != 0)
    {
+      Flags |= Fail;
       _error->Errno("fstat","Unable to determine the modification time of file %s", FileName.c_str());
       return 0;
    }
@@ -1590,6 +1641,7 @@ time_t FileFd::ModificationTime()
       d->pipe = true;
       if (stat(FileName.c_str(), &Buf) != 0)
       {
+        Flags |= Fail;
         _error->Errno("fstat","Unable to determine the modification time of file %s", FileName.c_str());
         return 0;
       }
@@ -1649,6 +1701,8 @@ bool FileFd::Close()
       d = NULL;
    }
 
+   if (Res == false)
+      Flags |= Fail;
    return Res;
 }
                                                                        /*}}}*/
@@ -1659,7 +1713,10 @@ bool FileFd::Sync()
 {
 #ifdef _POSIX_SYNCHRONIZED_IO
    if (fsync(iFd) != 0)
+   {
+      Flags |= Fail;
       return _error->Errno("sync",_("Problem syncing the file"));
+   }
 #endif
    return true;
 }