1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /* Copyright (c) 1988 AT&T */
22 /* All Rights Reserved */
23
24
25 /*
26 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
28 */
29
30 #ifndef _TIME_H
31 #define _TIME_H
32
33 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.18 */
34
35 #include <sys/feature_tests.h>
36 #include <iso/time_iso.h>
37 #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
38 (_POSIX_C_SOURCE > 2) || defined(__EXTENSIONS__)
39 #include <sys/types.h>
40 #include <sys/time_impl.h>
41 #endif /* (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) ... */
42
43 /*
44 * Allow global visibility for symbols defined in
45 * C++ "std" namespace in <iso/time_iso.h>.
46 */
47 #if __cplusplus >= 199711L
48 using std::size_t;
49 using std::clock_t;
50 using std::time_t;
51 using std::tm;
52 using std::asctime;
53 using std::clock;
54 using std::ctime;
55 using std::difftime;
56 using std::gmtime;
57 using std::localtime;
58 using std::mktime;
59 using std::time;
60 using std::strftime;
61 #endif
62
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66
67 #ifndef _CLOCKID_T
68 #define _CLOCKID_T
69 typedef int clockid_t;
70 #endif
71
72 #ifndef _TIMER_T
73 #define _TIMER_T
74 typedef int timer_t;
75 #endif
76
77 #if defined(__STDC__)
78
79 #if defined(__EXTENSIONS__) || \
80 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
81 (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_REENTRANT)
82 extern struct tm *gmtime_r(const time_t *_RESTRICT_KYWD,
83 struct tm *_RESTRICT_KYWD);
84 extern struct tm *localtime_r(const time_t *_RESTRICT_KYWD,
85 struct tm *_RESTRICT_KYWD);
86 #endif
87
88 #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
89 defined(_XPG4) || defined(__EXTENSIONS__)
90
91 #ifdef _STRPTIME_DONTZERO
92 #ifdef __PRAGMA_REDEFINE_EXTNAME
93 #pragma redefine_extname strptime __strptime_dontzero
94 #else /* __PRAGMA_REDEFINE_EXTNAME */
95 extern char *__strptime_dontzero(const char *, const char *, struct tm *);
96 #define strptime __strptime_dontzero
97 #endif /* __PRAGMA_REDEFINE_EXTNAME */
98 #endif /* _STRPTIME_DONTZERO */
99
100 extern char *strptime(const char *_RESTRICT_KYWD, const char *_RESTRICT_KYWD,
101 struct tm *_RESTRICT_KYWD);
102
103 #endif /* (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))... */
104
105 #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
106 (_POSIX_C_SOURCE > 2) || defined(__EXTENSIONS__)
107 /*
108 * Neither X/Open nor POSIX allow the inclusion of <signal.h> for the
109 * definition of the sigevent structure. Both require the inclusion
110 * of <signal.h> and <time.h> when using the timer_create() function.
111 * However, X/Open also specifies that the sigevent structure be defined
112 * in <time.h> as described in the header <signal.h>. This prevents
113 * compiler warnings for applications that only include <time.h> and not
114 * also <signal.h>. The sigval union and the sigevent structure is
115 * therefore defined both here and in <sys/siginfo.h> which gets included
116 * via inclusion of <signal.h>.
117 */
118 #ifndef _SIGVAL
119 #define _SIGVAL
120 union sigval {
121 int sival_int; /* integer value */
122 void *sival_ptr; /* pointer value */
123 };
124 #endif /* _SIGVAL */
125
126 #ifndef _SIGEVENT
127 #define _SIGEVENT
128 struct sigevent {
129 int sigev_notify; /* notification mode */
130 int sigev_signo; /* signal number */
131 union sigval sigev_value; /* signal value */
132 void (*sigev_notify_function)(union sigval);
133 pthread_attr_t *sigev_notify_attributes;
134 int __sigev_pad2;
135 };
136 #endif /* _SIGEVENT */
137
138 extern int clock_getres(clockid_t, struct timespec *);
139 extern int clock_gettime(clockid_t, struct timespec *);
140 extern int clock_settime(clockid_t, const struct timespec *);
141 extern int timer_create(clockid_t, struct sigevent *_RESTRICT_KYWD,
142 timer_t *_RESTRICT_KYWD);
143 extern int timer_delete(timer_t);
144 extern int timer_getoverrun(timer_t);
145 extern int timer_gettime(timer_t, struct itimerspec *);
146 extern int timer_settime(timer_t, int, const struct itimerspec *_RESTRICT_KYWD,
147 struct itimerspec *_RESTRICT_KYWD);
148
149 extern int nanosleep(const struct timespec *, struct timespec *);
150 extern int clock_nanosleep(clockid_t, int,
151 const struct timespec *, struct timespec *);
152
153 #endif /* (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))... */
154
155 #if !defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX) || \
156 defined(__EXTENSIONS__)
157
158 extern void tzset(void);
159 extern char *tzname[2];
160
161 /* CLK_TCK marked as LEGACY in SUSv2 and removed in SUSv3 */
162 #if !defined(_XPG6) || defined(__EXTENSIONS__)
163 #ifndef CLK_TCK
164 extern long _sysconf(int); /* System Private interface to sysconf() */
165 #define CLK_TCK ((clock_t)_sysconf(3)) /* clock ticks per second */
166 /* 3 is _SC_CLK_TCK */
167 #endif
168 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
169
170 #if (!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
171 defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
172 extern long timezone;
173 extern int daylight;
174 #endif
175
176 #endif /* !defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX)... */
177
178 #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
179 defined(__EXTENSIONS__)
180 extern int cftime(char *, char *, const time_t *);
181 extern int ascftime(char *, const char *, const struct tm *);
182 extern long altzone;
183 #endif
184
185 #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
186 defined(_XPG4_2) || defined(__EXTENSIONS__)
187 extern struct tm *getdate(const char *);
188 #ifdef _REENTRANT
189 #undef getdate_err
190 #define getdate_err *(int *)_getdate_err_addr()
191 extern int *_getdate_err_addr(void);
192 #else
193 extern int getdate_err;
194 #endif /* _REENTRANT */
195 #endif /* (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))... */
196
197 #else /* __STDC__ */
198
199 extern int cftime(), ascftime();
200 extern void tzset();
201
202 #ifdef _STRPTIME_DONTZERO
203 #ifdef __PRAGMA_REDEFINE_EXTNAME
204 #pragma redefine_extname strptime __strptime_dontzero
205 #else /* __PRAGMA_REDEFINE_EXTNAME */
206 extern char *__strptime_dontzero();
207 #define strptime __strptime_dontzero
208 #endif /* __PRAGMA_REDEFINE_EXTNAME */
209 #endif /* _STRPTIME_DONTZERO */
210
211 extern char *strptime();
212
213 #if defined(__EXTENSIONS__) || \
214 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
215 (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_REENTRANT)
216 extern struct tm *gmtime_r();
217 extern struct tm *localtime_r();
218 #endif
219
220 extern long timezone, altzone;
221 extern int daylight;
222 extern char *tzname[2];
223
224 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2) || defined(__EXTENSIONS__)
225 extern struct tm *getdate();
226 #ifdef _REENTRANT
227 #undef getdate_err
228 #define getdate_err *(int *)_getdate_err_addr()
229 extern int *_getdate_err_addr();
230 #else
231 extern int getdate_err;
232 #endif /* _REENTRANT */
233 #endif /* !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2)... */
234
235 #endif /* __STDC__ */
236
237 /*
238 * ctime_r() & asctime_r() prototypes are defined here.
239 */
240
241 /*
242 * Previous releases of Solaris, starting at 2.3, provided definitions of
243 * various functions as specified in POSIX.1c, Draft 6. For some of these
244 * functions, the final POSIX 1003.1c standard had a different number of
245 * arguments and return values.
246 *
247 * The following segment of this header provides support for the standard
248 * interfaces while supporting applications written under earlier
249 * releases. The application defines appropriate values of the feature
250 * test macros _POSIX_C_SOURCE and _POSIX_PTHREAD_SEMANTICS to indicate
251 * whether it was written to expect the Draft 6 or standard versions of
252 * these interfaces, before including this header. This header then
253 * provides a mapping from the source version of the interface to an
254 * appropriate binary interface. Such mappings permit an application
255 * to be built from libraries and objects which have mixed expectations
256 * of the definitions of these functions.
257 *
258 * For applications using the Draft 6 definitions, the binary symbol is the
259 * same as the source symbol, and no explicit mapping is needed. For the
260 * standard interface, the function func() is mapped to the binary symbol
261 * _posix_func(). The preferred mechanism for the remapping is a compiler
262 * #pragma. If the compiler does not provide such a #pragma, the header file
263 * defines a static function func() which calls the _posix_func() version;
264 * this has to be done instead of #define since POSIX specifies that an
265 * application can #undef the symbol and still be bound to the correct
266 * implementation. Unfortunately, the statics confuse lint so we fallback to
267 * #define in that case.
268 *
269 * NOTE: Support for the Draft 6 definitions is provided for compatibility
270 * only. New applications/libraries should use the standard definitions.
271 */
272
273 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
274 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
275 (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
276
277 #if defined(__STDC__)
278
279 #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
280
281 #ifdef __PRAGMA_REDEFINE_EXTNAME
282 #pragma redefine_extname ctime_r __posix_ctime_r
283 #pragma redefine_extname asctime_r __posix_asctime_r
284 extern char *asctime_r(const struct tm *_RESTRICT_KYWD, char *_RESTRICT_KYWD);
285 extern char *ctime_r(const time_t *, char *);
286 #else /* __PRAGMA_REDEFINE_EXTNAME */
287
288 extern char *__posix_asctime_r(const struct tm *_RESTRICT_KYWD,
289 char *_RESTRICT_KYWD);
290 extern char *__posix_ctime_r(const time_t *, char *);
291
292 #ifdef __lint
293
294 #define ctime_r __posix_ctime_r
295 #define asctime_r __posix_asctime_r
296
297 #else /* !__lint */
298
299 static char *
asctime_r(const struct tm * _RESTRICT_KYWD __tm,char * _RESTRICT_KYWD __buf)300 asctime_r(const struct tm *_RESTRICT_KYWD __tm, char *_RESTRICT_KYWD __buf)
301 {
302 return (__posix_asctime_r(__tm, __buf));
303 }
304
305 static char *
ctime_r(const time_t * __time,char * __buf)306 ctime_r(const time_t *__time, char *__buf)
307 {
308 return (__posix_ctime_r(__time, __buf));
309 }
310
311 #endif /* !__lint */
312 #endif /* __PRAGMA_REDEFINE_EXTNAME */
313
314 #else /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
315
316 extern char *asctime_r(const struct tm *, char *, int);
317 extern char *ctime_r(const time_t *, char *, int);
318
319 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
320
321 #else /* __STDC__ */
322
323 #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
324
325 #ifdef __PRAGMA_REDEFINE_EXTNAME
326 #pragma redefine_extname asctime_r __posix_asctime_r
327 #pragma redefine_extname ctime_r __posix_ctime_r
328 extern char *asctime_r();
329 extern char *ctime_r();
330 #else /* __PRAGMA_REDEFINE_EXTNAME */
331
332 extern char *__posix_asctime_r();
333 extern char *__posix_ctime_r();
334
335 #ifdef __lint
336
337 #define asctime_r __posix_asctime_r
338 #define ctime_r __posix_ctime_r
339
340 #else /* !__lint */
341
342 static char *
asctime_r(__tm,__buf)343 asctime_r(__tm, __buf)
344 struct tm *__tm;
345 char *__buf;
346 {
347 return (__posix_asctime_r(__tm, __buf));
348 }
349 static char *
ctime_r(__time,__buf)350 ctime_r(__time, __buf)
351 time_t *__time;
352 char *__buf;
353 {
354 return (__posix_ctime_r(__time, __buf));
355 }
356
357 #endif /* !__lint */
358 #endif /* __PRAGMA_REDEFINE_EXTNAME */
359
360 #else /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
361
362 extern char *asctime_r();
363 extern char *ctime_r();
364
365 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
366
367 #endif /* __STDC__ */
368
369 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT)... */
370
371 #ifdef __cplusplus
372 }
373 #endif
374
375 #endif /* _TIME_H */
376