xref: /titanic_50/usr/src/head/time.h (revision dcdfe824b3dff2df12578b936adf1daf000aa129)
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
55  using std::size_t;
56  using std::clock_t;
57  using std::time_t;
58  using std::tm;
59  using std::asctime;
60  using std::clock;
61  using std::ctime;
62  using std::difftime;
63  using std::gmtime;
64  using std::localtime;
65  using std::mktime;
66  using std::time;
67  using std::strftime;
68  #endif
69  
70  #ifdef	__cplusplus
71  extern "C" {
72  #endif
73  
74  #ifndef _CLOCKID_T
75  #define	_CLOCKID_T
76  typedef int	clockid_t;
77  #endif
78  
79  #ifndef _TIMER_T
80  #define	_TIMER_T
81  typedef 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)
87  extern struct tm *gmtime_r(const time_t *_RESTRICT_KYWD,
88  			struct tm *_RESTRICT_KYWD);
89  extern 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 */
100  extern char *__strptime_dontzero(const char *, const char *, struct tm *);
101  #define	strptime	__strptime_dontzero
102  #endif	/* __PRAGMA_REDEFINE_EXTNAME */
103  #endif	/* _STRPTIME_DONTZERO */
104  
105  extern 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
125  union sigval {
126  	int	sival_int;	/* integer value */
127  	void	*sival_ptr;	/* pointer value */
128  };
129  #endif	/* _SIGVAL */
130  
131  #ifndef	_SIGEVENT
132  #define	_SIGEVENT
133  struct 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  
143  extern int clock_getres(clockid_t, struct timespec *);
144  extern int clock_gettime(clockid_t, struct timespec *);
145  extern int clock_settime(clockid_t, const struct timespec *);
146  extern int timer_create(clockid_t, struct sigevent *_RESTRICT_KYWD,
147  		timer_t *_RESTRICT_KYWD);
148  extern int timer_delete(timer_t);
149  extern int timer_getoverrun(timer_t);
150  extern int timer_gettime(timer_t, struct itimerspec *);
151  extern int timer_settime(timer_t, int, const struct itimerspec *_RESTRICT_KYWD,
152  		struct itimerspec *_RESTRICT_KYWD);
153  
154  extern int nanosleep(const struct timespec *, struct timespec *);
155  extern 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  
163  extern void tzset(void);
164  extern 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
169  extern 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__)
177  extern long timezone;
178  extern 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__)
185  extern time_t timegm(struct tm *);
186  extern int cftime(char *, char *, const time_t *);
187  extern int ascftime(char *, const char *, const struct tm *);
188  extern long altzone;
189  #endif
190  
191  #if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
192  	defined(_XPG4_2) || defined(__EXTENSIONS__)
193  extern struct tm *getdate(const char *);
194  #ifdef	_REENTRANT
195  #undef getdate_err
196  #define	getdate_err *(int *)_getdate_err_addr()
197  extern int *_getdate_err_addr(void);
198  #else
199  extern 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
248  extern char *asctime_r(const struct tm *_RESTRICT_KYWD, char *_RESTRICT_KYWD);
249  extern char *ctime_r(const time_t *, char *);
250  #else  /* __PRAGMA_REDEFINE_EXTNAME */
251  
252  extern char *__posix_asctime_r(const struct tm *_RESTRICT_KYWD,
253      char *_RESTRICT_KYWD);
254  extern 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  
263  static char *
asctime_r(const struct tm * _RESTRICT_KYWD __tm,char * _RESTRICT_KYWD __buf)264  asctime_r(const struct tm *_RESTRICT_KYWD __tm, char *_RESTRICT_KYWD __buf)
265  {
266  	return (__posix_asctime_r(__tm, __buf));
267  }
268  
269  static char *
ctime_r(const time_t * __time,char * __buf)270  ctime_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  
280  extern char *asctime_r(const struct tm *, char *, int);
281  extern 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
292  typedef struct _locale *locale_t;
293  #endif
294  
295  extern 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  
308  extern int timespec_get(struct timespec *, int);
309  #endif
310  
311  #ifdef	__cplusplus
312  }
313  #endif
314  
315  #endif	/* _TIME_H */
316