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