Просмотр исходного кода

dpkg-deb: Use fdio instead of stdio

Prefer fdio for binary data.
Guillem Jover лет назад: 15
Родитель
Сommit
fdc401aa7d
1 измененных файлов с 18 добавлено и 16 удалено
  1. 18 16
      dpkg-deb/build.c

+ 18 - 16
dpkg-deb/build.c

@@ -31,6 +31,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <dirent.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -385,7 +386,7 @@ void do_build(const char *const *argv) {
   const char *debar, *dir;
   bool subdir;
   char *tfbuf;
-  FILE *ar;
+  int arfd;
   int p1[2], p2[2], p3[2], gzfd;
   pid_t c1,c2,c3;
   struct file_info *fi;
@@ -437,9 +438,9 @@ void do_build(const char *const *argv) {
 
   /* Now that we have verified everything its time to actually
    * build something. Let's start by making the ar-wrapper. */
-  if (!(ar=fopen(debar,"wb"))) ohshite(_("unable to create `%.255s'"),debar);
-  if (setvbuf(ar, NULL, _IONBF, 0))
-    ohshite(_("unable to unbuffer `%.255s'"), debar);
+  arfd = creat(debar, 0644);
+  if (arfd < 0)
+    ohshite(_("unable to create `%.255s'"), debar);
   /* Fork a tar to package the control-section of the package. */
   unsetenv("TAR_OPTIONS");
   m_pipe(p1);
@@ -483,19 +484,21 @@ void do_build(const char *const *argv) {
    * to the package and insert it. */
   if (oldformatflag) {
     struct stat controlstab;
+    char versionbuf[40];
 
     if (fstat(gzfd, &controlstab))
       ohshite(_("failed to stat temporary file (%s)"), _("control member"));
-    if (fprintf(ar, "%-8s\n%ld\n", OLDARCHIVEVERSION, (long)controlstab.st_size) == EOF)
+    sprintf(versionbuf, "%-8s\n%ld\n", OLDARCHIVEVERSION,
+            (long)controlstab.st_size);
+    if (fd_write(arfd, versionbuf, strlen(versionbuf)) < 0)
       werr(debar);
-    fd_fd_copy(gzfd, fileno(ar), -1, _("control member"));
+    fd_fd_copy(gzfd, arfd, -1, _("control member"));
   } else {
     const char deb_magic[] = ARCHIVEVERSION "\n";
 
-    dpkg_ar_put_magic(debar, fileno(ar));
-    dpkg_ar_member_put_mem(debar, fileno(ar), DEBMAGIC,
-                           deb_magic, strlen(deb_magic));
-    dpkg_ar_member_put_file(debar, fileno(ar), ADMINMEMBER, gzfd, -1);
+    dpkg_ar_put_magic(debar, arfd);
+    dpkg_ar_member_put_mem(debar, arfd, DEBMAGIC, deb_magic, strlen(deb_magic));
+    dpkg_ar_member_put_file(debar, arfd, ADMINMEMBER, gzfd, -1);
   }
 
   /* Control is done, now we need to archive the data. Start by creating
@@ -532,7 +535,7 @@ void do_build(const char *const *argv) {
   if (!c2) {
     close(p1[1]);
     m_dup2(p2[0],0); close(p2[0]);
-    m_dup2(oldformatflag ? fileno(ar) : gzfd,1);
+    m_dup2(oldformatflag ? arfd : gzfd, 1);
     compress_filter(compressor, 0, 1, compress_level, _("data member"));
   }
   close(p2[0]);
@@ -581,13 +584,12 @@ void do_build(const char *const *argv) {
     if (lseek(gzfd, 0, SEEK_SET))
       ohshite(_("failed to rewind temporary file (%s)"), _("data member"));
 
-    dpkg_ar_member_put_file(debar, fileno(ar), datamember, gzfd, -1);
+    dpkg_ar_member_put_file(debar, arfd, datamember, gzfd, -1);
   }
-  if (fflush(ar))
-    ohshite(_("unable to flush file '%s'"), debar);
-  if (fsync(fileno(ar)))
+  if (fsync(arfd))
     ohshite(_("unable to sync file '%s'"), debar);
-  if (fclose(ar)) werr(debar);
+  if (close(arfd))
+    ohshite(_("unable to close file '%s'"), debar);
 
   exit(0);
 }