Przeglądaj źródła

FildFd: Introduce a Flush() function and call it from Close()

The flush function can be used for buffered writers.
Julian Andres Klode 10 lat temu
rodzic
commit
766761fd83
2 zmienionych plików z 16 dodań i 0 usunięć
  1. 15 0
      apt-pkg/contrib/fileutl.cc
  2. 1 0
      apt-pkg/contrib/fileutl.h

+ 15 - 0
apt-pkg/contrib/fileutl.cc

@@ -1055,6 +1055,10 @@ public:
       *To = '\0';
       return InitialTo;
    }
+   virtual bool InternalFlush()
+   {
+      return true;
+   }
    virtual ssize_t InternalWrite(void const * const From, unsigned long long const Size) = 0;
    virtual bool InternalWriteError() { return filefd->FileFdErrno("write",_("Write error")); }
    virtual bool InternalSeek(unsigned long long const To)
@@ -2070,6 +2074,15 @@ char* FileFd::ReadLine(char *To, unsigned long long const Size)
    return d->InternalReadLine(To, Size);
 }
 									/*}}}*/
+// FileFd::Flush - Flush the file  					/*{{{*/
+bool FileFd::Flush()
+{
+   if (d == nullptr)
+      return true;
+
+   return d->InternalFlush();
+}
+									/*}}}*/
 // FileFd::Write - Write to the file					/*{{{*/
 bool FileFd::Write(const void *From,unsigned long long Size)
 {
@@ -2223,6 +2236,8 @@ unsigned long long FileFd::Size()
 /* */
 bool FileFd::Close()
 {
+   if (Flush() == false)
+      return false;
    if (iFd == -1)
       return true;
 

+ 1 - 0
apt-pkg/contrib/fileutl.h

@@ -85,6 +85,7 @@ class FileFd
    }   
    bool Read(void *To,unsigned long long Size,unsigned long long *Actual = 0);
    char* ReadLine(char *To, unsigned long long const Size);
+   bool Flush();
    bool Write(const void *From,unsigned long long Size);
    bool static Write(int Fd, const void *From, unsigned long long Size);
    bool Seek(unsigned long long To);