Line data Source code
1 : /*
2 : * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions
8 : * are met:
9 : *
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : *
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : *
17 : * 3. Neither the name of the Institute nor the names of its contributors
18 : * may be used to endorse or promote products derived from this software
19 : * without specific prior written permission.
20 : *
21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 : * SUCH DAMAGE.
32 : */
33 :
34 : #include "krb5_locl.h"
35 :
36 : /**
37 : * Set the absolute time that the caller knows the kdc has so the
38 : * kerberos library can calculate the relative diffrence beteen the
39 : * KDC time and local system time.
40 : *
41 : * @param context Keberos 5 context.
42 : * @param sec The applications new of "now" in seconds
43 : * @param usec The applications new of "now" in micro seconds
44 :
45 : * @return Kerberos 5 error code, see krb5_get_error_message().
46 : *
47 : * @ingroup krb5
48 : */
49 :
50 : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
51 8 : krb5_set_real_time (krb5_context context,
52 : krb5_timestamp sec,
53 : int32_t usec)
54 : {
55 0 : struct timeval tv;
56 :
57 8 : gettimeofday(&tv, NULL);
58 :
59 8 : context->kdc_sec_offset = sec - tv.tv_sec;
60 :
61 : /**
62 : * If the caller passes in a negative usec, its assumed to be
63 : * unknown and the function will use the current time usec.
64 : */
65 8 : if (usec >= 0) {
66 8 : context->kdc_usec_offset = usec - tv.tv_usec;
67 :
68 8 : if (context->kdc_usec_offset < 0) {
69 8 : context->kdc_sec_offset--;
70 8 : context->kdc_usec_offset += 1000000;
71 : }
72 : } else
73 0 : context->kdc_usec_offset = tv.tv_usec;
74 :
75 8 : return 0;
76 : }
77 :
78 : /*
79 : * return ``corrected'' time in `timeret'.
80 : */
81 :
82 : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
83 1218861 : krb5_timeofday (krb5_context context,
84 : krb5_timestamp *timeret)
85 : {
86 1218861 : *timeret = time(NULL) + context->kdc_sec_offset;
87 1218861 : return 0;
88 : }
89 :
90 : /*
91 : * like gettimeofday but with time correction to the KDC
92 : */
93 :
94 : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
95 152797 : krb5_us_timeofday (krb5_context context,
96 : krb5_timestamp *sec,
97 : int32_t *usec)
98 : {
99 5483 : struct timeval tv;
100 :
101 152797 : gettimeofday (&tv, NULL);
102 :
103 152797 : *sec = tv.tv_sec + context->kdc_sec_offset;
104 152797 : *usec = tv.tv_usec; /* XXX */
105 152797 : return 0;
106 : }
107 :
108 : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
109 215300 : krb5_format_time(krb5_context context, time_t t,
110 : char *s, size_t len, krb5_boolean include_time)
111 : {
112 7314 : struct tm *tm;
113 215300 : if(context->log_utc)
114 0 : tm = gmtime (&t);
115 : else
116 215300 : tm = localtime(&t);
117 215300 : if(tm == NULL ||
118 215300 : strftime(s, len, include_time ? context->time_fmt : context->date_fmt, tm) == 0)
119 0 : snprintf(s, len, "%ld", (long)t);
120 215300 : return 0;
121 : }
122 :
123 : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
124 12046 : krb5_string_to_deltat(const char *string, krb5_deltat *deltat)
125 : {
126 12046 : if((*deltat = parse_time(string, "s")) == -1)
127 0 : return KRB5_DELTAT_BADFORMAT;
128 11461 : return 0;
129 : }
130 :
131 : krb5_deltat
132 165827 : krb5_time_abs(krb5_deltat t1, krb5_deltat t2)
133 : {
134 165827 : krb5_deltat t = t1 - t2;
135 165827 : if (t < 0)
136 1249 : return -t;
137 159819 : return t;
138 : }
|