svn commit: samba r17766 - in branches/SAMBA_3_0/source/lib: .
jra at samba.org
jra at samba.org
Thu Aug 24 01:31:01 GMT 2006
Author: jra
Date: 2006-08-24 01:31:00 +0000 (Thu, 24 Aug 2006)
New Revision: 17766
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17766
Log:
Getting ready to properly expose 100ns times on
the wire. Move the internals of nt_time functions
to use struct timespecs.
Jeremy.
Modified:
branches/SAMBA_3_0/source/lib/time.c
Changeset:
Modified: branches/SAMBA_3_0/source/lib/time.c
===================================================================
--- branches/SAMBA_3_0/source/lib/time.c 2006-08-24 01:03:42 UTC (rev 17765)
+++ branches/SAMBA_3_0/source/lib/time.c 2006-08-24 01:31:00 UTC (rev 17766)
@@ -178,22 +178,28 @@
Interpret an 8 byte "filetime" structure to a time_t
It's originally in "100ns units since jan 1st 1601"
- An 8 byte value of 0xffffffffffffffff will be returned as (time_t)0.
+ An 8 byte value of 0xffffffffffffffff will be returned as a timespec of
+ tv_sec = 0
+ tv_nsec = 0;
+
Returns GMT.
****************************************************************************/
-time_t nt_time_to_unix(NTTIME *nt)
+struct timespec nt_time_to_unix_timespec(NTTIME *nt)
{
double d;
- time_t ret;
+ struct timespec 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->low == 0 )||
+ (nt->high == 0xffffffff && nt->low == 0xffffffff)) {
+ ret.tv_sec = 0;
+ ret.tv_nsec = 0;
+ return ret;
}
d = ((double)nt->high)*4.0*(double)(1<<30);
@@ -204,17 +210,28 @@
d -= TIME_FIXUP_CONSTANT;
if (d <= l_time_min) {
- return (l_time_min);
+ ret.tv_sec = l_time_min;
+ ret.tv_nsec = 0;
+ return ret;
}
if (d >= l_time_max) {
- return (l_time_max);
+ ret.tv_sec = l_time_max;
+ ret.tv_nsec = 0;
+ return ret;
}
- ret = (time_t)(d+0.5);
- return(ret);
+ ret.tv_sec = (time_t)d;
+ ret.tv_nsec = (long) ((d*1.0e9) - ((double)ret.tv_sec)*1.0e9);
+ return ret;
}
+time_t nt_time_to_unix(NTTIME *nt)
+{
+ struct timespec ts = nt_time_to_unix_timespec(nt);
+ return ts.tv_sec;
+}
+
/****************************************************************************
Convert a NTTIME structure to a time_t.
It's originally in "100ns units".
@@ -224,10 +241,10 @@
if the NTTIME was 5 seconds, the time_t is 5 seconds. JFM
****************************************************************************/
-time_t nt_time_to_unix_abs(const NTTIME *nt)
+struct timespec nt_time_to_unix_abs(const NTTIME *nt)
{
double d;
- time_t ret;
+ struct timespec ret;
/* The next two lines are a fix needed for the
broken SCO compiler. JRA. */
time_t l_time_min = TIME_T_MIN;
@@ -235,11 +252,15 @@
NTTIME neg_nt;
if (nt->high == 0) {
- return(0);
+ ret.tv_sec = 0;
+ ret.tv_nsec = 0;
+ return ret;
}
if (nt->high==0x80000000 && nt->low==0) {
- return (time_t)-1;
+ ret.tv_sec = (time_t)-1;
+ ret.tv_nsec = 0;
+ return ret;
}
/* reverse the time */
@@ -252,64 +273,82 @@
d *= 1.0e-7;
if (!(l_time_min <= d && d <= l_time_max)) {
- return(0);
+ ret.tv_sec = 0;
+ ret.tv_nsec = 0;
+ return ret;
}
- ret = (time_t)(d+0.5);
-
- return(ret);
+ ret.tv_sec = (time_t)d;
+ ret.tv_nsec = (long) ((d*1.0e9) - ((double)ret.tv_sec)*1.0e9);
+ return ret;
}
/****************************************************************************
- Interprets an nt time into a unix time_t.
+ Interprets an nt time into a unix struct timespec.
Differs from nt_time_to_unix in that an 8 byte value of 0xffffffffffffffff
will be returned as (time_t)-1, whereas nt_time_to_unix returns 0 in this case.
****************************************************************************/
-time_t interpret_long_date(char *p)
+struct timespec interpret_long_date(char *p)
{
NTTIME nt;
nt.low = IVAL(p,0);
nt.high = IVAL(p,4);
if (nt.low == 0xFFFFFFFF && nt.high == 0xFFFFFFFF) {
- return (time_t)-1;
+ struct timespec ret;
+ ret.tv_sec = (time_t)-1;
+ ret.tv_nsec = 0;
+ return ret;
}
- return nt_time_to_unix(&nt);
+ return nt_time_to_unix_timespec(&nt);
}
/****************************************************************************
- Put a 8 byte filetime from a time_t. Uses GMT.
+ Put a 8 byte filetime from a struct timespec. Uses GMT.
****************************************************************************/
-void unix_to_nt_time(NTTIME *nt, time_t t)
+void unix_timespec_to_nt_time(NTTIME *nt, struct timespec ts)
{
double d;
- if (t==0) {
+ if (ts.tv_sec ==0 && ts.tv_nsec == 0) {
nt->low = 0;
nt->high = 0;
return;
}
- if (t == TIME_T_MAX) {
+ if (ts.tv_sec == TIME_T_MAX) {
nt->low = 0xffffffff;
nt->high = 0x7fffffff;
return;
}
- if (t == (time_t)-1) {
+ if (ts.tv_sec == (time_t)-1) {
nt->low = 0xffffffff;
nt->high = 0xffffffff;
return;
}
- d = (double)(t);
+ d = (double)(ts.tv_sec);
d += TIME_FIXUP_CONSTANT;
d *= 1.0e7;
+ d += ((double)ts.tv_nsec / 100.0);
nt->high = (uint32)(d * (1.0/(4.0*(double)(1<<30))));
nt->low = (uint32)(d - ((double)nt->high)*4.0*(double)(1<<30));
}
/****************************************************************************
+ Put a 8 byte filetime from a time_t. Uses GMT.
+****************************************************************************/
+
+void unix_to_nt_time(NTTIME *nt, time_t t)
+{
+ struct timespec ts;
+ ts.tv_sec = t;
+ ts.tv_nsec = 0;
+ unix_timespec_to_nt_time(nt, ts);
+}
+
+/****************************************************************************
Convert a time_t to a NTTIME structure
This is an absolute version of the one above.
@@ -356,10 +395,10 @@
pointed to by p.
****************************************************************************/
-void put_long_date(char *p, time_t t)
+void put_long_date(char *p, struct timespec ts)
{
NTTIME nt;
- unix_to_nt_time(&nt, t);
+ unix_timespec_to_nt_time(&nt, ts);
SIVAL(p, 0, nt.low);
SIVAL(p, 4, nt.high);
}
More information about the samba-cvs
mailing list