firmware-utils: mkdlinkfw: create reproducible header
authorMathias Kresin <dev@kresin.me>
Sat, 5 Jan 2019 06:34:02 +0000 (07:34 +0100)
committerMathias Kresin <dev@kresin.me>
Sun, 13 Jan 2019 17:31:10 +0000 (18:31 +0100)
Use the SOURCE_DATE_EPOCH environment variable if set instead of the
current time. The used timestamp matches the timestamp of the latest
commit this way and make the images reproducible.

Signed-off-by: Mathias Kresin <dev@kresin.me>
tools/firmware-utils/src/mkdlinkfw-lib.c

index a661c0bc821fc132d847098ddba504a21aa05bbb..3b71fda7db4196f42d69f07539667266ce23d0f9 100644 (file)
@@ -34,9 +34,24 @@ extern char *progname;
 
 uint32_t jboot_timestamp(void)
 {
-       time_t rawtime;
-       time(&rawtime);
-       return (((uint32_t) rawtime) - TIMESTAMP_MAGIC) >> 2;
+       char *env = getenv("SOURCE_DATE_EPOCH");
+       char *endptr = env;
+       time_t fixed_timestamp = -1;
+       errno = 0;
+
+       if (env && *env) {
+               fixed_timestamp = strtoull(env, &endptr, 10);
+
+               if (errno || (endptr && *endptr != '\0')) {
+                       fprintf(stderr, "Invalid SOURCE_DATE_EPOCH");
+                       fixed_timestamp = -1;
+               }
+       }
+
+       if (fixed_timestamp == -1)
+               time(&fixed_timestamp);
+
+       return (((uint32_t) fixed_timestamp) - TIMESTAMP_MAGIC) >> 2;
 }
 
 uint16_t jboot_checksum(uint16_t start_val, uint16_t *data, int size)