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

libdpkg: Do not expose the compression structs

This reduces the amount of relocations on the future shared libdpkg
library. It also makes it easier to refactor the code.
Guillem Jover лет назад: 14
Родитель
Сommit
7a96597253
7 измененных файлов с 69 добавлено и 50 удалено
  1. 3 2
      dpkg-deb/build.c
  2. 1 1
      dpkg-deb/dpkg-deb.h
  3. 2 2
      dpkg-deb/extract.c
  4. 2 2
      dpkg-deb/main.c
  5. 48 24
      lib/dpkg/compress.c
  6. 12 15
      lib/dpkg/compress.h
  7. 1 4
      lib/dpkg/libdpkg.Versions

+ 3 - 2
dpkg-deb/build.c

@@ -475,7 +475,7 @@ do_build(const char *const *argv)
   /* And run gzip to compress our control archive. */
   c2 = subproc_fork();
   if (!c2) {
-    compress_filter(&compressor_gzip, p1[0], gzfd, 9, _("control member"));
+    compress_filter(compressor_type_gzip, p1[0], gzfd, 9, _("control member"));
     exit(0);
   }
   close(p1[0]);
@@ -588,7 +588,8 @@ do_build(const char *const *argv)
   if (!oldformatflag) {
     char datamember[16 + 1];
 
-    sprintf(datamember, "%s%s", DATAMEMBER, compressor->extension);
+    sprintf(datamember, "%s%s", DATAMEMBER,
+            compressor_get_extension(compressor));
 
     if (lseek(gzfd, 0, SEEK_SET))
       ohshite(_("failed to rewind temporary file (%s)"), _("data member"));

+ 1 - 1
dpkg-deb/dpkg-deb.h

@@ -39,7 +39,7 @@ void extracthalf(const char *debar, const char *dir,
                  const char *taroption, int admininfo);
 
 extern const char* showformat;
-extern struct compressor *compressor;
+extern enum compressor_type compressor;
 extern int compress_level;
 
 #define ARCHIVEVERSION		"2.0"

+ 2 - 2
dpkg-deb/extract.c

@@ -118,7 +118,7 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
   char nlc;
   int adminmember;
   bool oldformat, header_done;
-  struct compressor *decompressor = &compressor_gzip;
+  enum compressor_type decompressor = compressor_type_gzip;
 
   arfd = open(debar, O_RDONLY);
   if (arfd < 0)
@@ -190,7 +190,7 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
 	    decompressor = compressor_find_by_extension(extension);
 	  }
 
-          if (adminmember == -1 || decompressor == NULL)
+          if (adminmember == -1 || decompressor == compressor_type_unknown)
             ohshit(_("archive '%.250s' contains not understood data member %.*s, giving up"),
                    debar, (int)sizeof(arh.ar_name), arh.ar_name);
         }

+ 2 - 2
dpkg-deb/main.c

@@ -134,7 +134,7 @@ static const char printforhelp[] =
 
 int debugflag=0, nocheckflag=0, oldformatflag=BUILDOLDPKGFORMAT;
 int opt_verbose = 0;
-struct compressor *compressor = &compressor_gzip;
+enum compressor_type compressor = compressor_type_gzip;
 int compress_level = -1;
 
 static void
@@ -157,7 +157,7 @@ static void
 setcompresstype(const struct cmdinfo *cip, const char *value)
 {
   compressor = compressor_find_by_name(value);
-  if (compressor == NULL)
+  if (compressor == compressor_type_unknown)
     ohshit(_("unknown compression type `%s'!"), value);
 }
 

+ 48 - 24
lib/dpkg/compress.c

@@ -73,6 +73,14 @@ fd_fd_filter(int fd_in, int fd_out, const char *desc, const char *file, ...)
 	subproc_wait_check(pid, desc, 0);
 }
 
+struct compressor {
+	const char *name;
+	const char *extension;
+	int default_level;
+	void (*compress)(int fd_in, int fd_out, int level, const char *desc);
+	void (*decompress)(int fd_in, int fd_out, const char *desc);
+};
+
 /*
  * No compressor (pass-through).
  */
@@ -89,7 +97,7 @@ 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);
 }
 
-struct compressor compressor_none = {
+static struct compressor compressor_none = {
 	.name = "none",
 	.extension = "",
 	.default_level = 0,
@@ -197,7 +205,7 @@ compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 }
 #endif
 
-struct compressor compressor_gzip = {
+static struct compressor compressor_gzip = {
 	.name = "gzip",
 	.extension = ".gz",
 	.default_level = 9,
@@ -310,7 +318,7 @@ compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 }
 #endif
 
-struct compressor compressor_bzip2 = {
+static struct compressor compressor_bzip2 = {
 	.name = "bzip2",
 	.extension = ".bz2",
 	.default_level = 9,
@@ -337,7 +345,7 @@ compress_xz(int fd_in, int fd_out, int compress_level, const char *desc)
 	fd_fd_filter(fd_in, fd_out, desc, XZ, combuf, NULL);
 }
 
-struct compressor compressor_xz = {
+static struct compressor compressor_xz = {
 	.name = "xz",
 	.extension = ".xz",
 	.default_level = 6,
@@ -364,7 +372,7 @@ compress_lzma(int fd_in, int fd_out, int compress_level, const char *desc)
 	fd_fd_filter(fd_in, fd_out, desc, XZ, combuf, "--format=lzma", NULL);
 }
 
-struct compressor compressor_lzma = {
+static struct compressor compressor_lzma = {
 	.name = "lzma",
 	.extension = ".lzma",
 	.default_level = 6,
@@ -377,68 +385,84 @@ struct compressor compressor_lzma = {
  */
 
 static struct compressor *compressor_array[] = {
-	&compressor_none,
-	&compressor_gzip,
-	&compressor_xz,
-	&compressor_bzip2,
-	&compressor_lzma,
+	[compressor_type_none] = &compressor_none,
+	[compressor_type_gzip] = &compressor_gzip,
+	[compressor_type_xz] = &compressor_xz,
+	[compressor_type_bzip2] = &compressor_bzip2,
+	[compressor_type_lzma] = &compressor_lzma,
 };
 
-struct compressor *
+static struct compressor *
+compressor_get(enum compressor_type type)
+{
+	const enum compressor_type max_type = array_count(compressor_array);
+
+	if (type < 0 || type >= max_type)
+		internerr("compressor_type is out of range");
+
+	return compressor_array[type];
+}
+
+const char *
+compressor_get_extension(enum compressor_type type)
+{
+	return compressor_get(type)->extension;
+}
+
+enum compressor_type
 compressor_find_by_name(const char *name)
 {
 	size_t i;
 
 	for (i = 0; i < array_count(compressor_array); i++)
 		if (strcmp(compressor_array[i]->name, name) == 0)
-			return compressor_array[i];
+			return i;
 
-	return NULL;
+	return compressor_type_unknown;
 }
 
-struct compressor *
+enum compressor_type
 compressor_find_by_extension(const char *extension)
 {
 	size_t i;
 
 	for (i = 0; i < array_count(compressor_array); i++)
 		if (strcmp(compressor_array[i]->extension, extension) == 0)
-			return compressor_array[i];
+			return i;
 
-	return NULL;
+	return compressor_type_unknown;
 }
 
 void
-decompress_filter(struct compressor *compressor, int fd_in, int fd_out,
+decompress_filter(enum compressor_type type, int fd_in, int fd_out,
                   const char *desc_fmt, ...)
 {
+	struct compressor *compressor;
 	va_list args;
 	struct varbuf desc = VARBUF_INIT;
 
-	if (compressor == NULL)
-		internerr("no compressor specified");
-
 	va_start(args, desc_fmt);
 	varbuf_vprintf(&desc, desc_fmt, args);
 	va_end(args);
 
+	compressor = compressor_get(type);
 	compressor->decompress(fd_in, fd_out, desc.buf);
 }
 
 void
-compress_filter(struct compressor *compressor, int fd_in, int fd_out,
+compress_filter(enum compressor_type type, int fd_in, int fd_out,
                 int compress_level, const char *desc_fmt, ...)
 {
+	struct compressor *compressor;
 	va_list args;
 	struct varbuf desc = VARBUF_INIT;
 
-	if (compressor == NULL)
-		internerr("no compressor specified");
-
 	va_start(args, desc_fmt);
 	varbuf_vprintf(&desc, desc_fmt, args);
 	va_end(args);
 
+	compressor = compressor_get(type);
+
 	if (compress_level < 0)
 		compress_level = compressor->default_level;
 	else if (compress_level == 0)

+ 12 - 15
lib/dpkg/compress.h

@@ -30,27 +30,24 @@ DPKG_BEGIN_DECLS
 #define XZ		"xz"
 #define BZIP2		"bzip2"
 
-struct compressor {
-	const char *name;
-	const char *extension;
-	int default_level;
-	void (*compress)(int fd_in, int fd_out, int level, const char *desc);
-	void (*decompress)(int fd_in, int fd_out, const char *desc);
+enum compressor_type {
+	compressor_type_unknown = -1,
+	compressor_type_none,
+	compressor_type_gzip,
+	compressor_type_xz,
+	compressor_type_bzip2,
+	compressor_type_lzma,
 };
 
-struct compressor compressor_none;
-struct compressor compressor_gzip;
-struct compressor compressor_xz;
-struct compressor compressor_bzip2;
-struct compressor compressor_lzma;
+enum compressor_type compressor_find_by_name(const char *name);
+enum compressor_type compressor_find_by_extension(const char *name);
 
-struct compressor *compressor_find_by_name(const char *name);
-struct compressor *compressor_find_by_extension(const char *name);
+const char *compressor_get_extension(enum compressor_type type);
 
-void decompress_filter(struct compressor *comp, int fd_in, int fd_out,
+void decompress_filter(enum compressor_type type, int fd_in, int fd_out,
                        const char *desc, ...)
                        DPKG_ATTR_PRINTF(4);
-void compress_filter(struct compressor *comp, int fd_in, int fd_out,
+void compress_filter(enum compressor_type type, int fd_in, int fd_out,
                      int compress_level, const char *desc, ...)
                      DPKG_ATTR_PRINTF(5);
 

+ 1 - 4
lib/dpkg/libdpkg.Versions

@@ -123,12 +123,9 @@ LIBDPKG_PRIVATE {
 	setcloexec;
 
 	# Compression support
-	compressor_gzip;	# XXX variable, do not export
-	compressor_xz;		# XXX variable, do not export
-	compressor_bzip2;	# XXX variable, do not export
-	compressor_lzma;	# XXX variable, do not export
 	compressor_find_by_name;
 	compressor_find_by_extension;
+	compressor_get_extension;
 	compress_filter;
 	decompress_filter;