File reproducible.patch of Package dc3dd

Index: root/osc/openSUSE:Factory/dc3dd/dc3dd-7.2.641/man/help2man
===================================================================
--- dc3dd-7.2.641/man/help2man
+++ dc3dd-7.2.641/man/help2man
@@ -242,7 +242,7 @@ $version_text ||= get_option_value $ARGV
 # the English version expands to the month as a word and the full year.  It
 # is used on the footer of the generated manual pages.  If in doubt, you may
 # just use %x as the value (which should be the full locale-specific date).
-my $date = enc strftime _("%B %Y"), localtime;
+my $date = enc strftime _("%B %Y"), gmtime($ENV{SOURCE_DATE_EPOCH} || time);
 (my $program = $ARGV[0]) =~ s!.*/!!;
 my $package = $program;
 my $version;
Index: root/osc/openSUSE:Factory/dc3dd/dc3dd-7.2.641/src/dc3dd.c
===================================================================
--- dc3dd-7.2.641/src/dc3dd.c
+++ dc3dd-7.2.641/src/dc3dd.c
@@ -637,13 +637,48 @@ report_error(int status, int errnum, con
       usage(status); 
 }
 
+time_t reproducible_time()
+{
+   time_t now;
+   char *source_date_epoch;
+   unsigned long long epoch;
+   char *endptr;
+
+   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);
+   }
+   return now;
+}
+
 // End code copied (and modified) from ../lib/error.c 
 
 static char*
 get_formatted_time_string()
 {
    // Get the current local time.
-   time_t t = time(NULL);
+   time_t t = reproducible_time();
    struct tm tm;
    struct tm* ret = localtime_r(&t, &tm);
    if (ret == NULL)