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