--- cc1111-2.9.0.orig/as/asranlib/asranlib.c +++ cc1111-2.9.0/as/asranlib/asranlib.c @@ -22,6 +22,8 @@ along with this program. If not, see #include #include +#include +#include #include "dbuf_string.h" #include "lkar.h" @@ -593,6 +595,47 @@ do_ranlib (const char *archive) char tmpfile[] = "arXXXXXX"; struct stat stat_buf; int can_stat; + time_t now; + char *endptr; + char *source_date_epoch; + unsigned long long 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 (1); + } + + if (endptr == source_date_epoch) + { + fprintf (stderr, "Environment variable $SOURCE_DATE_EPOCH: No digits were found: %s\n", endptr); + exit (1); + } + + if (*endptr != '\0') + { + fprintf (stderr, "Environment variable $SOURCE_DATE_EPOCH: Trailing garbage: %s\n", endptr); + exit (1); + } + + 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 (1); + } + + now = epoch; + } + else + now = time (NULL); #ifdef _WIN32 if (NULL == _mktemp (tmpfile) || NULL == (outfp = fopen (tmpfile, "wb"))) @@ -628,7 +671,7 @@ do_ranlib (const char *archive) symtab_size = 4 + 4 * nsym + str_length; - fprintf (outfp, ARMAG AR_SYMBOL_TABLE_NAME "%-12d%-6d%-6d%-8d%-10d" ARFMAG, (int) time (NULL), 0, 0, 0, symtab_size); + fprintf (outfp, ARMAG AR_SYMBOL_TABLE_NAME "%-12d%-6d%-6d%-8d%-10d" ARFMAG, (int) now, 0, 0, 0, symtab_size); if (symtab_size & 1) {