time-util.c revision e28b88ee83b47dc2257140600f491482704c7b79
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2008-2014 Dovecot authors, see the included COPYING file */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "lib.h"
2423da95ee20fd4b3c260c1389cf2952d25f099cTimo Sirainen#include "time-util.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <time.h>
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen#define STRFTIME_MAX_BUFSIZE (1024*64)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen{
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen if (tv1->tv_sec < tv2->tv_sec)
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen return -1;
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen if (tv1->tv_sec > tv2->tv_sec)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen return 1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (tv1->tv_usec < tv2->tv_usec)
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen return -1;
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen if (tv1->tv_usec > tv2->tv_usec)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return 1;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen return 0;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen}
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainenint timeval_cmp_margin(const struct timeval *tv1, const struct timeval *tv2,
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen unsigned int usec_margin)
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen{
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen if (tv1->tv_sec < tv2->tv_sec)
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen return -1;
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen if (tv1->tv_sec > tv2->tv_sec)
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen return 1;
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen
a91bd6256b33729531c33ff8bc66ee1ae95840f9Timo Sirainen if (tv1->tv_usec - tv2->tv_usec < (int)usec_margin)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (tv1->tv_usec - tv2->tv_usec > (int)usec_margin)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return 0;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2)
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen{
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen return timeval_diff_usecs(tv1, tv2) / 1000;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const struct timeval *tv2)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen time_t secs;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen int usecs;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen secs = tv1->tv_sec - tv2->tv_sec;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen usecs = tv1->tv_usec - tv2->tv_usec;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (usecs < 0) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen secs--;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen usecs += 1000000;
c040ee67d0ac0fb7375bb543965bf67dcae6affaTimo Sirainen }
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen return ((long long)secs * 1000000LL) + usecs;
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenconst char *t_strflocaltime(const char *fmt, time_t t)
d92f33f13830ba23d814342bf3ea8db721a15bb1Timo Sirainen{
d92f33f13830ba23d814342bf3ea8db721a15bb1Timo Sirainen const struct tm *tm;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen size_t bufsize = strlen(fmt) + 32;
61e84692827b6a64912343f515c984853021483aTimo Sirainen char *buf = t_buffer_get(bufsize);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen size_t ret;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen tm = localtime(&t);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen while ((ret = strftime(buf, bufsize, fmt, tm)) == 0) {
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen bufsize *= 2;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen i_assert(bufsize <= STRFTIME_MAX_BUFSIZE);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen buf = t_buffer_get(bufsize);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen }
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen t_buffer_alloc(ret + 1);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen return buf;
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen}
4ba962c3e78f140facdcfb1e093c4c46de75ae24Timo Sirainen