summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog2
-rw-r--r--dpkg-split/split.c24
-rw-r--r--man/dpkg-split.man6
3 files changed, 32 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index d49a4645d..1e18c99f5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,8 @@ dpkg (1.18.11) UNRELEASED; urgency=medium
name affected.
* Do not emit epochs for unambiguous versions in deb-split package header.
Regression introduced in dpkg 1.18.0.
+ * Make the deb-split(5) generation in dpkg-split reproducible, by using the
+ timestamp from SOURCE_DATE_EPOCH.
* Perl modules:
- Obsolete Source-Version substvar in Dpkg::Substvars by emitting errors.
* Packaging:
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);
diff --git a/man/dpkg-split.man b/man/dpkg-split.man
index 99240ed04..f45bc5135 100644
--- a/man/dpkg-split.man
+++ b/man/dpkg-split.man
@@ -215,6 +215,12 @@ a file that looked like a package part file but was corrupted, or
interactions with the system, such as accesses to the database,
memory allocations, etc.
.
+.SH ENVIRONMENT
+.TP
+.B SOURCE_DATE_EPOCH
+If set, it will be used as the timestamp (as seconds since the epoch) in
+the \fBdeb\-split\fP(5)'s \fBar\fP(5) container.
+.
.SH FILES
.TP
.I %ADMINDIR%/parts