X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilctime.c;h=639724c4f9d503cfcd8e4b5d2a482aaa21523029;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=3f1abe7e871cb1344a09fd48def30383a58eafd6;hpb=6ba84e37f29fe938e1872a448dba3dc746b239d1;p=silc.git diff --git a/lib/silcutil/silctime.c b/lib/silcutil/silctime.c index 3f1abe7e..639724c4 100644 --- a/lib/silcutil/silctime.c +++ b/lib/silcutil/silctime.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2003 - 2006 Pekka Riikonen + Copyright (C) 2003 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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,8 +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; @@ -113,20 +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((time_t *)&time_val); - if (!time) + t = localtime(&timeval); + if (!t) return FALSE; 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 : @@ -134,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; } @@ -209,7 +252,7 @@ SilcBool silc_time_universal_string(SilcTime time_val, char *ret_string, { int ret, len = 0; memset(ret_string, 0, ret_string_size); - ret = snprintf(ret_string, ret_string_size - 1, + ret = silc_snprintf(ret_string, ret_string_size - 1, "%02u%02u%02u%02u%02u%02u", time_val->year % 100, time_val->month, time_val->day, time_val->hour, time_val->minute, time_val->second); @@ -218,12 +261,12 @@ SilcBool silc_time_universal_string(SilcTime time_val, char *ret_string, len += ret; if (!time_val->utc_hour && !time_val->utc_minute) { - ret = snprintf(ret_string + len, ret_string_size - 1 - len, "Z"); + ret = silc_snprintf(ret_string + len, ret_string_size - 1 - len, "Z"); if (ret < 0) return FALSE; len += ret; } else { - ret = snprintf(ret_string + len, ret_string_size - 1 - len, + ret = silc_snprintf(ret_string + len, ret_string_size - 1 - len, "%c%02u%02u", time_val->utc_east ? '+' : '-', time_val->utc_hour, time_val->utc_minute); if (ret < 0) @@ -319,7 +362,7 @@ SilcBool silc_time_generalized_string(SilcTime time_val, char *ret_string, { int len = 0, ret; memset(ret_string, 0, ret_string_size); - ret = snprintf(ret_string, ret_string_size - 1, + ret = silc_snprintf(ret_string, ret_string_size - 1, "%04u%02u%02u%02u%02u%02u", time_val->year, time_val->month, time_val->day, time_val->hour, time_val->minute, time_val->second); @@ -328,7 +371,7 @@ SilcBool silc_time_generalized_string(SilcTime time_val, char *ret_string, len += ret; if (time_val->msecond) { - ret = snprintf(ret_string + len, ret_string_size - 1 - len, + ret = silc_snprintf(ret_string + len, ret_string_size - 1 - len, ".%lu", (unsigned long)time_val->msecond); if (ret < 0) return FALSE; @@ -336,12 +379,12 @@ SilcBool silc_time_generalized_string(SilcTime time_val, char *ret_string, } if (!time_val->utc_hour && !time_val->utc_minute) { - ret = snprintf(ret_string + len, ret_string_size - 1 - len, "Z"); + ret = silc_snprintf(ret_string + len, ret_string_size - 1 - len, "Z"); if (ret < 0) return FALSE; len += ret; } else { - ret = snprintf(ret_string + len, ret_string_size - 1 - len, + ret = silc_snprintf(ret_string + len, ret_string_size - 1 - len, "%c%02u%02u", time_val->utc_east ? '+' : '-', time_val->utc_hour, time_val->utc_minute); if (ret < 0) @@ -354,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; }