71 lines
2.1 KiB
Diff
71 lines
2.1 KiB
Diff
|
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 */
|