time.c revision ab023a65562e62b85a824509d829b6fad87e00b1
/*
* Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: time.c,v 1.48 2005/04/27 04:57:24 sra Exp $ */
/*! \file */
#include <config.h>
#include <errno.h>
#include <limits.h>
#include <syslog.h>
#include <time.h>
#include <isc/strerror.h>
/*
* All of the INSIST()s checks of nanoseconds < NS_PER_S are for
* consistency checking of the type. In lieu of magic numbers, it
* is the best we've got. The check is only performed on functions which
* need an initialized type.
*/
#ifndef ISC_FIX_TV_USEC
#define ISC_FIX_TV_USEC 1
#endif
/*%
*** Intervals
***/
static isc_interval_t zero_interval = { 0, 0 };
#if ISC_FIX_TV_USEC
static inline void
do {
do {
}
/*
* Call syslog directly as was are called from the logging functions.
*/
if (fixed)
}
#endif
void
unsigned int seconds, unsigned int nanoseconds)
{
i->nanoseconds = nanoseconds;
}
isc_interval_iszero(const isc_interval_t *i) {
if (i->seconds == 0 && i->nanoseconds == 0)
return (ISC_TRUE);
return (ISC_FALSE);
}
/***
*** Absolute Times
***/
static isc_time_t epoch = { 0, 0 };
void
t->nanoseconds = nanoseconds;
}
void
t->seconds = 0;
t->nanoseconds = 0;
}
isc_time_isepoch(const isc_time_t *t) {
if (t->seconds == 0 && t->nanoseconds == 0)
return (ISC_TRUE);
return (ISC_FALSE);
}
isc_time_now(isc_time_t *t) {
char strbuf[ISC_STRERRORSIZE];
return (ISC_R_UNEXPECTED);
}
/*
* Does POSIX guarantee the signedness of tv_sec and tv_usec? If not,
* then this test will generate warnings for platforms on which it is
* unsigned. In any event, the chances of any of these problems
* happening are pretty much zero, but since the libisc library ensures
* certain things to be true ...
*/
#if ISC_FIX_TV_USEC
fix_tv_usec(&tv);
return (ISC_R_UNEXPECTED);
#else
return (ISC_R_UNEXPECTED);
#endif
/*
* Ensure the tv_sec value fits in t->seconds.
*/
return (ISC_R_RANGE);
return (ISC_R_SUCCESS);
}
char strbuf[ISC_STRERRORSIZE];
return (ISC_R_UNEXPECTED);
}
/*
* Does POSIX guarantee the signedness of tv_sec and tv_usec? If not,
* then this test will generate warnings for platforms on which it is
* unsigned. In any event, the chances of any of these problems
* happening are pretty much zero, but since the libisc library ensures
* certain things to be true ...
*/
#if ISC_FIX_TV_USEC
fix_tv_usec(&tv);
return (ISC_R_UNEXPECTED);
#else
return (ISC_R_UNEXPECTED);
#endif
/*
* Ensure the resulting seconds value fits in the size of an
* unsigned int. (It is written this way as a slight optimization;
* note that even if both values == INT_MAX, then when added
* and getting another 1 added below the result is UINT_MAX.)
*/
return (ISC_R_RANGE);
if (t->nanoseconds > NS_PER_S) {
t->seconds++;
t->nanoseconds -= NS_PER_S;
}
return (ISC_R_SUCCESS);
}
int
return (-1);
return (1);
return (-1);
return (1);
return (0);
}
{
/*
* Ensure the resulting seconds value fits in the size of an
* unsigned int. (It is written this way as a slight optimization;
* note that even if both values == INT_MAX, then when added
* and getting another 1 added below the result is UINT_MAX.)
*/
return (ISC_R_RANGE);
}
return (ISC_R_SUCCESS);
}
{
t->nanoseconds < i->nanoseconds))
return (ISC_R_RANGE);
if (t->nanoseconds >= i->nanoseconds)
else {
t->nanoseconds;
}
return (ISC_R_SUCCESS);
}
return (0);
/*
* Convert to microseconds.
*/
return (i3);
}
isc_time_seconds(const isc_time_t *t) {
return ((isc_uint32_t)t->seconds);
}
isc_uint64_t i;
/*
* Ensure that the number of seconds represented by t->seconds
* can be represented by a time_t. Since t->seconds is an unsigned
* int and since time_t is mostly opaque, this is trickier than
* it seems. (This standardized opaqueness of time_t is *very*
* frustrating; time_t is not even limited to being an integral
* type.)
*
* The mission, then, is to avoid generating any kind of warning
* about "signed versus unsigned" while trying to determine if the
* the unsigned int t->seconds is out range for tv_sec, which is
* pretty much only true if time_t is a signed integer of the same
* size as the return value of isc_time_seconds.
*
* The use of the 64 bit integer ``i'' takes advantage of C's
* conversion rules to either zero fill or sign extend the widened
* type.
*
* Solaris 5.6 gives this warning about the left shift:
* warning: integer overflow detected: op "<<"
* if the U(nsigned) qualifier is not on the 1.
*/
INSIST(sizeof(unsigned int) == sizeof(isc_uint32_t));
(seconds &
/*
* This UNUSED() is here to shut up the IRIX compiler:
* variable "i" was set but never used
* when the value of i *was* used in the third test.
* (Let's hope the compiler got the actual test right.)
*/
UNUSED(i);
return (ISC_R_RANGE);
}
return (ISC_R_SUCCESS);
}
isc_time_nanoseconds(const isc_time_t *t) {
return ((isc_uint32_t)t->nanoseconds);
}
void
unsigned int flen;
if (flen != 0)
else
}