The following commit has been merged in the master branch:
commit 7a96597253e880b1ead816637250d7bc472b77b5
Author: Guillem Jover <[email protected]>
Date: Mon Nov 21 04:48:12 2011 +0100
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.
diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c
index e5d5b47..4247d38 100644
--- a/dpkg-deb/build.c
+++ b/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"));
diff --git a/dpkg-deb/dpkg-deb.h b/dpkg-deb/dpkg-deb.h
index 1605967..080a529 100644
--- a/dpkg-deb/dpkg-deb.h
+++ b/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"
diff --git a/dpkg-deb/extract.c b/dpkg-deb/extract.c
index 99362db..bb5bb28 100644
--- a/dpkg-deb/extract.c
+++ b/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);
}
diff --git a/dpkg-deb/main.c b/dpkg-deb/main.c
index 88f765c..d487eb5 100644
--- a/dpkg-deb/main.c
+++ b/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);
}
diff --git a/lib/dpkg/compress.c b/lib/dpkg/compress.c
index 5199439..cab49fe 100644
--- a/lib/dpkg/compress.c
+++ b/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)
diff --git a/lib/dpkg/compress.h b/lib/dpkg/compress.h
index 18f6573..94c4df7 100644
--- a/lib/dpkg/compress.h
+++ b/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);
diff --git a/lib/dpkg/libdpkg.Versions b/lib/dpkg/libdpkg.Versions
index d38f455..675a1d5 100644
--- a/lib/dpkg/libdpkg.Versions
+++ b/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;
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]