From daa2d8bd1f724a0016a4542a2038186e2d6b82bc Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 11 Feb 2005 19:31:48 +0000 Subject: r5342: Reformat some very old code. Jeremy. (This used to be commit 08553faeeb77aef46264f4dfe738bc202e87ea23) --- source3/lib/time.c | 537 ++++++++++++++++++++++++++++------------------------- 1 file changed, 281 insertions(+), 256 deletions(-) (limited to 'source3/lib/time.c') diff --git a/source3/lib/time.c b/source3/lib/time.c index e7b537151f..5d7628c9d3 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -56,8 +56,9 @@ time_t get_time_t_max(void) } /******************************************************************* -a gettimeofday wrapper + A gettimeofday wrapper. ********************************************************************/ + void GetTimeOfDay(struct timeval *tval) { #ifdef HAVE_GETTIMEOFDAY_TZ @@ -70,43 +71,45 @@ void GetTimeOfDay(struct timeval *tval) #define TM_YEAR_BASE 1900 /******************************************************************* -yield the difference between *A and *B, in seconds, ignoring leap seconds + Yield the difference between *A and *B, in seconds, ignoring leap seconds. ********************************************************************/ + static int tm_diff(struct tm *a, struct tm *b) { - int ay = a->tm_year + (TM_YEAR_BASE - 1); - int by = b->tm_year + (TM_YEAR_BASE - 1); - int intervening_leap_days = - (ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400); - int years = ay - by; - int days = 365*years + intervening_leap_days + (a->tm_yday - b->tm_yday); - int hours = 24*days + (a->tm_hour - b->tm_hour); - int minutes = 60*hours + (a->tm_min - b->tm_min); - int seconds = 60*minutes + (a->tm_sec - b->tm_sec); + int ay = a->tm_year + (TM_YEAR_BASE - 1); + int by = b->tm_year + (TM_YEAR_BASE - 1); + int intervening_leap_days = (ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400); + int years = ay - by; + int days = 365*years + intervening_leap_days + (a->tm_yday - b->tm_yday); + int hours = 24*days + (a->tm_hour - b->tm_hour); + int minutes = 60*hours + (a->tm_min - b->tm_min); + int seconds = 60*minutes + (a->tm_sec - b->tm_sec); - return seconds; + return seconds; } /******************************************************************* - return the UTC offset in seconds west of UTC, or 0 if it cannot be determined - ******************************************************************/ + Return the UTC offset in seconds west of UTC, or 0 if it cannot be determined. +******************************************************************/ + static int TimeZone(time_t t) { - struct tm *tm = gmtime(&t); - struct tm tm_utc; - if (!tm) - return 0; - tm_utc = *tm; - tm = localtime(&t); - if (!tm) - return 0; - return tm_diff(&tm_utc,tm); - + struct tm *tm = gmtime(&t); + struct tm tm_utc; + if (!tm) + return 0; + tm_utc = *tm; + tm = localtime(&t); + if (!tm) + return 0; + return tm_diff(&tm_utc,tm); } static BOOL done_serverzone_init; -/* Return the smb serverzone value */ +/******************************************************************* + Return the smb serverzone value. +******************************************************************/ static int get_serverzone(void) { @@ -127,7 +130,9 @@ static int get_serverzone(void) return serverzone; } -/* Re-read the smb serverzone value */ +/******************************************************************* + Re-read the smb serverzone value. +******************************************************************/ static struct timeval start_time_hires; @@ -161,175 +166,180 @@ void get_process_uptime(struct timeval *ret_time) } /******************************************************************* -return the same value as TimeZone, but it should be more efficient. + Return the same value as TimeZone, but it should be more efficient. -We keep a table of DST offsets to prevent calling localtime() on each -call of this function. This saves a LOT of time on many unixes. + We keep a table of DST offsets to prevent calling localtime() on each + call of this function. This saves a LOT of time on many unixes. -Updated by Paul Eggert + Updated by Paul Eggert ********************************************************************/ + static int TimeZoneFaster(time_t t) { - static struct dst_table {time_t start,end; int zone;} *tdt, *dst_table = NULL; - static int table_size = 0; - int i; - int zone = 0; + static struct dst_table {time_t start,end; int zone;} *tdt, *dst_table = NULL; + static int table_size = 0; + int i; + int zone = 0; - if (t == 0) t = time(NULL); + if (t == 0) + t = time(NULL); - /* Tunis has a 8 day DST region, we need to be careful ... */ + /* Tunis has a 8 day DST region, we need to be careful ... */ #define MAX_DST_WIDTH (365*24*60*60) #define MAX_DST_SKIP (7*24*60*60) - for (i=0;i= dst_table[i].start && t <= dst_table[i].end) break; - - if (i= dst_table[i].start && t <= dst_table[i].end) + break; + + if (i MAX_DST_SKIP*2) - t = dst_table[i].start - MAX_DST_SKIP; - else - t = low + (dst_table[i].start-low)/2; - if (TimeZone(t) == zone) - dst_table[i].start = t; - else - low = t; - } - - while (high-60*60 > dst_table[i].end) { - if (high - dst_table[i].end > MAX_DST_SKIP*2) - t = dst_table[i].end + MAX_DST_SKIP; - else - t = high - (high-dst_table[i].end)/2; - if (TimeZone(t) == zone) - dst_table[i].end = t; - else - high = t; - } + /* widen the new entry using two bisection searches */ + while (low+60*60 < dst_table[i].start) { + if (dst_table[i].start - low > MAX_DST_SKIP*2) + t = dst_table[i].start - MAX_DST_SKIP; + else + t = low + (dst_table[i].start-low)/2; + if (TimeZone(t) == zone) + dst_table[i].start = t; + else + low = t; + } + + while (high-60*60 > dst_table[i].end) { + if (high - dst_table[i].end > MAX_DST_SKIP*2) + t = dst_table[i].end + MAX_DST_SKIP; + else + t = high - (high-dst_table[i].end)/2; + if (TimeZone(t) == zone) + dst_table[i].end = t; + else + high = t; + } #if 0 DEBUG(1,("Added DST entry from %s ", asctime(localtime(&dst_table[i].start)))); DEBUG(1,("to %s (%d)\n",asctime(localtime(&dst_table[i].end)), dst_table[i].zone)); #endif - } - } - return zone; + } + } + return zone; } /**************************************************************************** - return the UTC offset in seconds west of UTC, adjusted for extra time offset - **************************************************************************/ + Return the UTC offset in seconds west of UTC, adjusted for extra time offset. +**************************************************************************/ + int TimeDiff(time_t t) { - return TimeZoneFaster(t) + 60*extra_time_offset; + return TimeZoneFaster(t) + 60*extra_time_offset; } - /**************************************************************************** - return the UTC offset in seconds west of UTC, adjusted for extra time - offset, for a local time value. If ut = lt + LocTimeDiff(lt), then - lt = ut - TimeDiff(ut), but the converse does not necessarily hold near - daylight savings transitions because some local times are ambiguous. - LocTimeDiff(t) equals TimeDiff(t) except near daylight savings transitions. - +**************************************************************************/ + Return the UTC offset in seconds west of UTC, adjusted for extra time + offset, for a local time value. If ut = lt + LocTimeDiff(lt), then + lt = ut - TimeDiff(ut), but the converse does not necessarily hold near + daylight savings transitions because some local times are ambiguous. + LocTimeDiff(t) equals TimeDiff(t) except near daylight savings transitions. +**************************************************************************/ + static int LocTimeDiff(time_t lte) { - time_t lt = lte - 60*extra_time_offset; - int d = TimeZoneFaster(lt); - time_t t = lt + d; + time_t lt = lte - 60*extra_time_offset; + int d = TimeZoneFaster(lt); + time_t t = lt + d; - /* if overflow occurred, ignore all the adjustments so far */ - if (((lte < lt) ^ (extra_time_offset < 0)) | ((t < lt) ^ (d < 0))) - t = lte; + /* if overflow occurred, ignore all the adjustments so far */ + if (((lte < lt) ^ (extra_time_offset < 0)) | ((t < lt) ^ (d < 0))) + t = lte; - /* now t should be close enough to the true UTC to yield the right answer */ - return TimeDiff(t); + /* now t should be close enough to the true UTC to yield the right answer */ + return TimeDiff(t); } - /**************************************************************************** -try to optimise the localtime call, it can be quite expensive on some machines + Try to optimise the localtime call, it can be quite expensive on some machines. ****************************************************************************/ + struct tm *LocalTime(time_t *t) { - time_t t2 = *t; + time_t t2 = *t; - t2 -= TimeDiff(t2); + t2 -= TimeDiff(t2); - return(gmtime(&t2)); + return(gmtime(&t2)); } #define TIME_FIXUP_CONSTANT (369.0*365.25*24*60*60-(3.0*24*60*60+6.0*60*60)) /**************************************************************************** -interpret an 8 byte "filetime" structure to a time_t -It's originally in "100ns units since jan 1st 1601" + Interpret an 8 byte "filetime" structure to a time_t + It's originally in "100ns units since jan 1st 1601" -It appears to be kludge-GMT (at least for file listings). This means -its the GMT you get by taking a localtime and adding the -serverzone. This is NOT the same as GMT in some cases. This routine -converts this to real GMT. + It appears to be kludge-GMT (at least for file listings). This means + its the GMT you get by taking a localtime and adding the + serverzone. This is NOT the same as GMT in some cases. This routine + converts this to real GMT. ****************************************************************************/ + time_t nt_time_to_unix(NTTIME *nt) { - double d; - time_t ret; - /* The next two lines are a fix needed for the - broken SCO compiler. JRA. */ - time_t l_time_min = TIME_T_MIN; - time_t l_time_max = TIME_T_MAX; + double d; + time_t ret; + /* The next two lines are a fix needed for the + broken SCO compiler. JRA. */ + time_t l_time_min = TIME_T_MIN; + time_t l_time_max = TIME_T_MAX; - if (nt->high == 0 || (nt->high == 0xffffffff && nt->low == 0xffffffff)) - return(0); + if (nt->high == 0 || (nt->high == 0xffffffff && nt->low == 0xffffffff)) + return(0); - d = ((double)nt->high)*4.0*(double)(1<<30); - d += (nt->low&0xFFF00000); - d *= 1.0e-7; + d = ((double)nt->high)*4.0*(double)(1<<30); + d += (nt->low&0xFFF00000); + d *= 1.0e-7; - /* now adjust by 369 years to make the secs since 1970 */ - d -= TIME_FIXUP_CONSTANT; + /* now adjust by 369 years to make the secs since 1970 */ + d -= TIME_FIXUP_CONSTANT; - if (d <= l_time_min) - return (l_time_min); + if (d <= l_time_min) + return (l_time_min); - if (d >= l_time_max) - return (l_time_max); + if (d >= l_time_max) + return (l_time_max); - ret = (time_t)(d+0.5); + ret = (time_t)(d+0.5); - /* this takes us from kludge-GMT to real GMT */ - ret -= get_serverzone(); - ret += LocTimeDiff(ret); + /* this takes us from kludge-GMT to real GMT */ + ret -= get_serverzone(); + ret += LocTimeDiff(ret); - return(ret); + return(ret); } /**************************************************************************** @@ -374,8 +384,9 @@ time_t nt_time_to_unix_abs(NTTIME *nt) } /**************************************************************************** -interprets an nt time into a unix time_t + Interprets an nt time into a unix time_t. ****************************************************************************/ + time_t interpret_long_date(char *p) { NTTIME nt; @@ -385,27 +396,25 @@ time_t interpret_long_date(char *p) } /**************************************************************************** -put a 8 byte filetime from a time_t -This takes real GMT as input and converts to kludge-GMT + Put a 8 byte filetime from a time_t + This takes real GMT as input and converts to kludge-GMT ****************************************************************************/ + void unix_to_nt_time(NTTIME *nt, time_t t) { double d; - if (t==0) - { + if (t==0) { nt->low = 0; nt->high = 0; return; } - if (t == TIME_T_MAX) - { + if (t == TIME_T_MAX) { nt->low = 0xffffffff; nt->high = 0x7fffffff; return; } - if (t == -1) - { + if (t == -1) { nt->low = 0xffffffff; nt->high = 0xffffffff; return; @@ -465,9 +474,10 @@ void unix_to_nt_time_abs(NTTIME *nt, time_t t) } /**************************************************************************** -take a Unix time and convert to an NTTIME structure and place in buffer -pointed to by p. + Take a Unix time and convert to an NTTIME structure and place in buffer + pointed to by p. ****************************************************************************/ + void put_long_date(char *p,time_t t) { NTTIME nt; @@ -477,181 +487,191 @@ void put_long_date(char *p,time_t t) } /**************************************************************************** -check if it's a null mtime + Check if it's a null mtime. ****************************************************************************/ + BOOL null_mtime(time_t mtime) { - if (mtime == 0 || mtime == (time_t)0xFFFFFFFF || mtime == (time_t)-1) - return(True); - return(False); + if (mtime == 0 || mtime == (time_t)0xFFFFFFFF || mtime == (time_t)-1) + return(True); + return(False); } /******************************************************************* - create a 16 bit dos packed date + Create a 16 bit dos packed date. ********************************************************************/ + static uint16 make_dos_date1(struct tm *t) { - uint16 ret=0; - ret = (((unsigned)(t->tm_mon+1)) >> 3) | ((t->tm_year-80) << 1); - ret = ((ret&0xFF)<<8) | (t->tm_mday | (((t->tm_mon+1) & 0x7) << 5)); - return(ret); + uint16 ret=0; + ret = (((unsigned)(t->tm_mon+1)) >> 3) | ((t->tm_year-80) << 1); + ret = ((ret&0xFF)<<8) | (t->tm_mday | (((t->tm_mon+1) & 0x7) << 5)); + return(ret); } /******************************************************************* - create a 16 bit dos packed time + Create a 16 bit dos packed time. ********************************************************************/ + static uint16 make_dos_time1(struct tm *t) { - uint16 ret=0; - ret = ((((unsigned)t->tm_min >> 3)&0x7) | (((unsigned)t->tm_hour) << 3)); - ret = ((ret&0xFF)<<8) | ((t->tm_sec/2) | ((t->tm_min & 0x7) << 5)); - return(ret); + uint16 ret=0; + ret = ((((unsigned)t->tm_min >> 3)&0x7) | (((unsigned)t->tm_hour) << 3)); + ret = ((ret&0xFF)<<8) | ((t->tm_sec/2) | ((t->tm_min & 0x7) << 5)); + return(ret); } /******************************************************************* - create a 32 bit dos packed date/time from some parameters - This takes a GMT time and returns a packed localtime structure + Create a 32 bit dos packed date/time from some parameters. + This takes a GMT time and returns a packed localtime structure. ********************************************************************/ + static uint32 make_dos_date(time_t unixdate) { - struct tm *t; - uint32 ret=0; + struct tm *t; + uint32 ret=0; - t = LocalTime(&unixdate); - if (!t) - return 0xFFFFFFFF; + t = LocalTime(&unixdate); + if (!t) + return 0xFFFFFFFF; - ret = make_dos_date1(t); - ret = ((ret&0xFFFF)<<16) | make_dos_time1(t); + ret = make_dos_date1(t); + ret = ((ret&0xFFFF)<<16) | make_dos_time1(t); - return(ret); + return(ret); } /******************************************************************* -put a dos date into a buffer (time/date format) -This takes GMT time and puts local time in the buffer + Put a dos date into a buffer (time/date format). + This takes GMT time and puts local time in the buffer. ********************************************************************/ + void put_dos_date(char *buf,int offset,time_t unixdate) { - uint32 x = make_dos_date(unixdate); - SIVAL(buf,offset,x); + uint32 x = make_dos_date(unixdate); + SIVAL(buf,offset,x); } /******************************************************************* -put a dos date into a buffer (date/time format) -This takes GMT time and puts local time in the buffer + Put a dos date into a buffer (date/time format). + This takes GMT time and puts local time in the buffer. ********************************************************************/ + void put_dos_date2(char *buf,int offset,time_t unixdate) { - uint32 x = make_dos_date(unixdate); - x = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16); - SIVAL(buf,offset,x); + uint32 x = make_dos_date(unixdate); + x = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16); + SIVAL(buf,offset,x); } /******************************************************************* -put a dos 32 bit "unix like" date into a buffer. This routine takes -GMT and converts it to LOCAL time before putting it (most SMBs assume -localtime for this sort of date) + Put a dos 32 bit "unix like" date into a buffer. This routine takes + GMT and converts it to LOCAL time before putting it (most SMBs assume + localtime for this sort of date) ********************************************************************/ + void put_dos_date3(char *buf,int offset,time_t unixdate) { - if (!null_mtime(unixdate)) - unixdate -= TimeDiff(unixdate); - SIVAL(buf,offset,unixdate); + if (!null_mtime(unixdate)) + unixdate -= TimeDiff(unixdate); + SIVAL(buf,offset,unixdate); } /******************************************************************* - interpret a 32 bit dos packed date/time to some parameters + Interpret a 32 bit dos packed date/time to some parameters. ********************************************************************/ + static void interpret_dos_date(uint32 date,int *year,int *month,int *day,int *hour,int *minute,int *second) { - uint32 p0,p1,p2,p3; + uint32 p0,p1,p2,p3; - p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF; - p2=((date&0xFF0000)>>16)&0xFF; p3=((date&0xFF000000)>>24)&0xFF; + p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF; + p2=((date&0xFF0000)>>16)&0xFF; p3=((date&0xFF000000)>>24)&0xFF; - *second = 2*(p0 & 0x1F); - *minute = ((p0>>5)&0xFF) + ((p1&0x7)<<3); - *hour = (p1>>3)&0xFF; - *day = (p2&0x1F); - *month = ((p2>>5)&0xFF) + ((p3&0x1)<<3) - 1; - *year = ((p3>>1)&0xFF) + 80; + *second = 2*(p0 & 0x1F); + *minute = ((p0>>5)&0xFF) + ((p1&0x7)<<3); + *hour = (p1>>3)&0xFF; + *day = (p2&0x1F); + *month = ((p2>>5)&0xFF) + ((p3&0x1)<<3) - 1; + *year = ((p3>>1)&0xFF) + 80; } /******************************************************************* - create a unix date (int GMT) from a dos date (which is actually in - localtime) + Create a unix date (int GMT) from a dos date (which is actually in + localtime). ********************************************************************/ + time_t make_unix_date(void *date_ptr) { - uint32 dos_date=0; - struct tm t; - time_t ret; + uint32 dos_date=0; + struct tm t; + time_t ret; - dos_date = IVAL(date_ptr,0); + dos_date = IVAL(date_ptr,0); - if (dos_date == 0) return(0); + if (dos_date == 0) + return(0); - interpret_dos_date(dos_date,&t.tm_year,&t.tm_mon, - &t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); - t.tm_isdst = -1; + interpret_dos_date(dos_date,&t.tm_year,&t.tm_mon, + &t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); + t.tm_isdst = -1; - /* mktime() also does the local to GMT time conversion for us */ - ret = mktime(&t); + /* mktime() also does the local to GMT time conversion for us */ + ret = mktime(&t); - return(ret); + return(ret); } /******************************************************************* -like make_unix_date() but the words are reversed + Like make_unix_date() but the words are reversed. ********************************************************************/ + time_t make_unix_date2(void *date_ptr) { - uint32 x,x2; + uint32 x,x2; - x = IVAL(date_ptr,0); - x2 = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16); - SIVAL(&x,0,x2); + x = IVAL(date_ptr,0); + x2 = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16); + SIVAL(&x,0,x2); - return(make_unix_date((void *)&x)); + return(make_unix_date((void *)&x)); } /******************************************************************* - create a unix GMT date from a dos date in 32 bit "unix like" format - these generally arrive as localtimes, with corresponding DST - ******************************************************************/ + Create a unix GMT date from a dos date in 32 bit "unix like" format + these generally arrive as localtimes, with corresponding DST. +******************************************************************/ + time_t make_unix_date3(void *date_ptr) { - time_t t = (time_t)IVAL(date_ptr,0); - if (!null_mtime(t)) - t += LocTimeDiff(t); - return(t); + time_t t = (time_t)IVAL(date_ptr,0); + if (!null_mtime(t)) + t += LocTimeDiff(t); + return(t); } - /*************************************************************************** -return a HTTP/1.0 time string - ***************************************************************************/ + Return a HTTP/1.0 time string. +***************************************************************************/ + char *http_timestring(time_t t) { - static fstring buf; - struct tm *tm = LocalTime(&t); + static fstring buf; + struct tm *tm = LocalTime(&t); - if (!tm) - slprintf(buf,sizeof(buf)-1,"%ld seconds since the Epoch",(long)t); - else + if (!tm) + slprintf(buf,sizeof(buf)-1,"%ld seconds since the Epoch",(long)t); + else #ifndef HAVE_STRFTIME - fstrcpy(buf, asctime(tm)); - if(buf[strlen(buf)-1] == '\n') - buf[strlen(buf)-1] = 0; + fstrcpy(buf, asctime(tm)); + if(buf[strlen(buf)-1] == '\n') + buf[strlen(buf)-1] = 0; #else /* !HAVE_STRFTIME */ - strftime(buf, sizeof(buf)-1, "%a, %d %b %Y %H:%M:%S %Z", tm); + strftime(buf, sizeof(buf)-1, "%a, %d %b %Y %H:%M:%S %Z", tm); #endif /* !HAVE_STRFTIME */ - return buf; + return buf; } - - /**************************************************************************** Return the date and time as a string ****************************************************************************/ @@ -710,32 +730,32 @@ char *timestring(BOOL hires) } /**************************************************************************** - return the best approximation to a 'create time' under UNIX from a stat - structure. + Return the best approximation to a 'create time' under UNIX from a stat + structure. ****************************************************************************/ time_t get_create_time(SMB_STRUCT_STAT *st,BOOL fake_dirs) { - time_t ret, ret1; + time_t ret, ret1; - if(S_ISDIR(st->st_mode) && fake_dirs) - return (time_t)315493200L; /* 1/1/1980 */ + if(S_ISDIR(st->st_mode) && fake_dirs) + return (time_t)315493200L; /* 1/1/1980 */ - ret = MIN(st->st_ctime, st->st_mtime); - ret1 = MIN(ret, st->st_atime); + ret = MIN(st->st_ctime, st->st_mtime); + ret1 = MIN(ret, st->st_atime); - if(ret1 != (time_t)0) - return ret1; + if(ret1 != (time_t)0) + return ret1; - /* - * One of ctime, mtime or atime was zero (probably atime). - * Just return MIN(ctime, mtime). - */ - return ret; + /* + * One of ctime, mtime or atime was zero (probably atime). + * Just return MIN(ctime, mtime). + */ + return ret; } /**************************************************************************** -initialise an NTTIME to -1, which means "unknown" or "don't expire" + Initialise an NTTIME to -1, which means "unknown" or "don't expire". ****************************************************************************/ void init_nt_time(NTTIME *nt) @@ -745,8 +765,9 @@ void init_nt_time(NTTIME *nt) } /**************************************************************************** -check if NTTIME is 0 + Check if NTTIME is 0. ****************************************************************************/ + BOOL nt_time_is_zero(NTTIME *nt) { if(nt->high==0) @@ -754,6 +775,10 @@ BOOL nt_time_is_zero(NTTIME *nt) return False; } +/**************************************************************************** + Return a timeval difference in usec. +****************************************************************************/ + SMB_BIG_INT usec_time_diff(struct timeval *larget, struct timeval *smallt) { SMB_BIG_INT sec_diff = larget->tv_sec - smallt->tv_sec; -- cgit