time-util.c revision 02c335c23bf5fa225a467c19f2c063fb0dc7b8c3
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2008-2016 Dovecot authors, see the included COPYING file */
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen#include "lib.h"
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen#include "time-util.h"
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen#include <time.h>
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen#define STRFTIME_MAX_BUFSIZE (1024*64)
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen{
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen if (tv1->tv_sec < tv2->tv_sec)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen return -1;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen if (tv1->tv_sec > tv2->tv_sec)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen return 1;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen if (tv1->tv_usec < tv2->tv_usec)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen return -1;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen if (tv1->tv_usec > tv2->tv_usec)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen return 1;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen return 0;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen}
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen
e28b88ee83b47dc2257140600f491482704c7b79Stephan Boschint timeval_cmp_margin(const struct timeval *tv1, const struct timeval *tv2,
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch unsigned int usec_margin)
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch{
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch if (tv1->tv_sec < tv2->tv_sec)
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch return -1;
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch if (tv1->tv_sec > tv2->tv_sec)
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch return 1;
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch if (tv1->tv_usec - tv2->tv_usec < (int)usec_margin)
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch return -1;
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch if (tv1->tv_usec - tv2->tv_usec > (int)usec_margin)
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch return -1;
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch return 0;
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch}
e28b88ee83b47dc2257140600f491482704c7b79Stephan Bosch
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen{
2f2244332687187931e9541e5ff312aa6c5aa705Timo Sirainen return timeval_diff_usecs(tv1, tv2) / 1000;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen}
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen const struct timeval *tv2)
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen{
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen time_t secs;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen int usecs;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen secs = tv1->tv_sec - tv2->tv_sec;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen usecs = tv1->tv_usec - tv2->tv_usec;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen if (usecs < 0) {
2f2244332687187931e9541e5ff312aa6c5aa705Timo Sirainen secs--;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen usecs += 1000000;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen }
1384fac439fea3026b16a9d8d24954200e413bccTimo Sirainen return ((long long)secs * 1000000LL) + usecs;
7ef3553585e556f35d5919589cfdc1de3329e4bbTimo Sirainen}
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainenconst char *t_strflocaltime(const char *fmt, time_t t)
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen{
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen const struct tm *tm;
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen size_t bufsize = strlen(fmt) + 32;
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen char *buf = t_buffer_get(bufsize);
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen size_t ret;
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen tm = localtime(&t);
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen while ((ret = strftime(buf, bufsize, fmt, tm)) == 0) {
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen bufsize *= 2;
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen i_assert(bufsize <= STRFTIME_MAX_BUFSIZE);
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen buf = t_buffer_get(bufsize);
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen }
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen t_buffer_alloc(ret + 1);
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen return buf;
c3c07d6527ad28c8546cbbf84c257d178e23c184Timo Sirainen}