Xos_r.h
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:36k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Xorg: Xos_r.h,v 1.4 2001/02/09 02:03:22 xorgcvs Exp $ */
  2. /* $XdotOrg: proto/X11/Xos_r.h,v 1.5 2005/07/13 07:23:56 keithp Exp $ */
  3. /*
  4. Copyright 1996, 1998  The Open Group
  5. Permission to use, copy, modify, distribute, and sell this software and its
  6. documentation for any purpose is hereby granted without fee, provided that
  7. the above copyright notice appear in all copies and that both that
  8. copyright notice and this permission notice appear in supporting
  9. documentation.
  10. The above copyright notice and this permission notice shall be included in
  11. all copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
  15. OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  16. AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  17. CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  18. Except as contained in this notice, the name of The Open Group shall not be
  19. used in advertising or otherwise to promote the sale, use or other dealings
  20. in this Software without prior written authorization from The Open Group.
  21. */
  22. /* $XFree86: xc/include/Xos_r.h,v 1.18tsi Exp $ */
  23. /*
  24.  * Various and sundry Thread-Safe functions used by X11, Motif, and CDE.
  25.  *
  26.  * Use this file in MT-safe code where you would have included
  27.  * <dirent.h> for readdir()
  28.  * <grp.h> for getgrgid() or getgrnam()
  29.  * <netdb.h> for gethostbyname(), gethostbyaddr(), or getservbyname()
  30.  * <pwd.h> for getpwnam() or getpwuid()
  31.  * <string.h> for strtok()
  32.  * <time.h> for asctime(), ctime(), localtime(), or gmtime()
  33.  * <unistd.h> for getlogin() or ttyname()
  34.  * or their thread-safe analogs.
  35.  *
  36.  * If you are on a platform that defines XTHREADS but does not have
  37.  * MT-safe system API (e.g. UnixWare) you must define _Xos_processLock
  38.  * and _Xos_processUnlock macros before including this header.  If
  39.  * you are on OSF/1 V3.2 and plan to use readdir(), you must also define
  40.  * _Xos_isThreadInitialized.  For convenience XOS_USE_XLIB_LOCKING or
  41.  * XOS_USE_XT_LOCKING may be defined to obtain either Xlib-only or
  42.  * Xt-based versions of these macros.  These macros won't result in
  43.  * truly thread-safe calls, but they are better than nothing.  If you
  44.  * do not want locking in this situation define XOS_USE_NO_LOCKING.
  45.  *
  46.  * NOTE: On systems lacking appropriate _r functions Gethostbyname(),
  47.  * Gethostbyaddr(), and Getservbyname() do NOT copy the host or
  48.  * protocol lists!
  49.  *
  50.  * NOTE: On systems lacking appropriate _r functions Getgrgid() and
  51.  * Getgrnam() do NOT copy the list of group members!
  52.  *
  53.  * This header is nominally intended to simplify porting X11, Motif, and
  54.  * CDE; it may be useful to other people too.  The structure below is
  55.  * complicated, mostly because P1003.1c (the IEEE POSIX Threads spec)
  56.  * went through lots of drafts, and some vendors shipped systems based
  57.  * on draft API that were changed later.  Unfortunately POSIX did not
  58.  * provide a feature-test macro for distinguishing each of the drafts.
  59.  */
  60. /*
  61.  * This header has several parts.  Search for "Effective prototypes"
  62.  * to locate the beginning of a section.
  63.  */
  64. /* This header can be included multiple times with different defines! */
  65. #ifndef _XOS_R_H_
  66. # define _XOS_R_H_
  67. # include <X11/Xos.h>
  68. # include <X11/Xfuncs.h>
  69. # ifndef X_NOT_POSIX
  70. #  ifdef _POSIX_SOURCE
  71. #   include <limits.h>
  72. #  else
  73. #   define _POSIX_SOURCE
  74. #   include <limits.h>
  75. #   undef _POSIX_SOURCE
  76. #  endif
  77. #  ifndef LINE_MAX
  78. #   define X_LINE_MAX 2048
  79. #  else
  80. #   define X_LINE_MAX LINE_MAX
  81. #  endif
  82. # endif
  83. #endif /* _XOS_R_H */
  84. #ifndef WIN32
  85. #ifdef __cplusplus
  86. extern "C" {
  87. #endif
  88. # if defined(XOS_USE_XLIB_LOCKING)
  89. #  ifndef XAllocIDs /* Xlibint.h does not have multiple include protection */
  90. typedef struct _LockInfoRec *LockInfoPtr;
  91. extern LockInfoPtr _Xglobal_lock;
  92. #  endif
  93. #  ifndef _Xos_isThreadInitialized
  94. #   define _Xos_isThreadInitialized (_Xglobal_lock)
  95. #  endif
  96. #  if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
  97. #   ifndef XAllocIDs /* Xlibint.h does not have multiple include protection */
  98. #    include <X11/Xfuncproto.h> /* for NeedFunctionPrototypes */
  99. extern void (*_XLockMutex_fn)(
  100. #    if NeedFunctionPrototypes
  101.     LockInfoPtr /* lock */, char * /* file */, int /* line */
  102. #    endif
  103. );
  104. extern void (*_XUnlockMutex_fn)(
  105. #    if NeedFunctionPrototypes
  106.     LockInfoPtr /* lock */, char * /* file */, int /* line */
  107. #    endif
  108. );
  109. #   endif
  110. #   ifndef _Xos_processLock
  111. #    define _Xos_processLock
  112.   (_XLockMutex_fn ? (*_XLockMutex_fn)(_Xglobal_lock,__FILE__,__LINE__) : 0)
  113. #   endif
  114. #   ifndef _Xos_processUnlock
  115. #    define _Xos_processUnlock
  116.   (_XUnlockMutex_fn ? (*_XUnlockMutex_fn)(_Xglobal_lock,__FILE__,__LINE__) : 0)
  117. #   endif
  118. #  else
  119. #   ifndef XAllocIDs /* Xlibint.h does not have multiple include protection */
  120. #    include <X11/Xfuncproto.h> /* for NeedFunctionPrototypes */
  121. extern void (*_XLockMutex_fn)(
  122. #    if NeedFunctionPrototypes
  123.     LockInfoPtr /* lock */
  124. #    endif
  125. );
  126. extern void (*_XUnlockMutex_fn)(
  127. #    if NeedFunctionPrototypes
  128.     LockInfoPtr /* lock */
  129. #    endif
  130. );
  131. #   endif
  132. #   ifndef _Xos_processLock
  133. #    define _Xos_processLock
  134.   (_XLockMutex_fn ? ((*_XLockMutex_fn)(_Xglobal_lock), 0) : 0)
  135. #   endif
  136. #   ifndef _Xos_processUnlock
  137. #    define _Xos_processUnlock
  138.   (_XUnlockMutex_fn ? ((*_XUnlockMutex_fn)(_Xglobal_lock), 0) : 0)
  139. #   endif
  140. #  endif
  141. # elif defined(XOS_USE_XT_LOCKING)
  142. #  ifndef _XtThreadsI_h
  143. extern void (*_XtProcessLock)(void);
  144. #  endif
  145. #  ifndef _XtintrinsicP_h
  146. #   include <X11/Xfuncproto.h> /* for NeedFunctionPrototypes */
  147. extern void XtProcessLock(
  148. #   if NeedFunctionPrototypes
  149.     void
  150. #   endif
  151. );
  152. extern void XtProcessUnlock(
  153. #   if NeedFunctionPrototypes
  154.     void
  155. #   endif
  156. );
  157. #  endif
  158. #  ifndef _Xos_isThreadInitialized
  159. #   define _Xos_isThreadInitialized _XtProcessLock
  160. #  endif
  161. #  ifndef _Xos_processLock
  162. #   define _Xos_processLock XtProcessLock()
  163. #  endif
  164. #  ifndef _Xos_processUnlock
  165. #   define _Xos_processUnlock XtProcessUnlock()
  166. #  endif
  167. # elif defined(XOS_USE_NO_LOCKING)
  168. #  ifndef _Xos_isThreadInitialized
  169. #   define _Xos_isThreadInitialized 0
  170. #  endif
  171. #  ifndef _Xos_processLock
  172. #   define _Xos_processLock 0
  173. #  endif
  174. #  ifndef _Xos_processUnlock
  175. #   define _Xos_processUnlock 0
  176. #  endif
  177. # endif
  178. #endif /* !defined WIN32 */
  179. /*
  180.  * Solaris defines the POSIX thread-safe feature test macro, but
  181.  * uses the older SVR4 thread-safe functions unless the POSIX ones
  182.  * are specifically requested.  Fix the feature test macro.
  183.  */
  184. #if defined(sun) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && 
  185. (_POSIX_C_SOURCE - 0 < 199506L) && !defined(_POSIX_PTHREAD_SEMANTICS)
  186. # undef _POSIX_THREAD_SAFE_FUNCTIONS
  187. #endif
  188. /*
  189.  * LynxOS 3.1 defines _POSIX_THREAD_SAFE_FUNCTIONS but
  190.  * getpwuid_r has different semantics than defined by POSIX
  191.  */
  192. #if defined(Lynx) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  193. # undef _POSIX_THREAD_SAFE_FUNCTIONS
  194. #endif
  195. /***** <pwd.h> wrappers *****/
  196. /*
  197.  * Effective prototypes for <pwd.h> wrappers:
  198.  *
  199.  * #define X_INCLUDE_PWD_H
  200.  * #define XOS_USE_..._LOCKING
  201.  * #include <X11/Xos_r.h>
  202.  *
  203.  * typedef ... _Xgetpwparams;
  204.  *
  205.  * struct passwd* _XGetpwnam(const char *name, _Xgetpwparams);
  206.  * struct passwd* _XGetpwuid(uid_t uid, _Xgetpwparams);
  207.  */
  208. #if defined(X_INCLUDE_PWD_H) && !defined(_XOS_INCLUDED_PWD_H)
  209. # include <pwd.h>
  210. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_PWDAPI)
  211. #  define XOS_USE_MTSAFE_PWDAPI 1
  212. # endif
  213. #endif
  214. #undef X_NEEDS_PWPARAMS
  215. #if !defined(X_INCLUDE_PWD_H) || defined(_XOS_INCLUDED_PWD_H)
  216. /* Do nothing */
  217. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  218. /* Use regular, unsafe API. */
  219. # if defined(X_NOT_POSIX) && !defined(__i386__) && !defined(SYSV)
  220. extern struct passwd *getpwuid(), *getpwnam();
  221. # endif
  222. typedef int _Xgetpwparams; /* dummy */
  223. # define _XGetpwuid(u,p) getpwuid((u))
  224. # define _XGetpwnam(u,p) getpwnam((u))
  225. #elif !defined(XOS_USE_MTSAFE_PWDAPI) || defined(XNO_MTSAFE_PWDAPI)
  226. /* UnixWare 2.0, or other systems with thread support but no _r API. */
  227. # define X_NEEDS_PWPARAMS
  228. typedef struct {
  229.   struct passwd pws;
  230.   char   pwbuf[1024];
  231.   struct passwd* pwp;
  232.   size_t len;
  233. } _Xgetpwparams;
  234. /*
  235.  * NetBSD and FreeBSD, at least, are missing several of the unixware passwd
  236.  * fields.
  237.  */
  238. #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || 
  239.     defined(__APPLE__) || defined(__DragonFly__)
  240. static __inline__ void _Xpw_copyPasswd(_Xgetpwparams p)
  241. {
  242.    memcpy(&(p).pws, (p).pwp, sizeof(struct passwd));
  243.    (p).pws.pw_name = (p).pwbuf;
  244.    (p).len = strlen((p).pwp->pw_name);
  245.    strcpy((p).pws.pw_name, (p).pwp->pw_name);
  246.    (p).pws.pw_passwd = (p).pws.pw_name + (p).len + 1;
  247.    (p).len = strlen((p).pwp->pw_passwd);
  248.    strcpy((p).pws.pw_passwd,(p).pwp->pw_passwd);
  249.    (p).pws.pw_class = (p).pws.pw_passwd + (p).len + 1;
  250.    (p).len = strlen((p).pwp->pw_class);
  251.    strcpy((p).pws.pw_class, (p).pwp->pw_class);
  252.    (p).pws.pw_gecos = (p).pws.pw_class + (p).len + 1;
  253.    (p).len = strlen((p).pwp->pw_gecos);
  254.    strcpy((p).pws.pw_gecos, (p).pwp->pw_gecos);
  255.    (p).pws.pw_dir = (p).pws.pw_gecos + (p).len + 1;
  256.    (p).len = strlen((p).pwp->pw_dir);
  257.    strcpy((p).pws.pw_dir, (p).pwp->pw_dir);
  258.    (p).pws.pw_shell = (p).pws.pw_dir + (p).len + 1;
  259.    (p).len = strlen((p).pwp->pw_shell);
  260.    strcpy((p).pws.pw_shell, (p).pwp->pw_shell);
  261.    (p).pwp = &(p).pws;
  262. }
  263. #else
  264. # define _Xpw_copyPasswd(p) 
  265.    (memcpy(&(p).pws, (p).pwp, sizeof(struct passwd)), 
  266.     ((p).pws.pw_name = (p).pwbuf), 
  267.     ((p).len = strlen((p).pwp->pw_name)), 
  268.     strcpy((p).pws.pw_name, (p).pwp->pw_name), 
  269.     ((p).pws.pw_passwd = (p).pws.pw_name + (p).len + 1), 
  270.     ((p).len = strlen((p).pwp->pw_passwd)), 
  271.     strcpy((p).pws.pw_passwd,(p).pwp->pw_passwd), 
  272.     ((p).pws.pw_age = (p).pws.pw_passwd + (p).len + 1), 
  273.     ((p).len = strlen((p).pwp->pw_age)), 
  274.     strcpy((p).pws.pw_age, (p).pwp->pw_age), 
  275.     ((p).pws.pw_comment = (p).pws.pw_age + (p).len + 1), 
  276.     ((p).len = strlen((p).pwp->pw_comment)), 
  277.     strcpy((p).pws.pw_comment, (p).pwp->pw_comment), 
  278.     ((p).pws.pw_gecos = (p).pws.pw_comment + (p).len + 1), 
  279.     ((p).len = strlen((p).pwp->pw_gecos)), 
  280.     strcpy((p).pws.pw_gecos, (p).pwp->pw_gecos), 
  281.     ((p).pws.pw_dir = (p).pws.pw_comment + (p).len + 1), 
  282.     ((p).len = strlen((p).pwp->pw_dir)), 
  283.     strcpy((p).pws.pw_dir, (p).pwp->pw_dir), 
  284.     ((p).pws.pw_shell = (p).pws.pw_dir + (p).len + 1), 
  285.     ((p).len = strlen((p).pwp->pw_shell)), 
  286.     strcpy((p).pws.pw_shell, (p).pwp->pw_shell), 
  287.     ((p).pwp = &(p).pws), 
  288.     0 )
  289. #endif
  290. # define _XGetpwuid(u,p) 
  291. ( (_Xos_processLock), 
  292.   (((p).pwp = getpwuid((u))) ? _Xpw_copyPasswd(p), 0 : 0), 
  293.   (_Xos_processUnlock), 
  294.   (p).pwp )
  295. # define _XGetpwnam(u,p) 
  296. ( (_Xos_processLock), 
  297.   (((p).pwp = getpwnam((u))) ? _Xpw_copyPasswd(p), 0 : 0), 
  298.   (_Xos_processUnlock), 
  299.   (p).pwp )
  300. #elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__)
  301. /* SVR4 threads, AIX 4.2.0 and earlier and OSF/1 3.2 and earlier pthreads */
  302. # define X_NEEDS_PWPARAMS
  303. typedef struct {
  304.   struct passwd pws;
  305.   char pwbuf[X_LINE_MAX];
  306. } _Xgetpwparams;
  307. # if defined(_POSIX_REENTRANT_FUNCTIONS) || !defined(SVR4) || defined(Lynx)
  308. #  ifndef Lynx
  309. #   define _XGetpwuid(u,p) 
  310. ((getpwuid_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf)) == -1) ? NULL : &(p).pws)
  311. #   define _XGetpwnam(u,p) 
  312. ((getpwnam_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf)) == -1) ? NULL : &(p).pws)
  313. #  else /* Lynx */
  314. #   define _XGetpwuid(u,p) 
  315. ((getpwuid_r(&(p).pws,(u),(p).pwbuf,sizeof((p).pwbuf)) == -1) ? NULL : &(p).pws)
  316. #   define _XGetpwnam(u,p) 
  317. ((getpwnam_r(&(p).pws,(u),(p).pwbuf,sizeof((p).pwbuf)) == -1) ? NULL : &(p).pws)
  318. #  endif
  319. # else /* SVR4 */
  320. #  define _XGetpwuid(u,p) 
  321. ((getpwuid_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf)) == NULL) ? NULL : &(p).pws)
  322. #  define _XGetpwnam(u,p) 
  323. ((getpwnam_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf)) == NULL) ? NULL : &(p).pws)
  324. # endif /* SVR4 */
  325. #else /* _POSIX_THREAD_SAFE_FUNCTIONS */
  326. /* Digital UNIX 4.0, but not (beta) T4.0-1 */
  327. # if defined(__osf__)
  328. /* OSF/1 V4.0 <pwd.h> doesn't declare the _P routines, breaking under C++. */
  329. extern int _Pgetpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **);
  330. extern int _Pgetpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **);
  331. # endif
  332. # define X_NEEDS_PWPARAMS
  333. typedef struct {
  334.   struct passwd pws;
  335.   char pwbuf[X_LINE_MAX];
  336.   struct passwd* pwp;
  337. } _Xgetpwparams;
  338. typedef int _Xgetpwret;
  339. # define _XGetpwuid(u,p) 
  340. ((getpwuid_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf),&(p).pwp) == 0) ? 
  341.  (p).pwp : NULL)
  342. # define _XGetpwnam(u,p) 
  343. ((getpwnam_r((u),&(p).pws,(p).pwbuf,sizeof((p).pwbuf),&(p).pwp) == 0) ? 
  344.  (p).pwp : NULL)
  345. #endif /* X_INCLUDE_PWD_H */
  346. #if defined(X_INCLUDE_PWD_H) && !defined(_XOS_INCLUDED_PWD_H)
  347. # define _XOS_INCLUDED_PWD_H
  348. #endif
  349. /***** <netdb.h> wrappers *****/
  350. /*
  351.  * Effective prototypes for <netdb.h> wrappers:
  352.  *
  353.  * NOTE: On systems lacking the appropriate _r functions Gethostbyname(),
  354.  * Gethostbyaddr(), and Getservbyname() do NOT copy the host or
  355.  * protocol lists!
  356.  *
  357.  * #define X_INCLUDE_NETDB_H
  358.  * #define XOS_USE_..._LOCKING
  359.  * #include <X11/Xos_r.h>
  360.  *
  361.  * typedef ... _Xgethostbynameparams;
  362.  * typedef ... _Xgetservbynameparams;
  363.  *
  364.  * struct hostent* _XGethostbyname(const char* name,_Xgethostbynameparams);
  365.  * struct hostent* _XGethostbyaddr(const char* addr, int len, int type,
  366.  *    _Xgethostbynameparams);
  367.  * struct servent* _XGetservbyname(const char* name, const char* proto,
  368.  *  _Xgetservbynameparams);
  369.  */
  370. #undef XTHREADS_NEEDS_BYNAMEPARAMS
  371. #if defined(X_INCLUDE_NETDB_H) && !defined(_XOS_INCLUDED_NETDB_H) 
  372.     && !defined(WIN32)
  373. # include <netdb.h>
  374. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_NETDBAPI)
  375. #  define XOS_USE_MTSAFE_NETDBAPI 1
  376. # endif
  377. #endif
  378. #if !defined(X_INCLUDE_NETDB_H) || defined(_XOS_INCLUDED_NETDB_H)
  379. /* Do nothing. */
  380. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  381. /* Use regular, unsafe API. */
  382. typedef int _Xgethostbynameparams; /* dummy */
  383. typedef int _Xgetservbynameparams; /* dummy */
  384. # define _XGethostbyname(h,hp) gethostbyname((h))
  385. # define _XGethostbyaddr(a,al,t,hp) gethostbyaddr((a),(al),(t))
  386. # define _XGetservbyname(s,p,sp) getservbyname((s),(p))
  387. #elif !defined(XOS_USE_MTSAFE_NETDBAPI) || defined(XNO_MTSAFE_NETDBAPI)
  388. /* UnixWare 2.0, or other systems with thread support but no _r API. */
  389. /* WARNING:  The h_addr_list and s_aliases values are *not* copied! */
  390. #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
  391. #include <sys/param.h>
  392. #endif
  393. typedef struct {
  394.   struct hostent hent;
  395.   char           h_name[MAXHOSTNAMELEN];
  396.   struct hostent *hptr;
  397. } _Xgethostbynameparams;
  398. typedef struct {
  399.   struct servent sent;
  400.   char           s_name[255];
  401.   char  s_proto[255];
  402.   struct servent *sptr;
  403. } _Xgetservbynameparams;
  404. # define XTHREADS_NEEDS_BYNAMEPARAMS
  405. # define _Xg_copyHostent(hp) 
  406.    (memcpy(&(hp).hent, (hp).hptr, sizeof(struct hostent)), 
  407.     strcpy((hp).h_name, (hp).hptr->h_name), 
  408.     ((hp).hent.h_name = (hp).h_name), 
  409.     ((hp).hptr = &(hp).hent), 
  410.      0 )
  411. # define _Xg_copyServent(sp) 
  412.    (memcpy(&(sp).sent, (sp).sptr, sizeof(struct servent)), 
  413.     strcpy((sp).s_name, (sp).sptr->s_name), 
  414.     ((sp).sent.s_name = (sp).s_name), 
  415.     strcpy((sp).s_proto, (sp).sptr->s_proto), 
  416.     ((sp).sent.s_proto = (sp).s_proto), 
  417.     ((sp).sptr = &(sp).sent), 
  418.     0 )
  419. # define _XGethostbyname(h,hp) 
  420.    ((_Xos_processLock), 
  421.     (((hp).hptr = gethostbyname((h))) ? _Xg_copyHostent(hp) : 0), 
  422.     (_Xos_processUnlock), 
  423.     (hp).hptr )
  424. # define _XGethostbyaddr(a,al,t,hp) 
  425.    ((_Xos_processLock), 
  426.     (((hp).hptr = gethostbyaddr((a),(al),(t))) ? _Xg_copyHostent(hp) : 0), 
  427.     (_Xos_processUnlock), 
  428.     (hp).hptr )
  429. # define _XGetservbyname(s,p,sp) 
  430.    ((_Xos_processLock), 
  431.     (((sp).sptr = getservbyname((s),(p))) ? _Xg_copyServent(sp) : 0), 
  432.     (_Xos_processUnlock), 
  433.     (sp).sptr )
  434. #elif defined(XUSE_NETDB_R_API)
  435. /*
  436.  * POSIX does not specify _r equivalents for <netdb.h> API, but some
  437.  * vendors provide them anyway.  Use them only when explicitly asked.
  438.  */
  439. # ifdef _POSIX_REENTRANT_FUNCTIONS
  440. #  ifndef _POSIX_THREAD_SAFE_FUNCTIONS
  441. #   if defined(AIXV3) || defined(AIXV4) || defined(__osf__)
  442. #    define X_POSIX_THREAD_SAFE_FUNCTIONS 1
  443. #   endif
  444. #  endif
  445. # endif
  446. # ifdef _POSIX_THREAD_SAFE_FUNCTIONS
  447. #  define X_POSIX_THREAD_SAFE_FUNCTIONS 1
  448. # endif
  449. # define XTHREADS_NEEDS_BYNAMEPARAMS
  450. # ifndef X_POSIX_THREAD_SAFE_FUNCTIONS
  451. typedef struct {
  452.     struct hostent      hent;
  453.     char                hbuf[X_LINE_MAX];
  454.     int                 herr;
  455. } _Xgethostbynameparams;
  456. typedef struct {
  457.     struct servent      sent;
  458.     char                sbuf[X_LINE_MAX];
  459. } _Xgetservbynameparams;
  460. #  define _XGethostbyname(h,hp) 
  461.   gethostbyname_r((h),&(hp).hent,(hp).hbuf,sizeof((hp).hbuf),&(hp).herr)
  462. #  define _XGethostbyaddr(a,al,t,hp) 
  463.   gethostbyaddr_r((a),(al),(t),&(hp).hent,(hp).hbuf,sizeof((hp).hbuf),&(hp).herr)
  464. #  define _XGetservbyname(s,p,sp) 
  465.   getservbyname_r((s),(p),&(sp).sent,(sp).sbuf,sizeof((sp).sbuf))
  466. # else
  467. typedef struct {
  468.   struct hostent      hent;
  469.   struct hostent_data hdata;
  470. } _Xgethostbynameparams;
  471. typedef struct {
  472.   struct servent      sent;
  473.   struct servent_data sdata;
  474. } _Xgetservbynameparams;
  475. #  define _XGethostbyname(h,hp) 
  476.   (bzero((char*)&(hp).hdata,sizeof((hp).hdata)),
  477.    ((gethostbyname_r((h),&(hp).hent,&(hp).hdata) == -1) ? NULL : &(hp).hent))
  478. #  define _XGethostbyaddr(a,al,t,hp) 
  479.   (bzero((char*)&(hp).hdata,sizeof((hp).hdata)),
  480.    ((gethostbyaddr_r((a),(al),(t),&(hp).hent,&(hp).hdata) == -1) ? NULL : &(hp).hent))
  481. #  define _XGetservbyname(s,p,sp) 
  482.   (bzero((char*)&(sp).sdata,sizeof((sp).sdata)),
  483.    ((getservbyname_r((s),(p),&(sp).sent,&(sp).sdata) == -1) ? NULL : &(sp).sent) )
  484. # endif
  485. # ifdef X_POSIX_THREAD_SAFE_FUNCTIONS
  486. #  undef X_POSIX_THREAD_SAFE_FUNCTIONS
  487. # endif
  488. #else
  489. /* The regular API is assumed to be MT-safe under POSIX. */
  490. typedef int _Xgethostbynameparams; /* dummy */
  491. typedef int _Xgetservbynameparams; /* dummy */
  492. # define _XGethostbyname(h,hp) gethostbyname((h))
  493. # define _XGethostbyaddr(a,al,t,hp) gethostbyaddr((a),(al),(t))
  494. # define _XGetservbyname(s,p,sp) getservbyname((s),(p))
  495. #endif /* X_INCLUDE_NETDB_H */
  496. #if defined(X_INCLUDE_NETDB_H) && !defined(_XOS_INCLUDED_NETDB_H)
  497. # define _XOS_INCLUDED_NETDB_H
  498. #endif
  499. /***** <dirent.h> wrappers *****/
  500. /*
  501.  * Effective prototypes for <dirent.h> wrappers:
  502.  *
  503.  * #define X_INCLUDE_DIRENT_H
  504.  * #define XOS_USE_..._LOCKING
  505.  * #include <X11/Xos_r.h>
  506.  *
  507.  * typedef ... _Xreaddirparams;
  508.  *
  509.  * struct dirent *_XReaddir(DIR *dir_pointer, _Xreaddirparams);
  510.  */
  511. #if defined(X_INCLUDE_DIRENT_H) && !defined(_XOS_INCLUDED_DIRENT_H)
  512. # include <sys/types.h>
  513. # if !defined(X_NOT_POSIX) || defined(SYSV) || defined(USG)
  514. #  include <dirent.h>
  515. # else
  516. #  include <sys/dir.h>
  517. #  ifndef dirent
  518. #   define dirent direct
  519. #  endif
  520. # endif
  521. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_DIRENTAPI)
  522. #  define XOS_USE_MTSAFE_DIRENTAPI 1
  523. # endif
  524. #endif
  525. #if !defined(X_INCLUDE_DIRENT_H) || defined(_XOS_INCLUDED_DIRENT_H)
  526. /* Do nothing. */
  527. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  528. /* Use regular, unsafe API. */
  529. typedef int _Xreaddirparams; /* dummy */
  530. # define _XReaddir(d,p) readdir(d)
  531. #elif !defined(XOS_USE_MTSAFE_DIRENTAPI) || defined(XNO_MTSAFE_DIRENTAPI)
  532. /* Systems with thread support but no _r API. */
  533. typedef struct {
  534.   struct dirent *result;
  535.   struct dirent dir_entry;
  536. # ifdef _POSIX_PATH_MAX
  537.   char buf[_POSIX_PATH_MAX];
  538. # elif defined(NAME_MAX)
  539.   char buf[NAME_MAX];
  540. # else
  541.   char buf[255];
  542. # endif
  543. } _Xreaddirparams;
  544. # define _XReaddir(d,p)
  545.  ( (_Xos_processLock),  
  546.    (((p).result = readdir((d))) ?  
  547.     (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen), 
  548.      ((p).result = &(p).dir_entry), 0) :  
  549.     0),  
  550.    (_Xos_processUnlock),  
  551.    (p).result )
  552. #else
  553. typedef struct {
  554.   struct dirent *result;
  555.   struct dirent dir_entry;
  556. # ifdef _POSIX_PATH_MAX
  557.   char buf[_POSIX_PATH_MAX];
  558. # elif defined(NAME_MAX)
  559.   char buf[NAME_MAX];
  560. # else
  561.   char buf[255];
  562. # endif
  563. } _Xreaddirparams;
  564. # if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(AIXV3) || 
  565.      defined(AIXV4) || defined(__APPLE__)
  566. /* AIX defines the draft POSIX symbol, but uses the final API. */
  567. /* POSIX final API, returns (int)0 on success. */
  568. #  if defined(__osf__)
  569. /* OSF/1 V4.0 <dirent.h> doesn't declare _Preaddir_r, breaking under C++. */
  570. extern int _Preaddir_r(DIR *, struct dirent *, struct dirent **);
  571. #  endif
  572. #  define _XReaddir(d,p)
  573.     (readdir_r((d), &((p).dir_entry), &((p).result)) ? NULL : (p).result)
  574. # elif defined(_POSIX_REENTRANT_FUNCTIONS) && defined(__osf__)
  575. /*
  576.  * OSF/1 V3.2 readdir_r() will SEGV if the main program is not
  577.  * explicitly linked with -lc_r.  The library REQUIREDLIBS don't help.
  578.  * Assume that if threads have been initialized we're linked properly.
  579.  */
  580. #  define _XReaddir(d,p)
  581.  ( (_Xos_isThreadInitialized) ?
  582.    (readdir_r((d), &((p).dir_entry)) ? NULL : &((p).dir_entry)) :
  583.    ((_Xos_processLock),
  584.     (((p).result = readdir((d))) ?
  585.      (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen),
  586.       ((p).result = &(p).dir_entry), 0) :
  587.      0),
  588.     (_Xos_processUnlock),
  589.     (p).result) )
  590. # elif defined(_POSIX_REENTRANT_FUNCTIONS)
  591. /* POSIX draft API, returns (int)0 on success. */
  592. #  define _XReaddir(d,p)
  593.     (readdir_r((d),&((p).dir_entry)) ? NULL : &((p).dir_entry))
  594. # elif defined(SVR4)
  595. /* Pre-POSIX API, returns non-NULL on success. */
  596. #  define _XReaddir(d,p) (readdir_r((d), &(p).dir_entry))
  597. # else
  598. /* We have no idea what is going on.  Fake it all using process locks. */
  599. #  define _XReaddir(d,p)
  600.     ( (_Xos_processLock),
  601.       (((p).result = readdir((d))) ?
  602.        (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen),
  603. ((p).result = &(p).dir_entry), 0) :
  604.        0),
  605.       (_Xos_processUnlock),
  606.       (p).result )
  607. # endif
  608. #endif /* X_INCLUDE_DIRENT_H */
  609. #if defined(X_INCLUDE_DIRENT_H) && !defined(_XOS_INCLUDED_DIRENT_H)
  610. # define _XOS_INCLUDED_DIRENT_H
  611. #endif
  612. /***** <unistd.h> wrappers *****/
  613. /*
  614.  * Effective prototypes for <unistd.h> wrappers:
  615.  *
  616.  * #define X_INCLUDE_UNISTD_H
  617.  * #define XOS_USE_..._LOCKING
  618.  * #include <X11/Xos_r.h>
  619.  *
  620.  * typedef ... _Xgetloginparams;
  621.  * typedef ... _Xttynameparams;
  622.  *
  623.  * char *_XGetlogin(_Xgetloginparams);
  624.  * char *_XTtyname(int, _Xttynameparams);
  625.  */
  626. #if defined(X_INCLUDE_UNISTD_H) && !defined(_XOS_INCLUDED_UNISTD_H)
  627. /* <unistd.h> already included by <X11/Xos.h> */
  628. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_UNISTDAPI)
  629. #  define XOS_USE_MTSAFE_UNISTDAPI 1
  630. # endif
  631. #endif
  632. #if !defined(X_INCLUDE_UNISTD_H) || defined(_XOS_INCLUDED_UNISTD_H)
  633. /* Do nothing. */
  634. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  635. /* Use regular, unsafe API. */
  636. typedef int _Xgetloginparams; /* dummy */
  637. typedef int _Xttynameparams; /* dummy */
  638. # define _XGetlogin(p) getlogin()
  639. # define _XTtyname(f) ttyname((f))
  640. #elif !defined(XOS_USE_MTSAFE_UNISTDAPI) || defined(XNO_MTSAFE_UNISTDAPI)
  641. /* Systems with thread support but no _r API. */
  642. typedef struct {
  643.   char *result;
  644. # if defined(MAXLOGNAME)
  645.   char buf[MAXLOGNAME];
  646. # elif defined(LOGIN_NAME_MAX)
  647.   char buf[LOGIN_NAME_MAX];
  648. # else
  649.   char buf[64];
  650. # endif
  651. } _Xgetloginparams;
  652. typedef struct {
  653.   char *result;
  654. # ifdef TTY_NAME_MAX
  655.   char buf[TTY_NAME_MAX];
  656. # elif defined(_POSIX_TTY_NAME_MAX)
  657.   char buf[_POSIX_TTY_NAME_MAX];
  658. # elif defined(_POSIX_PATH_MAX)
  659.   char buf[_POSIX_PATH_MAX];
  660. # else
  661.   char buf[256];
  662. # endif
  663. } _Xttynameparams;
  664. # define _XGetlogin(p) 
  665.  ( (_Xos_processLock), 
  666.    (((p).result = getlogin()) ? 
  667.     (strncpy((p).buf, (p).result, sizeof((p).buf)), 
  668.      ((p).buf[sizeof((p).buf)-1] = ''), 
  669.      ((p).result = (p).buf), 0) : 0), 
  670.    (_Xos_processUnlock), 
  671.    (p).result )
  672. #define _XTtyname(f,p) 
  673.  ( (_Xos_processLock), 
  674.    (((p).result = ttyname(f)) ? 
  675.     (strncpy((p).buf, (p).result, sizeof((p).buf)), 
  676.      ((p).buf[sizeof((p).buf)-1] = ''), 
  677.      ((p).result = (p).buf), 0) : 0), 
  678.    (_Xos_processUnlock), 
  679.    (p).result )
  680. #elif defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_POSIX_REENTRANT_FUNCTIONS)
  681. /* POSIX API.
  682.  *
  683.  * extern int getlogin_r(char *, size_t);
  684.  * extern int ttyname_r(int, char *, size_t);
  685.  */
  686. typedef struct {
  687. # if defined(MAXLOGNAME)
  688.   char buf[MAXLOGNAME];
  689. # elif defined(LOGIN_NAME_MAX)
  690.   char buf[LOGIN_NAME_MAX];
  691. # else
  692.   char buf[64];
  693. # endif
  694. } _Xgetloginparams;
  695. typedef struct {
  696. # ifdef TTY_NAME_MAX
  697.   char buf[TTY_NAME_MAX];
  698. # elif defined(_POSIX_TTY_NAME_MAX)
  699.   char buf[_POSIX_TTY_NAME_MAX];
  700. # elif defined(_POSIX_PATH_MAX)
  701.   char buf[_POSIX_PATH_MAX];
  702. # else
  703.   char buf[256];
  704. # endif
  705. } _Xttynameparams;
  706. # define _XGetlogin(p) (getlogin_r((p).buf, sizeof((p).buf)) ? NULL : (p).buf)
  707. # define _XTtyname(f,p)
  708. (ttyname_r((f), (p).buf, sizeof((p).buf)) ? NULL : (p).buf)
  709. #else
  710. /* Pre-POSIX API.
  711.  *
  712.  * extern char *getlogin_r(char *, size_t);
  713.  * extern char *ttyname_r(int, char *, size_t);
  714.  */
  715. typedef struct {
  716. # if defined(MAXLOGNAME)
  717.   char buf[MAXLOGNAME];
  718. # elif defined(LOGIN_NAME_MAX)
  719.   char buf[LOGIN_NAME_MAX];
  720. # else
  721.   char buf[64];
  722. # endif
  723. } _Xgetloginparams;
  724. typedef struct {
  725. # ifdef TTY_NAME_MAX
  726.   char buf[TTY_NAME_MAX];
  727. # elif defined(_POSIX_TTY_NAME_MAX)
  728.   char buf[_POSIX_TTY_NAME_MAX];
  729. # elif defined(_POSIX_PATH_MAX)
  730.   char buf[_POSIX_PATH_MAX];
  731. # else
  732.   char buf[256];
  733. # endif
  734. } _Xttynameparams;
  735. # define _XGetlogin(p) getlogin_r((p).buf, sizeof((p).buf))
  736. # define _XTtyname(f,p) ttyname_r((f), (p).buf, sizeof((p).buf))
  737. #endif /* X_INCLUDE_UNISTD_H */
  738. #if defined(X_INCLUDE_UNISTD_H) && !defined(_XOS_INCLUDED_UNISTD_H)
  739. # define _XOS_INCLUDED_UNISTD_H
  740. #endif
  741. /***** <string.h> wrappers *****/
  742. /*
  743.  * Effective prototypes for <string.h> wrappers:
  744.  *
  745.  * #define X_INCLUDE_STRING_H
  746.  * #define XOS_USE_..._LOCKING
  747.  * #include <X11/Xos_r.h>
  748.  *
  749.  * typedef ... _Xstrtokparams;
  750.  *
  751.  * char *_XStrtok(char *, const char*, _Xstrtokparams);
  752.  */
  753. #if defined(X_INCLUDE_STRING_H) && !defined(_XOS_INCLUDED_STRING_H)
  754. /* <string.h> has already been included by <X11/Xos.h> */
  755. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_STRINGAPI)
  756. #  define XOS_USE_MTSAFE_STRINGAPI 1
  757. # endif
  758. #endif
  759. #if !defined(X_INCLUDE_STRING_H) || defined(_XOS_INCLUDED_STRING_H)
  760. /* Do nothing. */
  761. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  762. /* Use regular, unsafe API. */
  763. typedef int _Xstrtokparams; /* dummy */
  764. # define _XStrtok(s1,s2,p) 
  765.  ( p = 0, (void)p, strtok((s1),(s2)) )
  766. #elif !defined(XOS_USE_MTSAFE_STRINGAPI) || defined(XNO_MTSAFE_STRINGAPI)
  767. /* Systems with thread support but no _r API. */
  768. typedef char *_Xstrtokparams;
  769. # define _XStrtok(s1,s2,p) 
  770.  ( (_Xos_processLock), 
  771.    ((p) = strtok((s1),(s2))), 
  772.    (_Xos_processUnlock), 
  773.    (p) )
  774. #else
  775. /* POSIX or pre-POSIX API. */
  776. typedef char * _Xstrtokparams;
  777. # define _XStrtok(s1,s2,p) strtok_r((s1),(s2),&(p))
  778. #endif /* X_INCLUDE_STRING_H */
  779. /***** <time.h> wrappers *****/
  780. /*
  781.  * Effective prototypes for <time.h> wrappers:
  782.  *
  783.  * #define X_INCLUDE_TIME_H
  784.  * #define XOS_USE_..._LOCKING
  785.  * #include <X11/Xos_r.h>
  786.  *
  787.  * typedef ... _Xatimeparams;
  788.  * typedef ... _Xctimeparams;
  789.  * typedef ... _Xgtimeparams;
  790.  * typedef ... _Xltimeparams;
  791.  *
  792.  * char *_XAsctime(const struct tm *, _Xatimeparams);
  793.  * char *_XCtime(const time_t *, _Xctimeparams);
  794.  * struct tm *_XGmtime(const time_t *, _Xgtimeparams);
  795.  * struct tm *_XLocaltime(const time_t *, _Xltimeparams);
  796.  */
  797. #if defined(X_INCLUDE_TIME_H) && !defined(_XOS_INCLUDED_TIME_H)
  798. # include <time.h>
  799. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_TIMEAPI)
  800. #  define XOS_USE_MTSAFE_TIMEAPI 1
  801. # endif
  802. #endif
  803. #if !defined(X_INCLUDE_TIME_H) || defined(_XOS_INCLUDED_TIME_H)
  804. /* Do nothing. */
  805. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  806. /* Use regular, unsafe API. */
  807. typedef int _Xatimeparams; /* dummy */
  808. # define _XAsctime(t,p) asctime((t))
  809. typedef int _Xctimeparams; /* dummy */
  810. # define _XCtime(t,p) ctime((t))
  811. typedef int _Xgtimeparams; /* dummy */
  812. # define _XGmtime(t,p) gmtime((t))
  813. typedef int _Xltimeparams; /* dummy */
  814. # define _XLocaltime(t,p) localtime((t))
  815. #elif !defined(XOS_USE_MTSAFE_TIMEAPI) || defined(XNO_MTSAFE_TIMEAPI)
  816. /* Systems with thread support but no _r API. */
  817. typedef struct {
  818. # ifdef TIMELEN
  819.   char buf[TIMELEN];
  820. # else
  821.   char buf[26];
  822. # endif
  823.   char *result;
  824. } _Xctimeparams, _Xatimeparams;
  825. typedef struct {
  826.   struct tm buf;
  827.   struct tm *result;
  828. } _Xgtimeparams, _Xltimeparams;
  829. # define _XAsctime(t,p) 
  830.  ( (_Xos_processLock), 
  831.    (((p).result = asctime((t))) ? 
  832.     (strncpy((p).buf, (p).result, sizeof((p).buf)), (p).result = &(p).buf) : 
  833.     0), 
  834.    (_Xos_processUnlock), 
  835.    (p).result )
  836. # define _XCtime(t,p) 
  837.  ( (_Xos_processLock), 
  838.    (((p).result = ctime((t))) ? 
  839.     (strncpy((p).buf, (p).result, sizeof((p).buf)), (p).result = &(p).buf) : 
  840.     0), 
  841.    (_Xos_processUnlock), 
  842.    (p).result )
  843. # define _XGmtime(t,p) 
  844.  ( (_Xos_processLock), 
  845.    (((p).result = gmtime(t)) ? 
  846.     (memcpy(&(p).buf, (p).result, sizeof((p).buf)), (p).result = &(p).buf) : 
  847.     0), 
  848.    (_Xos_processUnlock), 
  849.    (p).result )
  850. # define _XLocaltime(t,p) 
  851.  ( (_Xos_processLock), 
  852.    (((p).result = localtime(t)) ? 
  853.     (memcpy(&(p).buf, (p).result, sizeof((p).buf)), (p).result = &(p).buf) : 
  854.     0), 
  855.    (_Xos_processUnlock), 
  856.    (p).result )
  857. #elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (defined(__osf__) || defined(hpV4))
  858. /* Returns (int)0 on success.  OSF/1 v3.2, HP/UX 10
  859.  *
  860.  * extern int asctime_r(const struct tm *timeptr, char *buffer, int buflen);
  861.  * extern int ctime_r(const time_t *timer, char *buffer, int buflen);
  862.  * extern int gmtime_r(const time_t *timer, struct tm *result);
  863.  * extern int localtime_r(const time_t *timer, struct tm *result);
  864.  */
  865. # ifdef TIMELEN
  866. typedef char _Xatimeparams[TIMELEN];
  867. typedef char _Xctimeparams[TIMELEN];
  868. # else
  869. typedef char _Xatimeparams[26];
  870. typedef char _Xctimeparams[26];
  871. # endif
  872. typedef struct tm _Xgtimeparams;
  873. typedef struct tm _Xltimeparams;
  874. # define _XAsctime(t,p) (asctime_r((t),(p),sizeof((p))) ? NULL : (p))
  875. # define _XCtime(t,p) (ctime_r((t),(p),sizeof((p))) ? NULL : (p))
  876. # define _XGmtime(t,p) (gmtime_r((t),&(p)) ? NULL : &(p))
  877. # define _XLocaltime(t,p) (localtime_r((t),&(p)) ? NULL : &(p))
  878. #elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(sun)
  879. /* Returns NULL on failure.  Solaris 2.5
  880.  *
  881.  * extern char *asctime_r(const struct tm *tm,char *buf, int buflen);
  882.  * extern char *ctime_r(const time_t *clock, char *buf, int buflen);
  883.  * extern struct tm *gmtime_r(const time_t *clock, struct tm *res);
  884.  * extern struct tm *localtime_r(const time_t *clock, struct tm *res);
  885.  */
  886. # ifdef TIMELEN
  887. typedef char _Xatimeparams[TIMELEN];
  888. typedef char _Xctimeparams[TIMELEN];
  889. # else
  890. typedef char _Xatimeparams[26];
  891. typedef char _Xctimeparams[26];
  892. # endif
  893. typedef struct tm _Xgtimeparams;
  894. typedef struct tm _Xltimeparams;
  895. # define _XAsctime(t,p) asctime_r((t),(p),sizeof((p)))
  896. # define _XCtime(t,p) ctime_r((t),(p),sizeof((p)))
  897. # define _XGmtime(t,p) gmtime_r((t),&(p))
  898. # define _XLocaltime(t,p) localtime_r((t),&(p))
  899. #else /* defined(_POSIX_THREAD_SAFE_FUNCTIONS) */
  900. /* POSIX final API.  OSF/1 v4.0, AIX, etc.
  901.  *
  902.  * extern char *asctime_r(const struct tm *timeptr, char *buffer);
  903.  * extern char *ctime_r(const time_t *timer, char *buffer);
  904.  * extern struct tm *gmtime_r(const time_t *timer, struct tm *result);
  905.  * extern struct tm *localtime_r(const time_t *timer, struct tm *result);
  906.  */
  907. # if defined(__osf__)
  908. /* OSF/1 V4.0 <time.h> doesn't declare the _P routines, breaking under C++. */
  909. extern char *_Pasctime_r(const struct tm *, char *);
  910. extern char *_Pctime_r(const time_t *, char *);
  911. extern struct tm *_Plocaltime_r(const time_t *, struct tm *);
  912. # endif
  913. # ifdef TIMELEN
  914. typedef char _Xatimeparams[TIMELEN];
  915. typedef char _Xctimeparams[TIMELEN];
  916. # else
  917. typedef char _Xatimeparams[26];
  918. typedef char _Xctimeparams[26];
  919. # endif
  920. typedef struct tm _Xgtimeparams;
  921. typedef struct tm _Xltimeparams;
  922. # define _XAsctime(t,p) asctime_r((t),(p))
  923. # define _XCtime(t,p) ctime_r((t),(p))
  924. # define _XGmtime(t,p) gmtime_r((t),&(p))
  925. # define _XLocaltime(t,p) localtime_r((t),&(p))
  926. #endif /* X_INCLUDE_TIME_H */
  927. #if defined(X_INCLUDE_TIME_H) && !defined(_XOS_INCLUDED_TIME_H)
  928. # define _XOS_INCLUDED_TIME_H
  929. #endif
  930. /***** <grp.h> wrappers *****/
  931. /*
  932.  * Effective prototypes for <grp.h> wrappers:
  933.  *
  934.  * NOTE: On systems lacking appropriate _r functions Getgrgid() and
  935.  * Getgrnam() do NOT copy the list of group members!
  936.  *
  937.  * Remember that fgetgrent(), setgrent(), getgrent(), and endgrent()
  938.  * are not included in POSIX.
  939.  *
  940.  * #define X_INCLUDE_GRP_H
  941.  * #define XOS_USE_..._LOCKING
  942.  * #include <X11/Xos_r.h>
  943.  *
  944.  * typedef ... _Xgetgrparams;
  945.  *
  946.  * struct group *_XGetgrgid(gid_t, _Xgetgrparams);
  947.  * struct group *_XGetgrnam(const char *, _Xgetgrparams);
  948.  */
  949. #if defined(X_INCLUDE_GRP_H) && !defined(_XOS_INCLUDED_GRP_H)
  950. # include <grp.h>
  951. # if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_GRPAPI)
  952. #  define XOS_USE_MTSAFE_GRPAPI 1
  953. # endif
  954. #endif
  955. #if !defined(X_INCLUDE_GRP_H) || defined(_XOS_INCLUDED_GRP_H)
  956. /* Do nothing. */
  957. #elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)
  958. /* Use regular, unsafe API. */
  959. typedef int _Xgetgrparams; /* dummy */
  960. #define _XGetgrgid(g,p) getgrgid((g))
  961. #define _XGetgrnam(n,p) getgrnam((n))
  962. #elif !defined(XOS_USE_MTSAFE_GRPAPI) || defined(XNO_MTSAFE_GRPAPI)
  963. /* Systems with thread support but no _r API.  UnixWare 2.0. */
  964. typedef struct {
  965.   struct group grp;
  966.   char buf[X_LINE_MAX]; /* Should be sysconf(_SC_GETGR_R_SIZE_MAX)? */
  967.   struct group *pgrp;
  968.   size_t len;
  969. } _Xgetgrparams;
  970. #ifdef SVR4
  971. /* Copy the gr_passwd field too. */
  972. # define _Xgrp_copyGroup(p) 
  973.  ( memcpy(&(p).grp, (p).pgrp, sizeof(struct group)), 
  974.    ((p).grp.gr_name = (p).buf), 
  975.    ((p).len = strlen((p).pgrp->gr_name)), 
  976.    strcpy((p).grp.gr_name, (p).pgrp->gr_name), 
  977.    ((p).grp.gr_passwd = (p).grp.gr_name + (p).len + 1), 
  978.    ((p).pgrp = &(p).grp), 
  979.    0 )
  980. #else
  981. # define _Xgrp_copyGroup(p) 
  982.  ( memcpy(&(p).grp, (p).pgrp, sizeof(struct group)), 
  983.    ((p).grp.gr_name = (p).buf), 
  984.    strcpy((p).grp.gr_name, (p).pgrp->gr_name), 
  985.    ((p).pgrp = &(p).grp), 
  986.    0 )
  987. #endif
  988. #define _XGetgrgid(g,p) 
  989.  ( (_Xos_processLock), 
  990.    (((p).pgrp = getgrgid((g))) ? _Xgrp_copyGroup(p) : 0), 
  991.    (_Xos_processUnlock), 
  992.    (p).pgrp )
  993. #define _XGetgrnam(n,p) 
  994.  ( (_Xos_processLock), 
  995.    (((p).pgrp = getgrnam((n))) ? _Xgrp_copyGroup(p) : 0), 
  996.    (_Xos_processUnlock), 
  997.    (p).pgrp )
  998. #elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (defined(sun) || defined(__osf__))
  999. /* Non-POSIX API.  Solaris, DEC v3.2.
  1000.  *
  1001.  * extern struct group *getgrgid_r(gid_t, struct group *, char *, int);
  1002.  * extern struct group *getgrnam_r(const char *, struct group *, char *, int);
  1003.  */
  1004. typedef struct {
  1005.   struct group grp;
  1006.   char buf[X_LINE_MAX]; /* Should be sysconf(_SC_GETGR_R_SIZE_MAX)? */
  1007. } _Xgetgrparams;
  1008. #define _XGetgrgid(g,p) getgrgid_r((g), &(p).grp, (p).buf, sizeof((p).buf))
  1009. #define _XGetgrnam(n,p) getgrnam_r((n), &(p).grp, (p).buf, sizeof((p).buf))
  1010. #elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  1011. /* Non-POSIX API.  HP/UX 10, AIX 4.
  1012.  *
  1013.  * extern int getgrgid_r(gid_t, struct group *, char *, int);
  1014.  * extern int getgrnam_r(const char *, struct group *, char *, int);
  1015.  */
  1016. typedef struct {
  1017.   struct group grp;
  1018.   char buf[X_LINE_MAX]; /* Should be sysconf(_SC_GETGR_R_SIZE_MAX)? */
  1019. } _Xgetgrparams;
  1020. #define _XGetgrgid(g,p)
  1021.  ((getgrgid_r((g), &(p).grp, (p).buf, sizeof((p).buf)) ? NULL : &(p).grp))
  1022. #define _XGetgrnam(n,p)
  1023.  ((getgrnam_r((n), &(p).grp, (p).buf, sizeof((p).buf)) ? NULL : &(p).grp))
  1024. #else
  1025. /* POSIX final API.  DEC v4.0, IRIX 6.2.
  1026.  *
  1027.  * int getgrgid_r(gid_t, struct group *, char *, size_t, struct group **);
  1028.  * int getgrnam_r(const char *, struct group *, char *, size_t, struct group **);
  1029.  */
  1030. # if defined(__osf__)
  1031. /* OSF/1 V4.0 <grp.h> doesn't declare the _P routines, breaking under C++. */
  1032. extern int _Pgetgrgid_r(gid_t, struct group *, char *, size_t, struct group **);
  1033. extern int _Pgetgrnam_r(const char *, struct group *, char *, size_t, struct group **);
  1034. # endif
  1035. typedef struct {
  1036.   struct group grp;
  1037.   char buf[X_LINE_MAX]; /* Should be sysconf(_SC_GETGR_R_SIZE_MAX)? */
  1038.   struct group *result;
  1039. } _Xgetgrparams;
  1040. #define _XGetgrgid(g,p)
  1041.  ((getgrgid_r((g), &(p).grp, (p).buf, sizeof((p).buf), &(p).result) ? 
  1042.    NULL : (p).result))
  1043. #define _XGetgrnam(n,p)
  1044.  ((getgrnam_r((n), &(p).grp, (p).buf, sizeof((p).buf), &(p).result) ? 
  1045.    NULL : (p).result))
  1046. #endif
  1047. #if defined(X_INCLUDE_GRP_H) && !defined(_XOS_INCLUDED_GRP_H)
  1048. # define _XOS_INCLUDED_GRP_H
  1049. #endif
  1050. #ifdef __cplusplus
  1051. }  /* Close scope of 'extern "C"' declaration which encloses file. */
  1052. #endif