* gnu/packages/fontutils.scm (ttfautohint): New variable. * gnu/packages/patches/ttfautohint-source-date-epoch.patch: New patch. * gnu-system.am (dist_patch_DATA): Add it.
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			70 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 */
 |