localtime_r.c 580 B

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