File: 12_make_the_output_of_mkbindic_reproducible.patch

package info (click to toggle)
canna 3.7p3-26
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,716 kB
  • sloc: ansic: 86,730; sh: 2,773; yacc: 403; cpp: 389; lex: 379; makefile: 59; awk: 7
file content (61 lines) | stat: -rw-r--r-- 2,176 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Description: make the output of mkbindic reproducible.
Author: Chris Lamb <lamby@debian.org>
Bug-Debian: https://bugs.debian.org/861955
Forwarded: no
Reviewed-By: Francisco Vilmar Cardoso Ruviaro <francisco.ruviaro@riseup.net>
Last-Update: 2020-08-17

--- canna.orig/cmd/crxdic/crxdic.c
+++ canna/cmd/crxdic/crxdic.c
@@ -31,6 +31,7 @@ static char rcsid[]="@(#) 102.1 $Id: crx
 #include <time.h>
 #include <ctype.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <assert.h>
 #include "ccompat.h"
 #include "RKindep/file.h"
@@ -932,6 +933,9 @@ makeHeader(dic)
   unsigned		i;
   RkiCksumCalc		calc;
   unsigned		off;
+  char *source_date_epoch;
+  unsigned long long epoch;
+  char *endptr;
     
   if (RkiCksumCRCInit(&calc)
       || RkiCksumAdd(&calc, dic->Dir->buf, dic->Dir->dirsiz)) {
@@ -963,7 +967,32 @@ makeHeader(dic)
     hd.data[HD_CMPV].var = 0x300702L;
     hd.flag[HD_CMPV] = -1;
   }
-  hd.data[HD_TIME].var = tloc = time(0);
+  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)) {
+            fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: strtoull: %s\n", strerror(errno));
+            exit(EXIT_FAILURE);
+    }
+    if (endptr == source_date_epoch) {
+            fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: No digits were found: %s\n", endptr);
+            exit(EXIT_FAILURE);
+    }
+    if (*endptr != '\0') {
+            fprintf(stderr, "Environment variable $SOURCE_DATE_EPOCH: Trailing garbage: %s\n", endptr);
+            exit(EXIT_FAILURE);
+    }
+    if (epoch > ULONG_MAX) {
+            fprintf(stderr, "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(EXIT_FAILURE);
+    }
+    tloc = epoch;
+  } else {
+    tloc = time(0);
+  }
+  hd.data[HD_TIME].var = tloc;
   hd.flag[HD_TIME] = -1;
   hd.data[HD_DMNM].ptr = (unsigned char *)STrdup(dic->name);
   hd.flag[HD_DMNM] = strlen(dic->name);