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