time-util.c revision 5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen/* Copyright (c) 2008-2013 Dovecot authors, see the included COPYING file */
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "lib.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "time-util.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include <time.h>
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#define STRFTIME_MAX_BUFSIZE (1024*64)
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen{
d1f0acc7fc722e13e8296228703adfe8a884d59eTimo Sirainen if (tv1->tv_sec < tv2->tv_sec)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen return -1;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen if (tv1->tv_sec > tv2->tv_sec)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen return 1;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen if (tv1->tv_usec < tv2->tv_usec)
0cb57ee35d4cab9c03434d7abf312c081ed554d4Timo Sirainen return -1;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen if (tv1->tv_usec > tv2->tv_usec)
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen return 1;
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen return 0;
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen}
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2)
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen{
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen return timeval_diff_usecs(tv1, tv2) / 1000;
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen}
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const struct timeval *tv2)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen{
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen time_t secs;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen int usecs;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
e65cc79f80577e83c706f0678c78e2c0bd91434fTimo Sirainen secs = tv1->tv_sec - tv2->tv_sec;
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen usecs = tv1->tv_usec - tv2->tv_usec;
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen if (usecs < 0) {
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen secs--;
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen usecs += 1000000;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen }
b567e0172c73dcf7642462e86962060358dd5f28Timo Sirainen return ((long long)secs * 1000000ULL) + usecs;
10c5fd417af4ee30b68c967f5e7d5a49f4f149b5Timo Sirainen}
10c5fd417af4ee30b68c967f5e7d5a49f4f149b5Timo Sirainen
10c5fd417af4ee30b68c967f5e7d5a49f4f149b5Timo Sirainenconst char *t_strflocaltime(const char *fmt, time_t t)
1f18053d463f0294387b5e4dd11f9010bda9a24eTimo Sirainen{
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen const struct tm *tm;
c65695787dbb712fc403c4b9f90516b2598377b9Timo Sirainen size_t bufsize = strlen(fmt) + 32;
c65695787dbb712fc403c4b9f90516b2598377b9Timo Sirainen char *buf = t_buffer_get(bufsize);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen size_t ret;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen tm = localtime(&t);
e65cc79f80577e83c706f0678c78e2c0bd91434fTimo Sirainen while ((ret = strftime(buf, bufsize, fmt, tm)) == 0) {
e65cc79f80577e83c706f0678c78e2c0bd91434fTimo Sirainen bufsize *= 2;
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen i_assert(bufsize <= STRFTIME_MAX_BUFSIZE);
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen buf = t_buffer_get(bufsize);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen }
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen t_buffer_alloc(ret + 1);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen return buf;
b567e0172c73dcf7642462e86962060358dd5f28Timo Sirainen}
10c5fd417af4ee30b68c967f5e7d5a49f4f149b5Timo Sirainen