1#include "time_impl.h" 2#include <errno.h> 3 4time_t mktime(struct tm *tm) 5{ 6 struct tm new; 7 long opp; 8 long long t = __tm_to_secs(tm); 9 10 __secs_to_zone(t, 1, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); 11 12 if (tm->tm_isdst>=0 && new.tm_isdst!=tm->tm_isdst) 13 t -= opp - new.__tm_gmtoff; 14 15 t -= new.__tm_gmtoff; 16 if ((time_t)t != t) goto error; 17 18 __secs_to_zone(t, 0, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); 19 20 if (__secs_to_tm(t + new.__tm_gmtoff, &new) < 0) goto error; 21 22 *tm = new; 23 return t; 24 25error: 26 errno = EOVERFLOW; 27 return -1; 28} 29