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

libdpkg: Change dpkg_ar_member_put_file() to accept a size limit

Guillem Jover лет назад: 15
Родитель
Сommit
97f0c0baee
3 измененных файлов с 13 добавлено и 10 удалено
  1. 2 2
      dpkg-deb/build.c
  2. 10 7
      lib/dpkg/ar.c
  3. 1 1
      lib/dpkg/ar.h

+ 2 - 2
dpkg-deb/build.c

@@ -491,7 +491,7 @@ void do_build(const char *const *argv) {
     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);
+    dpkg_ar_member_put_file(debar, fileno(ar), ADMINMEMBER, gzfd, -1);
   }
 
   /* Control is done, now we need to archive the data. Start by creating
@@ -577,7 +577,7 @@ 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);
+    dpkg_ar_member_put_file(debar, fileno(ar), datamember, gzfd, -1);
   }
   if (fflush(ar))
     ohshite(_("unable to flush file '%s'"), debar);

+ 10 - 7
lib/dpkg/ar.c

@@ -112,19 +112,22 @@ dpkg_ar_member_put_mem(const char *ar_name, int ar_fd,
 
 void
 dpkg_ar_member_put_file(const char *ar_name, int ar_fd,
-                        const char *name, int fd)
+                        const char *name, int fd, off_t size)
 {
-	struct stat st;
+	if (size <= 0) {
+		struct stat st;
 
-	if (fstat(fd, &st))
-		ohshite(_("failed to fstat ar member file (%s)"), name);
+		if (fstat(fd, &st))
+			ohshite(_("failed to fstat ar member file (%s)"), name);
+		size = st.st_size;
+	}
 
-	dpkg_ar_member_put_header(ar_name, ar_fd, name, st.st_size);
+	dpkg_ar_member_put_header(ar_name, ar_fd, name, size);
 
 	/* Copy data contents. */
-	fd_fd_copy(fd, ar_fd, -1, _("ar member file (%s)"), name);
+	fd_fd_copy(fd, ar_fd, size, _("ar member file (%s)"), name);
 
-	if (st.st_size & 1)
+	if (size & 1)
 		if (write(ar_fd, "\n", 1) < 0)
 			ohshite(_("unable to write file '%s'"), ar_name);
 }

+ 1 - 1
lib/dpkg/ar.h

@@ -37,7 +37,7 @@ void dpkg_ar_put_magic(const char *ar_name, int ar_fd);
 void dpkg_ar_member_put_header(const char *ar_name, int ar_fd,
                                const char *name, size_t size);
 void dpkg_ar_member_put_file(const char *ar_name, int ar_fd, const char *name,
-                             int fd);
+                             int fd, off_t size);
 void dpkg_ar_member_put_mem(const char *ar_name, int ar_fd, const char *name,
                             const void *data, size_t size);
 off_t dpkg_ar_member_get_size(const char *ar_name, struct ar_hdr *arh);