annotate src/lib/utc-mktime.c @ 9191:b340ecb24469 HEAD

Fix VPATH build of RQUOTA support. Some rpcgen derive #include "..." paths from the infile argument. This will be off for VPATH builds, as the generated rquota_xdr.c code will look in $(srcdir), but we'll generate the rquota.h file in $(builddir). Play safe and copy rquota.x to $(builddir) first. This fixes the build on openSUSE 11.1.
author Matthias Andree <matthias.andree@gmx.de>
date Tue, 07 Jul 2009 21:01:36 +0200
parents b9faf4db2a9f
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
1 /* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
1658
20519e4bca48 utc_mktime() crashed with 64bit time_t if gmtime() didn't like >32bit values
Timo Sirainen <tss@iki.fi>
parents: 493
diff changeset
3 #include "lib.h"
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "utc-mktime.h"
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
6 static int tm_cmp(const struct tm *tm1, const struct tm *tm2)
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 {
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
8 int diff;
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
10 if ((diff = tm1->tm_year - tm2->tm_year) != 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
11 return diff;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
12 if ((diff = tm1->tm_mon - tm2->tm_mon) != 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
13 return diff;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
14 if ((diff = tm1->tm_mday - tm2->tm_mday) != 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
15 return diff;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
16 if ((diff = tm1->tm_hour - tm2->tm_hour) != 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
17 return diff;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
18 if ((diff = tm1->tm_min - tm2->tm_min) != 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
19 return diff;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
20 return tm1->tm_sec - tm2->tm_sec;
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 }
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
23 time_t utc_mktime(const struct tm *tm)
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 {
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
25 const struct tm *try_tm;
6597
7b5b3b0c7002 Fix to 64bit time_t
Timo Sirainen <tss@iki.fi>
parents: 6584
diff changeset
26 time_t t;
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
27 int bits, dir;
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
29 /* we'll do a binary search across the entire valid time_t range.
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
30 when gmtime()'s output matches the tm parameter, we've found the
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
31 correct time_t value. this also means that if tm contains invalid
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
32 values, -1 is returned. */
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
33 #ifdef TIME_T_SIGNED
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
34 t = 0;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
35 #else
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
36 t = 1 << (TIME_T_MAX_BITS - 1);
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
37 #endif
6584
4fb613eb8ce9 utc_mktime() was broken with 32bit time_t. Also don't try to optimize away
Timo Sirainen <tss@iki.fi>
parents: 6483
diff changeset
38 for (bits = TIME_T_MAX_BITS - 2;; bits--) {
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
39 try_tm = gmtime(&t);
6584
4fb613eb8ce9 utc_mktime() was broken with 32bit time_t. Also don't try to optimize away
Timo Sirainen <tss@iki.fi>
parents: 6483
diff changeset
40 dir = tm_cmp(tm, try_tm);
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
41 if (dir == 0)
6584
4fb613eb8ce9 utc_mktime() was broken with 32bit time_t. Also don't try to optimize away
Timo Sirainen <tss@iki.fi>
parents: 6483
diff changeset
42 return t;
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
43 if (bits < 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
44 break;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
45
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
46 if (dir < 0)
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
47 t -= (time_t)1 << bits;
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
48 else
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
49 t += (time_t)1 << bits;
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
6483
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
51
6d15946eccb5 Rewrote utc_mktime() so it's now MIT licensed. This also fixes handling
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
52 return (time_t)-1;
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }