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 */