Przeglądaj źródła

dpkg-deb: Refactor fflush and its buggy fpos handling to safe_fflush()

Guillem Jover 18 lat temu
rodzic
commit
fb312088e4
2 zmienionych plików z 26 dodań i 12 usunięć
  1. 6 0
      ChangeLog
  2. 20 12
      dpkg-deb/extract.c

+ 6 - 0
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.

+ 20 - 12
dpkg-deb/extract.c

@@ -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);