2014-07-29 22:54:44 +04:00
/*
* Unix SMB / CIFS implementation .
* time handling functions
*
* Copyright ( C ) Andrew Tridgell 1992 - 2004
* Copyright ( C ) Stefan ( metze ) Metzmacher 2002
* Copyright ( C ) Jeremy Allison 2007
* Copyright ( C ) Andrew Bartlett 2011
*
* 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
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "replace.h"
# include "lib/util/time_basic.h"
/**
a gettimeofday wrapper
* */
_PUBLIC_ void GetTimeOfDay ( struct timeval * tval )
{
# ifdef HAVE_GETTIMEOFDAY_TZ
gettimeofday ( tval , NULL ) ;
# else
gettimeofday ( tval ) ;
# endif
}
/****************************************************************************
Return the date and time as a string
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-10-10 11:46:31 +04:00
char * timeval_str_buf ( const struct timeval * tp , bool rfc5424 , bool hires ,
2014-07-29 22:54:44 +04:00
struct timeval_buf * dst )
{
time_t t ;
struct tm * tm ;
size_t len ;
t = ( time_t ) tp - > tv_sec ;
tm = localtime ( & t ) ;
if ( tm = = NULL ) {
if ( hires ) {
snprintf ( dst - > buf , sizeof ( dst - > buf ) ,
" %ld.%06ld seconds since the Epoch " ,
( long ) tp - > tv_sec , ( long ) tp - > tv_usec ) ;
} else {
snprintf ( dst - > buf , sizeof ( dst - > buf ) ,
" %ld seconds since the Epoch " , ( long ) t ) ;
}
return dst - > buf ;
}
2014-10-08 08:52:37 +04:00
len = snprintf ( dst - > buf , sizeof ( dst - > buf ) ,
2014-10-10 11:46:31 +04:00
( rfc5424 ?
" %04d-%02d-%02dT%02d:%02d:%02d " :
" %04d/%02d/%02d %02d:%02d:%02d " ) ,
2014-12-12 02:57:37 +03:00
1900 + tm - > tm_year , tm - > tm_mon + 1 , tm - > tm_mday ,
2014-10-08 08:52:37 +04:00
tm - > tm_hour , tm - > tm_min , tm - > tm_sec ) ;
2014-10-10 11:46:31 +04:00
if ( ( rfc5424 | | hires ) & & ( len < sizeof ( dst - > buf ) ) ) {
len + = snprintf ( dst - > buf + len , sizeof ( dst - > buf ) - len ,
" .%06ld " , ( long ) tp - > tv_usec ) ;
}
if ( rfc5424 & & ( len < sizeof ( dst - > buf ) ) ) {
struct tm tm_utc , tm_local ;
int offset ;
tm_local = * tm ;
/* It is reasonable to assume that if localtime()
* worked above , then gmtime ( ) should also work
* without error . */
tm_utc = * gmtime ( & t ) ;
offset = ( tm_local . tm_hour - tm_utc . tm_hour ) * 60 +
( tm_local . tm_min - tm_utc . tm_min ) ;
2014-07-29 22:54:44 +04:00
snprintf ( dst - > buf + len , sizeof ( dst - > buf ) - len ,
2014-10-10 11:46:31 +04:00
" %c%02d:%02d " ,
( offset > = 0 ? ' + ' : ' - ' ) ,
abs ( offset ) / 60 ,
abs ( offset ) % 60 ) ;
2014-07-29 22:54:44 +04:00
}
return dst - > buf ;
}