From 0ab12a8585373be2de5129e14d979c62e7a90d82 Mon Sep 17 00:00:00 2001 From: Chris Lamb Date: Mon, 21 Nov 2016 09:33:05 +0100 Subject: [PATCH] If SOURCE_DATE_EPOCH is set, override timestamps with that value. See https://reproducible-builds.org/specs/source-date-epoch/ for more information about this environment variable. Based on a patch by Alexander Couzens posted on https://sourceforge.net/p/squashfs/mailman/message/34673610/ Signed-off-by: Chris Lamb --- squashfs-tools/mksquashfs.c | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c index c2098bd..b49e956 100644 --- a/squashfs-tools/mksquashfs.c +++ b/squashfs-tools/mksquashfs.c @@ -137,6 +137,9 @@ unsigned int cache_bytes = 0, cache_size = 0, inode_count = 0; /* inode lookup table */ squashfs_inode *inode_lookup_table = NULL; +/* override filesystem creation time */ +time_t mkfs_fixed_time = -1; + /* in memory directory data */ #define I_COUNT_SIZE 128 #define DIR_ENTRIES 32 @@ -5104,6 +5107,9 @@ int main(int argc, char *argv[]) int total_mem = get_default_phys_mem(); int progress = TRUE; int force_progress = FALSE; + char *source_date_epoch, *endptr; + unsigned long long epoch; + struct file_buffer **fragment = NULL; if(argc > 1 && strcmp(argv[1], "-version") == 0) { @@ -5641,6 +5647,36 @@ printOptions: } } + /* if SOURCE_DATE_EPOCH is set, use that timestamp for the mkfs time */ + source_date_epoch = getenv("SOURCE_DATE_EPOCH"); + if(source_date_epoch) { + errno = 0; + epoch = strtoull(source_date_epoch, &endptr, 10); + if((errno == ERANGE && (epoch == ULLONG_MAX || epoch == 0)) + || (errno != 0 && epoch == 0)) { + ERROR("Environment variable $SOURCE_DATE_EPOCH: " + "strtoull: %s\n", strerror(errno)); + EXIT_MKSQUASHFS(); + } + if(endptr == source_date_epoch) { + ERROR("Environment variable $SOURCE_DATE_EPOCH: " + "No digits were found: %s\n", endptr); + EXIT_MKSQUASHFS(); + } + if(*endptr != '\0') { + ERROR("Environment variable $SOURCE_DATE_EPOCH: " + "Trailing garbage: %s\n", endptr); + EXIT_MKSQUASHFS(); + } + if(epoch > ULONG_MAX) { + ERROR("Environment variable $SOURCE_DATE_EPOCH: " + "value must be smaller than or equal to " + "%lu but was found to be: %llu \n", ULONG_MAX, epoch); + EXIT_MKSQUASHFS(); + } + mkfs_fixed_time = (time_t)epoch; + } + /* * Some compressors may need the options to be checked for validity * once all the options have been processed @@ -5993,7 +6029,7 @@ printOptions: sBlk.flags = SQUASHFS_MKFLAGS(noI, noD, noF, noX, no_fragments, always_use_fragments, duplicate_checking, exportable, no_xattrs, comp_opts); - sBlk.mkfs_time = time(NULL); + sBlk.mkfs_time = mkfs_fixed_time != -1 ? mkfs_fixed_time : time(NULL); disable_info(); -- 2.17.0