summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2006-04-14 22:38:00 +0000
committerKen Raeburn <raeburn@mit.edu>2006-04-14 22:38:00 +0000
commit69ff87b7502fe2edb5ca04b3050b8bf9903e5332 (patch)
tree2722093a7244c5df8c54bb30a874669a4b815d25 /src/util
parent6ca528fbea27b0d8d42c5f2802e15b507c4da945 (diff)
downloadkrb5-69ff87b7502fe2edb5ca04b3050b8bf9903e5332.tar.gz
krb5-69ff87b7502fe2edb5ca04b3050b8bf9903e5332.tar.xz
krb5-69ff87b7502fe2edb5ca04b3050b8bf9903e5332.zip
Move gmt_mktime.c from lib/krb5/os to util/support, and rename the function.
Stop exporting gmt_mktime from libkrb5, and export krb5int_gmt_mktime from libkrb5support. Updated the one caller, asn1_decode.c. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17921 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/util')
-rw-r--r--src/util/support/Makefile.in8
-rw-r--r--src/util/support/gmt_mktime.c127
-rw-r--r--src/util/support/libkrb5support.exports1
3 files changed, 136 insertions, 0 deletions
diff --git a/src/util/support/Makefile.in b/src/util/support/Makefile.in
index 5217cd72c..4b0ea81bb 100644
--- a/src/util/support/Makefile.in
+++ b/src/util/support/Makefile.in
@@ -30,6 +30,7 @@ STLIBOBJS= \
init-addrinfo.o \
plugins.o \
errors.o \
+ gmt_mktime.o \
fake-addrinfo.o
LIBOBJS= \
@@ -37,6 +38,7 @@ LIBOBJS= \
$(OUTPRE)init-addrinfo.$(OBJEXT) \
$(OUTPRE)plugins.$(OBJEXT) \
$(OUTPRE)errors.$(OBJEXT) \
+ $(OUTPRE)gmt_mktime.$(OBJEXT) \
$(OUTPRE)fake-addrinfo.$(OBJEXT)
STOBJLISTS=OBJS.ST
@@ -49,6 +51,7 @@ SRCS=\
$(srcdir)/threads.c \
$(srcdir)/init-addrinfo.c \
$(srcdir)/errors.c \
+ $(srcdir)/gmt_mktime.c \
$(srcdir)/fake-addrinfo.c
SHLIB_EXPDEPS =
# Add -lm if dumping thread stats, for sqrt.
@@ -70,6 +73,9 @@ $(BUILDTOP)/include/autoconf.h: $(SRCTOP)/include/autoconf.h.in
(cd $(BUILDTOP)/include; $(MAKE) autoconf.h)
##DOS##!endif
+t_mktime: gmt_mktime.c
+ $(CC) $(ALL_CFLAGS) -DTEST_LEAP -o t_mktime $(srcdir)/gmt_mktime.c
+
# @lib_frag@
# @libobj_frag@
@@ -90,6 +96,8 @@ init-addrinfo.so init-addrinfo.po $(OUTPRE)init-addrinfo.$(OBJEXT): \
errors.so errors.po $(OUTPRE)errors.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \
$(SRCTOP)/include/k5-err.h $(SRCTOP)/include/k5-platform.h \
$(SRCTOP)/include/k5-thread.h errors.c
+gmt_mktime.so gmt_mktime.po $(OUTPRE)gmt_mktime.$(OBJEXT): \
+ $(BUILDTOP)/include/autoconf.h gmt_mktime.c
fake-addrinfo.so fake-addrinfo.po $(OUTPRE)fake-addrinfo.$(OBJEXT): \
$(BUILDTOP)/include/autoconf.h $(SRCTOP)/include/fake-addrinfo.h \
$(SRCTOP)/include/k5-platform.h $(SRCTOP)/include/k5-thread.h \
diff --git a/src/util/support/gmt_mktime.c b/src/util/support/gmt_mktime.c
new file mode 100644
index 000000000..65ab87349
--- /dev/null
+++ b/src/util/support/gmt_mktime.c
@@ -0,0 +1,127 @@
+/* This code placed in the public domain by Mark W. Eichin */
+
+#include <stdio.h>
+#include "autoconf.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+/* take a struct tm, return seconds from GMT epoch */
+/* like mktime, this ignores tm_wday and tm_yday. */
+/* unlike mktime, this does not set them... it only passes a return value. */
+
+static const int days_in_month[12] = {
+0, /* jan 31 */
+31, /* feb 28 */
+59, /* mar 31 */
+90, /* apr 30 */
+120, /* may 31 */
+151, /* jun 30 */
+181, /* jul 31 */
+212, /* aug 31 */
+243, /* sep 30 */
+273, /* oct 31 */
+304, /* nov 30 */
+334 /* dec 31 */
+};
+
+#define hasleapday(year) (year%400?(year%100?(year%4?0:1):0):1)
+
+time_t krb5int_gmt_mktime(struct tm *t)
+{
+ time_t accum;
+
+#define assert_time(cnd) if(!(cnd)) return (time_t) -1
+
+ /*
+ * For 32-bit signed time_t centered on 1/1/1970, the range is:
+ * time 0x80000000 -> Fri Dec 13 16:45:52 1901
+ * time 0x7fffffff -> Mon Jan 18 22:14:07 2038
+ *
+ * So years 1901 and 2038 are allowable, but we can't encode all
+ * dates in those years, and we're not doing overflow/underflow
+ * checking for such cases.
+ */
+ assert_time(t->tm_year>=1);
+ assert_time(t->tm_year<=138);
+
+ assert_time(t->tm_mon>=0);
+ assert_time(t->tm_mon<=11);
+ assert_time(t->tm_mday>=1);
+ assert_time(t->tm_mday<=31);
+ assert_time(t->tm_hour>=0);
+ assert_time(t->tm_hour<=23);
+ assert_time(t->tm_min>=0);
+ assert_time(t->tm_min<=59);
+ assert_time(t->tm_sec>=0);
+ assert_time(t->tm_sec<=62);
+
+#undef assert_time
+
+
+ accum = t->tm_year - 70;
+ accum *= 365; /* 365 days/normal year */
+
+ /* add in leap day for all previous years */
+ if (t->tm_year >= 70)
+ accum += (t->tm_year - 69) / 4;
+ else
+ accum -= (72 - t->tm_year) / 4;
+ /* add in leap day for this year */
+ if(t->tm_mon >= 2) /* march or later */
+ if(hasleapday((t->tm_year + 1900))) accum += 1;
+
+ accum += days_in_month[t->tm_mon];
+ accum += t->tm_mday-1; /* days of month are the only 1-based field */
+ accum *= 24; /* 24 hour/day */
+ accum += t->tm_hour;
+ accum *= 60; /* 60 minute/hour */
+ accum += t->tm_min;
+ accum *= 60; /* 60 seconds/minute */
+ accum += t->tm_sec;
+
+ return accum;
+}
+
+#ifdef TEST_LEAP
+int
+main (int argc, char *argv[])
+{
+ int yr;
+ time_t t;
+ struct tm tm = {
+ .tm_mon = 0, .tm_mday = 1,
+ .tm_hour = 0, .tm_min = 0, .tm_sec = 0,
+ };
+ for (yr = 60; yr <= 104; yr++)
+ {
+ printf ("1/1/%d%c -> ", 1900 + yr, hasleapday((1900+yr)) ? '*' : ' ');
+ tm.tm_year = yr;
+ t = gmt_mktime (&tm);
+ if (t == (time_t) -1)
+ printf ("-1\n");
+ else
+ {
+ long u;
+ if (t % (24 * 60 * 60))
+ printf ("(not integral multiple of days) ");
+ u = t / (24 * 60 * 60);
+ printf ("%3ld*365%+ld\t0x%08lx\n",
+ (long) (u / 365), (long) (u % 365),
+ (long) t);
+ }
+ }
+ t = 0x80000000, printf ("time 0x%lx -> %s", t, ctime (&t));
+ t = 0x7fffffff, printf ("time 0x%lx -> %s", t, ctime (&t));
+ return 0;
+}
+#endif
diff --git a/src/util/support/libkrb5support.exports b/src/util/support/libkrb5support.exports
index 00ce5c3e3..a7b6c1c98 100644
--- a/src/util/support/libkrb5support.exports
+++ b/src/util/support/libkrb5support.exports
@@ -31,3 +31,4 @@ krb5int_get_error
krb5int_free_error
krb5int_clear_error
krb5int_set_error_info_callout_fn
+krb5int_gmt_mktime