X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=blobdiff_plain;f=tools%2Ffirmware-utils%2Fsrc%2Fjcgimage.c;h=354c26be19b2a242b9bb5509acfdd008c52f73ed;hp=7755eab1ed32ff9eca1f8dffb05429a35eed9e94;hb=c47a1a3527d988b637c1daee573cbe0170ef73c6;hpb=77dc6a2ae7c94ac3d496ebab589d4574ac7169d0 diff --git a/tools/firmware-utils/src/jcgimage.c b/tools/firmware-utils/src/jcgimage.c index 7755eab1ed..354c26be19 100644 --- a/tools/firmware-utils/src/jcgimage.c +++ b/tools/firmware-utils/src/jcgimage.c @@ -158,6 +158,20 @@ opensize(char *name, size_t *size) return fd; } +static time_t source_date_epoch = -1; +static void set_source_date_epoch() { + char *env = getenv("SOURCE_DATE_EPOCH"); + char *endptr = env; + errno = 0; + if (env && *env) { + source_date_epoch = strtoull(env, &endptr, 10); + if (errno || (endptr && *endptr != '\0')) { + fprintf(stderr, "Invalid SOURCE_DATE_EPOCH"); + exit(1); + } + } +} + /* * Write the JCG header */ @@ -167,6 +181,13 @@ mkjcgheader(struct jcg_header *h, size_t psize, char *version) uLong crc; uint16_t major = 0, minor = 0; void *payload = (void *)h + sizeof(*h); + time_t t; + + if (source_date_epoch != -1) { + t = source_date_epoch; + } else if ((time(&t) == (time_t)(-1))) { + err(1, "time call failed"); + } if (version != NULL) { if (sscanf(version, "%hu.%hu", &major, &minor) != 2) { @@ -177,7 +198,7 @@ mkjcgheader(struct jcg_header *h, size_t psize, char *version) memset(h, 0, sizeof(*h)); h->jh_magic = htonl(JH_MAGIC); h->jh_type = htonl(1); - h->jh_time = htonl(time(NULL)); + h->jh_time = htonl(t); h->jh_major = htons(major); h->jh_minor = htons(minor); @@ -303,6 +324,7 @@ main(int argc, char **argv) /* Make sure the headers have the right size */ assert(sizeof(struct jcg_header) == 512); assert(sizeof(struct uimage_header) == 64); + set_source_date_epoch(); while ((c = getopt(argc, argv, "o:k:f:u:v:h")) != -1) { switch (c) {