diff options
Diffstat (limited to 'gnu/packages/patches/ttfautohint-source-date-epoch.patch')
-rw-r--r-- | gnu/packages/patches/ttfautohint-source-date-epoch.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gnu/packages/patches/ttfautohint-source-date-epoch.patch b/gnu/packages/patches/ttfautohint-source-date-epoch.patch new file mode 100644 index 0000000000..e42fdbf6b0 --- /dev/null +++ b/gnu/packages/patches/ttfautohint-source-date-epoch.patch @@ -0,0 +1,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 */ |