-/* $Cambridge: exim/src/src/tod.c,v 1.2 2005/01/04 10:00:42 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
/* See the file NOTICE for conditions of use and distribution. */
/* A function for returning the time of day in various formats */
option.
Argument: type of timestamp required:
- tod_bsdin BSD inbox format
- tod_epoch Unix epoch format
- tod_full full date and time
- tod_log log file data line format,
- with zone if log_timezone is TRUE
- tod_log_bare always without zone
- tod_log_datestamp for log file names when datestamped
- tod_log_zone always with zone
- tod_mbx MBX inbox format
- tod_zone just the timezone offset
- tod_zulu time in 8601 zulu format
+ tod_bsdin BSD inbox format
+ tod_epoch Unix epoch format
+ tod_epochl Unix epoch/usec format
+ tod_full full date and time
+ tod_log log file data line format,
+ with zone if log_timezone is TRUE
+ tod_log_bare always without zone
+ tod_log_datestamp_daily for log file names when datestamped daily
+ tod_log_datestamp_monthly for log file names when datestamped monthly
+ tod_log_zone always with zone
+ tod_mbx MBX inbox format
+ tod_zone just the timezone offset
+ tod_zulu time in 8601 zulu format
Returns: pointer to fixed buffer containing the timestamp
*/
uschar *
tod_stamp(int type)
{
-time_t now = time(NULL);
+time_t now;
struct tm *t;
+if (type == tod_epoch_l)
+ {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ /* Unix epoch/usec format */
+ (void) sprintf(CS timebuf, TIME_T_FMT "%06ld", tv.tv_sec, (long) tv.tv_usec );
+ return timebuf;
+ }
+
+now = time(NULL);
+
/* Vary log type according to timezone requirement */
if (type == tod_log) type = log_timezone? tod_log_zone : tod_log_bare;
else if (type == tod_epoch)
{
- (void) sprintf(CS timebuf, "%d", (int)now); /* Unix epoch format */
- return timebuf;
+ (void) sprintf(CS timebuf, TIME_T_FMT, now); /* Unix epoch format */
+ return timebuf; /* NB the above will be wrong if time_t is FP */
}
else if (type == tod_zulu)
/* Format used as suffix of log file name when 'log_datestamp' is active. For
testing purposes, it changes the file every second. */
- case tod_log_datestamp:
#ifdef TESTING_LOG_DATESTAMP
+ case tod_log_datestamp_daily:
+ case tod_log_datestamp_monthly:
(void) sprintf(CS timebuf, "%04d%02d%02d%02d%02d",
1900 + t->tm_year, 1 + t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min);
+ break;
+
#else
+ case tod_log_datestamp_daily:
(void) sprintf(CS timebuf, "%04d%02d%02d",
1900 + t->tm_year, 1 + t->tm_mon, t->tm_mday);
- #endif
break;
+ case tod_log_datestamp_monthly:
+ (void) sprintf(CS timebuf, "%04d%02d",
+ 1900 + t->tm_year, 1 + t->tm_mon);
+ break;
+ #endif
+
/* Format used in BSD inbox separator lines. Sort-of documented in RFC 976
("UUCP Mail Interchange Format Standard") but only by example, not by
explicit definition. The examples show no timezone offsets, and some MUAs