summary refs log tree commit diff
path: root/gnu/packages/patches/ttfautohint-source-date-epoch.patch
blob: e42fdbf6b0ae228a6bd4eeaaba0aee150e602dc3 (plain) (blame)
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
62
63
64
65
66
67
68
69
70
Honour an external definition of SOURCE_DATE_EPOCH when updating the embedded
modification date in TTF/TTC files.

--- a/lib/tatime.c
+++ b/lib/tatime.c
@@ -15,6 +15,8 @@
 
 #include <time.h>
 #include <stdint.h>
+#include <errno.h>
+#include <limits.h>
 
 #include "ta.h"
 
@@ -27,12 +29,51 @@ TA_get_current_time(FT_ULong* high,
 {
   /* there have been 24107 days between January 1st, 1904 (the epoch of */
   /* OpenType), and January 1st, 1970 (the epoch of the `time' function) */
-  TA_ULongLong seconds_to_1970 = 24107 * 24 * 60 * 60;
-  TA_ULongLong seconds_to_today = seconds_to_1970 + (TA_ULongLong)time(NULL);
+  const TA_ULongLong seconds_to_1970 = 24107 * 24 * 60 * 60;
+  TA_ULongLong seconds_to_build;
 
+  time_t now;
+  char *source_date_epoch, *endptr;
+  TA_ULongLong epoch;
+  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);
+    }
+    now = epoch;
+  } else {
+    now = time(NULL);
+  }
 
-  *high = (FT_ULong)(seconds_to_today >> 32);
-  *low = (FT_ULong)seconds_to_today;
+  seconds_to_build = seconds_to_1970 + (TA_ULongLong)now;
+
+  *high = (FT_ULong)(seconds_to_build >> 32);
+  *low = (FT_ULong)seconds_to_build;
 }
 
 /* end of tatime.c */