]> err.no Git - dpkg/commitdiff
dpkg-deb: Refactor fflush and its buggy fpos handling to safe_fflush()
authorGuillem Jover <guillem@debian.org>
Tue, 22 Jan 2008 08:49:49 +0000 (10:49 +0200)
committerGuillem Jover <guillem@debian.org>
Tue, 22 Jan 2008 08:49:49 +0000 (10:49 +0200)
ChangeLog
dpkg-deb/extract.c

index 885181ba6c92c2d81a4f4d86d43895652047fd28..820ad55180381ef0ef2a4c41108db04eca58dcdf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-01-22  Guillem Jover  <guillem@debian.org>
+
+       * dpkg-deb/extract.c (extracthalf): Refactor fflush and its buggy
+       fpos handling to ...
+       (safe_fflush): ... here. New function.
+
 2008-01-22  Guillem Jover  <guillem@debian.org>
 
        * lib/vercmp.c [0] (verrevcmp): Remove dead code.
index 1c20a04e1b430f8758df52ee2851c3140aeb46ee..e98e03cd2e5b3302746dcd059091c51d4cecb6b9 100644 (file)
@@ -85,6 +85,24 @@ parseheaderlength(const char *inh, size_t len,
   return (size_t)r;
 }
 
+static int
+safe_fflush(FILE *f)
+{
+#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ > 0)
+  /* XXX: Glibc 2.1 and some versions of Linux want to make fflush()
+   * move the current fpos. Remove this code some time. */
+  fpos_t fpos;
+
+  if (fgetpos(f, &fpos))
+    ohshit(_("failed getting the current file position"));
+  fflush(f);
+  if (fsetpos(f, &fpos))
+    ohshit(_("failed setting the current file position"));
+#else
+  fflush(f);
+#endif
+}
+
 void extracthalf(const char *debar, const char *directory,
                  const char *taroption, int admininfo) {
   char versionbuf[40];
@@ -101,9 +119,6 @@ void extracthalf(const char *debar, const char *directory,
   char *cur;
   struct ar_hdr arh;
   int readfromfd, oldformat= 0, header_done, adminmember;
-#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ > 0)
-  fpos_t fpos;
-#endif
   enum compress_type compress_type = compress_type_gzip;
   
   ar= fopen(debar,"r"); if (!ar) ohshite(_("failed to read archive `%.255s'"),debar);
@@ -228,15 +243,8 @@ void extracthalf(const char *debar, const char *directory,
 
   }
 
-#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ > 0)
-  if (fgetpos(ar, &fpos))
-    ohshit(_("failed getting the current file position"));
-#endif
-  fflush(ar);
-#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ > 0)
-  if (fsetpos(ar, &fpos))
-    ohshit(_("failed setting the current file position"));
-#endif
+  safe_fflush(ar);
+
   if (oldformat) {
     if (admininfo) {
       m_pipe(p1);