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

libdpkg: Switch the compression filter functions to always return

This makes the compression and decompression functions be closer to the
buffer api, which always return. For non-blocking I/O, the caller has to
setup a child process.

When using external binaries, we make the filter functions setup that
child process transparently so that the API is uniform.
Guillem Jover лет назад: 15
Родитель
Сommit
269bbee973
4 измененных файлов с 42 добавлено и 49 удалено
  1. 2 0
      dpkg-deb/build.c
  2. 1 0
      dpkg-deb/extract.c
  3. 35 43
      lib/dpkg/compress.c
  4. 4 6
      lib/dpkg/compress.h

+ 2 - 0
dpkg-deb/build.c

@@ -475,6 +475,7 @@ do_build(const char *const *argv)
   c2 = subproc_fork();
   if (!c2) {
     compress_filter(&compressor_gzip, p1[0], gzfd, 9, _("control member"));
+    exit(0);
   }
   close(p1[0]);
   subproc_wait_check(c2, "gzip -9c", 0);
@@ -543,6 +544,7 @@ do_build(const char *const *argv)
   if (!c2) {
     close(p1[1]);
     compress_filter(compressor, p2[0], gzfd, compress_level, _("data member"));
+    exit(0);
   }
   close(p2[0]);
 

+ 1 - 0
dpkg-deb/extract.c

@@ -282,6 +282,7 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
     if (taroption)
       close(p2[0]);
     decompress_filter(decompressor, p1[0], p2_out, _("data"));
+    exit(0);
   }
   close(p1[0]);
   close(arfd);

+ 35 - 43
lib/dpkg/compress.c

@@ -42,47 +42,51 @@
 #include <dpkg/buffer.h>
 #include <dpkg/command.h>
 #include <dpkg/compress.h>
+#include <dpkg/subproc.h>
 
-static void DPKG_ATTR_NORET DPKG_ATTR_SENTINEL
+static void DPKG_ATTR_SENTINEL
 fd_fd_filter(int fd_in, int fd_out, const char *desc, const char *file, ...)
 {
 	va_list args;
 	struct command cmd;
+	pid_t pid;
 
-	if (fd_in != 0) {
-		m_dup2(fd_in, 0);
-		close(fd_in);
-	}
-	if (fd_out != 1) {
-		m_dup2(fd_out, 1);
-		close(fd_out);
-	}
+	pid = subproc_fork();
+	if (pid != 0) {
+		if (fd_in != 0) {
+			m_dup2(fd_in, 0);
+			close(fd_in);
+		}
+		if (fd_out != 1) {
+			m_dup2(fd_out, 1);
+			close(fd_out);
+		}
 
-	command_init(&cmd, file, desc);
-	command_add_arg(&cmd, file);
-	va_start(args, file);
-	command_add_argv(&cmd, args);
-	va_end(args);
+		command_init(&cmd, file, desc);
+		command_add_arg(&cmd, file);
+		va_start(args, file);
+		command_add_argv(&cmd, args);
+		va_end(args);
 
-	command_exec(&cmd);
+		command_exec(&cmd);
+	}
+	subproc_wait_check(pid, desc, 0);
 }
 
 /*
  * No compressor (pass-through).
  */
 
-static void DPKG_ATTR_NORET
+static void
 decompress_none(int fd_in, int fd_out, const char *desc)
 {
 	fd_fd_copy(fd_in, fd_out, -1, _("%s: decompression"), desc);
-	exit(0);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_none(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	fd_fd_copy(fd_in, fd_out, -1, _("%s: compression"), desc);
-	exit(0);
 }
 
 struct compressor compressor_none = {
@@ -98,7 +102,7 @@ struct compressor compressor_none = {
  */
 
 #ifdef WITH_ZLIB
-static void DPKG_ATTR_NORET
+static void
 decompress_gzip(int fd_in, int fd_out, const char *desc)
 {
 	char buffer[4096];
@@ -130,11 +134,9 @@ decompress_gzip(int fd_in, int fd_out, const char *desc)
 
 	if (close(fd_out))
 		ohshite(_("%s: internal gzip write error"), desc);
-
-	exit(0);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char buffer[4096];
@@ -177,17 +179,15 @@ compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 			errmsg = zError(err);
 		ohshit(_("%s: internal gzip write error: %s"), desc, errmsg);
 	}
-
-	exit(0);
 }
 #else
-static void DPKG_ATTR_NORET
+static void
 decompress_gzip(int fd_in, int fd_out, const char *desc)
 {
 	fd_fd_filter(fd_in, fd_out, desc, GZIP, "-dc", NULL);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char combuf[6];
@@ -210,7 +210,7 @@ struct compressor compressor_gzip = {
  */
 
 #ifdef WITH_BZ2
-static void DPKG_ATTR_NORET
+static void
 decompress_bzip2(int fd_in, int fd_out, const char *desc)
 {
 	char buffer[4096];
@@ -242,11 +242,9 @@ decompress_bzip2(int fd_in, int fd_out, const char *desc)
 
 	if (close(fd_out))
 		ohshite(_("%s: internal bzip2 write error"), desc);
-
-	exit(0);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char buffer[4096];
@@ -294,17 +292,15 @@ compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 	 * be safe™. */
 	if (close(fd_out))
 		ohshite(_("%s: internal bzip2 write error"), desc);
-
-	exit(0);
 }
 #else
-static void DPKG_ATTR_NORET
+static void
 decompress_bzip2(int fd_in, int fd_out, const char *desc)
 {
 	fd_fd_filter(fd_in, fd_out, desc, BZIP2, "-dc", NULL);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char combuf[6];
@@ -326,13 +322,13 @@ struct compressor compressor_bzip2 = {
  * Xz compressor.
  */
 
-static void DPKG_ATTR_NORET
+static void
 decompress_xz(int fd_in, int fd_out, const char *desc)
 {
 	fd_fd_filter(fd_in, fd_out, desc, XZ, "-dc", NULL);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_xz(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char combuf[6];
@@ -353,13 +349,13 @@ struct compressor compressor_xz = {
  * Lzma compressor.
  */
 
-static void DPKG_ATTR_NORET
+static void
 decompress_lzma(int fd_in, int fd_out, const char *desc)
 {
 	fd_fd_filter(fd_in, fd_out, desc, XZ, "-dc", "--format=lzma", NULL);
 }
 
-static void DPKG_ATTR_NORET
+static void
 compress_lzma(int fd_in, int fd_out, int compress_level, const char *desc)
 {
 	char combuf[6];
@@ -427,8 +423,6 @@ decompress_filter(struct compressor *compressor, int fd_in, int fd_out,
 	va_end(args);
 
 	compressor->decompress(fd_in, fd_out, desc.buf);
-
-	exit(0);
 }
 
 void
@@ -451,6 +445,4 @@ compress_filter(struct compressor *compressor, int fd_in, int fd_out,
 		compressor = &compressor_none;
 
 	compressor->compress(fd_in, fd_out, compress_level, desc.buf);
-
-	exit(0);
 }

+ 4 - 6
lib/dpkg/compress.h

@@ -34,10 +34,8 @@ struct compressor {
 	const char *name;
 	const char *extension;
 	int default_level;
-	void (*compress)(int fd_in, int fd_out, int level, const char *desc)
-		DPKG_ATTR_NORET;
-	void (*decompress)(int fd_in, int fd_out, const char *desc)
-		DPKG_ATTR_NORET;
+	void (*compress)(int fd_in, int fd_out, int level, const char *desc);
+	void (*decompress)(int fd_in, int fd_out, const char *desc);
 };
 
 struct compressor compressor_none;
@@ -50,11 +48,11 @@ struct compressor *compressor_find_by_name(const char *name);
 struct compressor *compressor_find_by_extension(const char *name);
 
 void decompress_filter(struct compressor *comp, int fd_in, int fd_out,
-                       const char *desc, ...) DPKG_ATTR_NORET
+                       const char *desc, ...)
                        DPKG_ATTR_PRINTF(4);
 void compress_filter(struct compressor *comp, int fd_in, int fd_out,
                      int compress_level, const char *desc, ...)
-                     DPKG_ATTR_NORET DPKG_ATTR_PRINTF(5);
+                     DPKG_ATTR_PRINTF(5);
 
 DPKG_END_DECLS