Selaa lähdekoodia

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 vuotta sitten
vanhempi
commit
7a96597253
7 muutettua tiedostoa jossa 69 lisäystä ja 50 poistoa
  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;