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