time-util.c revision 9983cbb4cef92d68ffde87dcc91913cc2fed3da5
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2008-2016 Dovecot authors, see the included COPYING file */
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "lib.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "time-util.h"
c96eb61168670cfdd7596baba18856d3f086a093Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include <time.h>
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#define STRFTIME_MAX_BUFSIZE (1024*64)
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2)
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen{
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen if (tv1->tv_sec < tv2->tv_sec)
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen return -1;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen if (tv1->tv_sec > tv2->tv_sec)
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen return 1;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen if (tv1->tv_usec < tv2->tv_usec)
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen return -1;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen if (tv1->tv_usec > tv2->tv_usec)
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen return 1;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen return 0;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint timeval_cmp_margin(const struct timeval *tv1, const struct timeval *tv2,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen unsigned int usec_margin)
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (tv1->tv_sec < tv2->tv_sec)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return -1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (tv1->tv_sec > tv2->tv_sec)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return 1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if ((tv2->tv_usec - tv1->tv_usec) > (int)usec_margin)
8039af9679af6fb56116b353fe44f7dd4c08f031Timo Sirainen return -1;
923eb3dde28e4d8841c14fd6b4a69635b7070c3eTimo Sirainen if ((tv1->tv_usec - tv2->tv_usec) > (int)usec_margin)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return 1;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return 0;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
150e64c376365becf1ec5c9d45912ecb840eea96Timo Sirainen return timeval_diff_usecs(tv1, tv2) / 1000;
150e64c376365becf1ec5c9d45912ecb840eea96Timo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen const struct timeval *tv2)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen time_t secs;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen int usecs;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen secs = tv1->tv_sec - tv2->tv_sec;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen usecs = tv1->tv_usec - tv2->tv_usec;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen if (usecs < 0) {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen secs--;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen usecs += 1000000;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen }
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen return ((long long)secs * 1000000LL) + usecs;
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenstatic const char *strftime_real(const char *fmt, const struct tm *tm)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen size_t bufsize = strlen(fmt) + 32;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen char *buf = t_buffer_get(bufsize);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen size_t ret;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen while ((ret = strftime(buf, bufsize, fmt, tm)) == 0) {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen bufsize *= 2;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen i_assert(bufsize <= STRFTIME_MAX_BUFSIZE);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen buf = t_buffer_get(bufsize);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen }
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen t_buffer_alloc(ret + 1);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return buf;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenconst char *t_strftime(const char *fmt, const struct tm *tm)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return strftime_real(fmt, tm);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenconst char *t_strflocaltime(const char *fmt, time_t t)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return strftime_real(fmt, localtime(&t));
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenconst char *t_strfgmtime(const char *fmt, time_t t)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return strftime_real(fmt, gmtime(&t));
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen