xref: /aosp_15_r20/external/musl/src/time/localtime_r.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "time_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include <limits.h>
4*c9945492SAndroid Build Coastguard Worker 
__localtime_r(const time_t * restrict t,struct tm * restrict tm)5*c9945492SAndroid Build Coastguard Worker struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	/* Reject time_t values whose year would overflow int because
8*c9945492SAndroid Build Coastguard Worker 	 * __secs_to_zone cannot safely handle them. */
9*c9945492SAndroid Build Coastguard Worker 	if (*t < INT_MIN * 31622400LL || *t > INT_MAX * 31622400LL) {
10*c9945492SAndroid Build Coastguard Worker 		errno = EOVERFLOW;
11*c9945492SAndroid Build Coastguard Worker 		return 0;
12*c9945492SAndroid Build Coastguard Worker 	}
13*c9945492SAndroid Build Coastguard Worker 	__secs_to_zone(*t, 0, &tm->tm_isdst, &tm->__tm_gmtoff, 0, &tm->__tm_zone);
14*c9945492SAndroid Build Coastguard Worker 	if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) {
15*c9945492SAndroid Build Coastguard Worker 		errno = EOVERFLOW;
16*c9945492SAndroid Build Coastguard Worker 		return 0;
17*c9945492SAndroid Build Coastguard Worker 	}
18*c9945492SAndroid Build Coastguard Worker 	return tm;
19*c9945492SAndroid Build Coastguard Worker }
20*c9945492SAndroid Build Coastguard Worker 
21*c9945492SAndroid Build Coastguard Worker weak_alias(__localtime_r, localtime_r);
22