X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilctime.c;h=639724c4f9d503cfcd8e4b5d2a482aaa21523029;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=7619f99e63ed3042006e0a3177a6cf33c47e2c58;hpb=f814e303372b12686d4490d0ec94d670085dd216;p=silc.git diff --git a/lib/silcutil/silctime.c b/lib/silcutil/silctime.c index 7619f99e..639724c4 100644 --- a/lib/silcutil/silctime.c +++ b/lib/silcutil/silctime.c @@ -69,7 +69,8 @@ SilcInt64 silc_time_msec(void) { struct timeval curtime; silc_gettimeofday(&curtime); - return (curtime.tv_sec * 1000) + (curtime.tv_usec / 1000); + return (curtime.tv_sec * (SilcUInt64)1000) + + (curtime.tv_usec / (SilcUInt64)1000); } /* Return time since Epoch in microseconds */ @@ -78,7 +79,7 @@ SilcInt64 silc_time_usec(void) { struct timeval curtime; silc_gettimeofday(&curtime); - return (curtime.tv_sec * 1000000) + curtime.tv_usec; + return (curtime.tv_sec * (SilcUInt64)1000000) + curtime.tv_usec; } /* Returns time as string */ @@ -104,9 +105,10 @@ const char *silc_time_string(SilcInt64 time_val) SilcBool silc_time_value(SilcInt64 time_val, SilcTime ret_time) { - struct tm *time; + struct tm *t; unsigned int msec = 0; time_t timeval; + SilcInt32 ctz = 0; if (!ret_time) return TRUE; @@ -114,21 +116,21 @@ SilcBool silc_time_value(SilcInt64 time_val, SilcTime ret_time) if (!time_val) time_val = silc_time_msec(); - msec = time_val % 1000; - time_val /= 1000; + msec = (SilcUInt64)time_val % (SilcUInt64)1000; + timeval = (time_t)((SilcUInt64)time_val / (SilcUInt64)1000); - time = localtime(&timeval); - if (!time) + t = localtime(&timeval); + if (!t) return FALSE; - time_val = timeval; memset(ret_time, 0, sizeof(*ret_time)); - if (!silc_time_fill(ret_time, time->tm_year + 1900, time->tm_mon + 1, - time->tm_mday, time->tm_hour, time->tm_min, - time->tm_sec, msec)) + if (!silc_time_fill(ret_time, t->tm_year + 1900, t->tm_mon + 1, + t->tm_mday, t->tm_hour, t->tm_min, + t->tm_sec, msec)) return FALSE; - ret_time->dst = time->tm_isdst ? 1 : 0; + ret_time->dst = t->tm_isdst ? 1 : 0; + #ifdef SILC_WIN32 ret_time->utc_east = _timezone < 0 ? 1 : 0; ret_time->utc_hour = (ret_time->utc_east ? (-(_timezone)) / 3600 : @@ -136,15 +138,54 @@ SilcBool silc_time_value(SilcInt64 time_val, SilcTime ret_time) ret_time->utc_minute = (ret_time->utc_east ? (-(_timezone)) % 3600 : _timezone % 3600); #else -#if defined(HAVE_TZSET) +#if defined(HAVE_TIMEZONE) ret_time->utc_east = timezone < 0 ? 1 : 0; - ret_time->utc_hour = (ret_time->utc_east ? (-(timezone)) / 3600 : - timezone / 3600); - ret_time->utc_minute = (ret_time->utc_east ? (-(timezone)) % 3600 : - timezone % 3600); -#endif /* HAVE_TZSET */ + ctz = timezone; + if (ret_time->dst) + ctz -= 3600; +#elif defined(HAVE_TM_GMTOFF) + ret_time->utc_east = t->tm_gmtoff > 0 ? 1 : 0; + ctz = -t->tm_gmtoff; +#elif defined(HAVE___TM_GMTOFF) + ret_time->utc_east = t->__tm_gmtoff > 0 ? 1 : 0; + ctz = -t->__tm_gmtoff; +#elif defined(HAVE___TM_GMTOFF__) + ret_time->utc_east = t->__tm_gmtoff__ > 0 ? 1 : 0; + ctz = -t->__tm_gmtoff__; +#endif /* HAVE_TIMEZONE */ + + ret_time->utc_hour = (ret_time->utc_east ? (-(ctz)) / 3600 : ctz / 3600); + ret_time->utc_minute = (ret_time->utc_east ? (-(ctz)) % 3600 : ctz % 3600); #endif /* SILC_WIN32 */ + if (ret_time->utc_minute) + ret_time->utc_minute /= 60; + + return TRUE; +} + +/* Returns timezone */ + +SilcBool silc_timezone(char *timezone, SilcUInt32 timezone_size) +{ + SilcTimeStruct curtime; + + if (timezone_size < 6) + return FALSE; + + if (!silc_time_value(0, &curtime)) + return FALSE; + + if (!curtime.utc_hour && curtime.utc_minute) + silc_snprintf(timezone, timezone_size, "Z"); + else if (curtime.utc_minute) + silc_snprintf(timezone, timezone_size, "%c%02d:%02d", + curtime.utc_east ? '+' : '-', curtime.utc_hour, + curtime.utc_minute); + else + silc_snprintf(timezone, timezone_size, "%c%02d", + curtime.utc_east ? '+' : '-', curtime.utc_hour); + return TRUE; } @@ -356,13 +397,10 @@ SilcBool silc_time_generalized_string(SilcTime time_val, char *ret_string, /* Return TRUE if `smaller' is smaller than `bigger'. */ -SilcBool silc_compare_timeval(struct timeval *smaller, - struct timeval *bigger) +int silc_compare_timeval(struct timeval *t1, struct timeval *t2) { - if ((smaller->tv_sec < bigger->tv_sec) || - ((smaller->tv_sec == bigger->tv_sec) && - (smaller->tv_usec < bigger->tv_usec))) - return TRUE; - - return FALSE; + SilcInt32 s = t1->tv_sec - t2->tv_sec; + if (!s) + return t1->tv_usec - t2->tv_usec; + return s; }