Line data Source code
1 : /* 2 : * Unix SMB/CIFS implementation. 3 : * time handling functions 4 : * 5 : * Copyright (C) Andrew Tridgell 1992-2004 6 : * Copyright (C) Stefan (metze) Metzmacher 2002 7 : * Copyright (C) Jeremy Allison 2007 8 : * Copyright (C) Andrew Bartlett 2011 9 : * 10 : * This program is free software; you can redistribute it and/or modify 11 : * it under the terms of the GNU General Public License as published by 12 : * the Free Software Foundation; either version 3 of the License, or 13 : * (at your option) any later version. 14 : * 15 : * This program is distributed in the hope that it will be useful, 16 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 : * GNU General Public License for more details. 19 : * 20 : * You should have received a copy of the GNU General Public License 21 : * along with this program. If not, see <http://www.gnu.org/licenses/>. 22 : */ 23 : 24 : #include "replace.h" 25 : #include "system/time.h" 26 : #include "lib/util/time_basic.h" 27 : 28 : /** 29 : a gettimeofday wrapper 30 : **/ 31 21906513 : _PUBLIC_ void GetTimeOfDay(struct timeval *tval) 32 : { 33 : #if defined(HAVE_GETTIMEOFDAY_TZ) || defined(HAVE_GETTIMEOFDAY_TZ_VOID) 34 21906513 : gettimeofday(tval,NULL); 35 : #else 36 : gettimeofday(tval); 37 : #endif 38 21906513 : } 39 : 40 : /**************************************************************************** 41 : Return the date and time as a string 42 : ****************************************************************************/ 43 : 44 23249 : char *timeval_str_buf(const struct timeval *tp, bool rfc5424, bool hires, 45 : struct timeval_buf *dst) 46 : { 47 914 : time_t t; 48 914 : struct tm *tm; 49 914 : size_t len; 50 : 51 23249 : t = (time_t)tp->tv_sec; 52 23249 : tm = localtime(&t); 53 : 54 23249 : if (tm == NULL) { 55 0 : if (hires) { 56 0 : snprintf(dst->buf, sizeof(dst->buf), 57 : "%ld.%06ld seconds since the Epoch", 58 0 : (long)tp->tv_sec, (long)tp->tv_usec); 59 : } else { 60 0 : snprintf(dst->buf, sizeof(dst->buf), 61 : "%ld seconds since the Epoch", (long)t); 62 : } 63 0 : return dst->buf; 64 : } 65 : 66 23249 : len = snprintf(dst->buf, sizeof(dst->buf), 67 : (rfc5424 ? 68 : "%04d-%02d-%02dT%02d:%02d:%02d" : 69 : "%04d/%02d/%02d %02d:%02d:%02d"), 70 23249 : 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, 71 : tm->tm_hour, tm->tm_min, tm->tm_sec); 72 : 73 23249 : if ((rfc5424 || hires) && (len < sizeof(dst->buf))) { 74 21969 : len += snprintf(dst->buf + len, sizeof(dst->buf) - len, 75 21969 : ".%06ld", (long)tp->tv_usec); 76 : } 77 : 78 23249 : if (rfc5424 && (len < sizeof(dst->buf))) { 79 204 : struct tm tm_utc, tm_local; 80 204 : int offset; 81 : 82 21187 : tm_local = *tm; 83 : /* It is reasonable to assume that if localtime() 84 : * worked above, then gmtime() should also work 85 : * without error. */ 86 21187 : tm_utc = *gmtime(&t); 87 : 88 21187 : offset = (tm_local.tm_hour - tm_utc.tm_hour) * 60 + 89 21187 : (tm_local.tm_min - tm_utc.tm_min); 90 : 91 21187 : snprintf(dst->buf + len, sizeof(dst->buf) - len, 92 : "%c%02d:%02d", 93 : (offset >=0 ? '+' : '-'), 94 20983 : abs(offset) / 60, 95 21187 : abs(offset) % 60); 96 : } 97 : 98 22335 : return dst->buf; 99 : }