diff options
author | Guillem Jover <guillem@debian.org> | 2016-08-20 20:02:12 +0200 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2016-10-30 04:43:33 +0100 |
commit | 6e5862ef6ee8409eb686db526fe93b91aa8dcb1d (patch) | |
tree | 51c17906574c0f67c34490e11b06c20af397a0ab /dpkg-split | |
parent | 31d3ed62687e99d2a22a942aa6c83e579863192a (diff) | |
download | dpkg-6e5862ef6ee8409eb686db526fe93b91aa8dcb1d.tar.gz |
dpkg-split: Make the deb-split(5) generation reproducible
Honor SOURCE_DATE_EPOCH, so that we can control the output and generate
reproducible split packages.
Diffstat (limited to 'dpkg-split')
-rw-r--r-- | dpkg-split/split.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/dpkg-split/split.c b/dpkg-split/split.c index 08916cb9b..e197b22f2 100644 --- a/dpkg-split/split.c +++ b/dpkg-split/split.c @@ -26,6 +26,7 @@ #include <sys/stat.h> #include <sys/wait.h> +#include <errno.h> #include <limits.h> #include <fcntl.h> #include <libgen.h> @@ -89,6 +90,20 @@ deb_parse_control(const char *filename) return pkg; } +static time_t +parse_timestamp(const char *value) +{ + time_t timestamp; + char *end; + + errno = 0; + timestamp = strtol(value, &end, 10); + if (value == end || *end || errno != 0) + ohshite(_("unable to parse timestamp '%.255s'"), value); + + return timestamp; +} + /* Cleanup filename for use in crippled msdos systems. */ static char * clean_msdos_filename(char *filename) @@ -117,6 +132,8 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, struct dpkg_error err; int fd_src; struct stat st; + time_t timestamp; + const char *timestamp_str; const char *version; char hash[MD5HASHLEN + 1]; int nparts, curpart; @@ -143,6 +160,12 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, pkg = deb_parse_control(file_src); version = versiondescribe(&pkg->available.version, vdew_nonambig); + timestamp_str = getenv("SOURCE_DATE_EPOCH"); + if (timestamp_str) + timestamp = parse_timestamp(timestamp_str); + else + timestamp = time(NULL); + partsize = maxpartsize - HEADERALLOWANCE; last_partsize = st.st_size % partsize; if (last_partsize == 0) @@ -197,6 +220,7 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize, /* Split the data. */ ar = dpkg_ar_create(file_dst.buf, 0644); + dpkg_ar_set_mtime(ar, timestamp); /* Write the ar header. */ dpkg_ar_put_magic(ar); |