Bring in the following changes from NetBSD. See the discussion at:

http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=44128

1.29
"Don't printf time_t with %d; fixes PR 44128 from yamt. With this change it
successfully prints mtimes after 2038."

1.30
"Improve previous with comments."

Obtained from:	dholland@NetBSD.org (both)
This commit is contained in:
Doug Barton 2010-12-05 21:53:12 +00:00
parent d7233fd615
commit da78facc72
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216207

View file

@ -30,7 +30,7 @@
#include <sys/cdefs.h>
#if 0
#ifndef lint
__RCSID("$NetBSD: stat.c,v 1.28 2009/04/13 23:02:36 lukem Exp $");
__RCSID("$NetBSD: stat.c,v 1.30 2010/11/25 04:33:30 dholland Exp $");
#endif
#endif
@ -728,7 +728,6 @@ format1(const struct stat *st,
ts = *tsp; /* copy so we can muck with it */
small = (sizeof(ts.tv_sec) == 4);
data = ts.tv_sec;
small = 1;
tm = localtime(&ts.tv_sec);
(void)strftime(path, sizeof(path), timefmt, tm);
sdata = path;
@ -951,8 +950,9 @@ format1(const struct stat *st,
(void)snprintf(tmp, sizeof(tmp), "%d", size);
(void)strcat(lfmt, tmp);
}
(void)strcat(lfmt, "d");
return (snprintf(buf, blen, lfmt, ts.tv_sec));
(void)strcat(lfmt, "lld");
return (snprintf(buf, blen, lfmt,
(long long)ts.tv_sec));
}
/*
@ -975,7 +975,8 @@ format1(const struct stat *st,
(void)snprintf(tmp, sizeof(tmp), "%d", size);
(void)strcat(lfmt, tmp);
}
(void)strcat(lfmt, "d");
/* Seconds: time_t cast to long long. */
(void)strcat(lfmt, "lld");
/*
* The stuff after the decimal point always needs zero
@ -986,8 +987,10 @@ format1(const struct stat *st,
/*
* We can "print" at most nine digits of precision. The
* rest we will pad on at the end.
*
* Nanoseconds: long.
*/
(void)snprintf(tmp, sizeof(tmp), "%dd", prec > 9 ? 9 : prec);
(void)snprintf(tmp, sizeof(tmp), "%dld", prec > 9 ? 9 : prec);
(void)strcat(lfmt, tmp);
/*
@ -1001,7 +1004,7 @@ format1(const struct stat *st,
* Use the format, and then tack on any zeroes that
* might be required to make up the requested precision.
*/
l = snprintf(buf, blen, lfmt, ts.tv_sec, ts.tv_nsec);
l = snprintf(buf, blen, lfmt, (long long)ts.tv_sec, ts.tv_nsec);
for (; prec > 9 && l < (int)blen; prec--, l++)
(void)strcat(buf, "0");
return (l);