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