📄 xos_r.h
字号:
/* UnixWare 2.0, or other systems with thread support but no _r API. *//* WARNING: The h_addr_list and s_aliases values are *not* copied! */typedef struct { struct hostent hent; char h_name[MAXHOSTNAMELEN]; struct hostent *hptr;} _Xgethostbynameparams;typedef struct { struct servent sent; char s_name[255]; char s_proto[255]; struct servent *sptr;} _Xgetservbynameparams;# define _Xg_copyHostent(hp) \ (memcpy(&(hp).hent, (hp).hptr, sizeof(struct hostent)), \ strcpy((hp).h_name, (hp).hptr->h_name), \ ((hp).hent.h_name = (hp).h_name), \ ((hp).hptr = &(hp).hent), \ 0 )# define _Xg_copyServent(sp) \ (memcpy(&(sp).sent, (sp).sptr, sizeof(struct servent)), \ strcpy((sp).s_name, (sp).sptr->s_name), \ ((sp).sent.s_name = (sp).s_name), \ strcpy((sp).s_proto, (sp).sptr->s_proto), \ ((sp).sent.s_proto = (sp).s_proto), \ ((sp).sptr = &(sp).sent), \ 0 )# define _XGethostbyname(h,hp) \ ((_Xos_processLock), \ (((hp).hptr = gethostbyname((h))) ? _Xg_copyHostent(hp) : 0), \ (_Xos_processUnlock), \ (hp).hptr )# define _XGethostbyaddr(a,al,t,hp) \ ((_Xos_processLock), \ (((hp).hptr = gethostbyaddr((a),(al),(t))) ? _Xg_copyHostent(hp) : 0), \ (_Xos_processUnlock), \ (hp).hptr )# define _XGetservbyname(s,p,sp) \ ((_Xos_processLock), \ (((sp).sptr = getservbyname((s),(p))) ? _Xg_copyServent(sp) : 0), \ (_Xos_processUnlock), \ (sp).sptr )#elif defined(XUSE_NETDB_R_API)/* * POSIX does not specify _r equivalents for <netdb.h> API, but some * vendors provide them anyway. Use them only when explicitly asked. */# ifdef _POSIX_REENTRANT_FUNCTIONS# ifndef _POSIX_THREAD_SAFE_FUNCTIONS# if defined(AIXV3) || defined(AIXV4) || defined(__osf__)# define X_POSIX_THREAD_SAFE_FUNCTIONS 1# endif# endif# endif# ifdef _POSIX_THREAD_SAFE_FUNCTIONS# define X_POSIX_THREAD_SAFE_FUNCTIONS 1# endif# ifndef X_POSIX_THREAD_SAFE_FUNCTIONStypedef struct { struct hostent hent; char hbuf[LINE_MAX]; int herr;} _Xgethostbynameparams;typedef struct { struct servent sent; char sbuf[LINE_MAX];} _Xgetservbynameparams;# define _XGethostbyname(h,hp) \ gethostbyname_r((h),&(hp).hent,(hp).hbuf,sizeof((hp).hbuf),&(hp).herr)# define _XGethostbyaddr(a,al,t,hp) \ gethostbyaddr_r((a),(al),(t),&(hp).hent,(hp).hbuf,sizeof((hp).hbuf),&(hp).herr)# define _XGetservbyname(s,p,sp) \ getservbyname_r((s),(p),&(sp).sent,(sp).sbuf,sizeof((sp).sbuf))# elsetypedef struct { struct hostent hent; struct hostent_data hdata;} _Xgethostbynameparams;typedef struct { struct servent sent; struct servent_data sdata;} _Xgetservbynameparams;# define _XGethostbyname(h,hp) \ (bzero((char*)&(hp).hdata,sizeof((hp).hdata)), \ ((gethostbyname_r((h),&(hp).hent,&(hp).hdata) == -1) ? NULL : &(hp).hent))# define _XGethostbyaddr(a,al,t,hp) \ (bzero((char*)&(hp).hdata,sizeof((hp).hdata)), \ ((gethostbyaddr_r((a),(al),(t),&(hp).hent,&(hp).hdata) == -1) ? NULL : &(hp).hent))# define _XGetservbyname(s,p,sp) \ (bzero((char*)&(sp).sdata,sizeof((sp).sdata)), \ ((getservbyname_r((s),(p),&(sp).sent,&(sp).sdata) == -1) ? NULL : &(sp).sent) )# endif# ifdef X_POSIX_THREAD_SAFE_FUNCTIONS# undef X_POSIX_THREAD_SAFE_FUNCTIONS# endif#else/* The regular API is assumed to be MT-safe under POSIX. */typedef int _Xgethostbynameparams; /* dummy */typedef int _Xgetservbynameparams; /* dummy */# define _XGethostbyname(h,hp) gethostbyname((h))# define _XGethostbyaddr(a,al,t,hp) gethostbyaddr((a),(al),(t))# define _XGetservbyname(s,p,sp) getservbyname((s),(p))#endif /* X_INCLUDE_NETDB_H */#if defined(X_INCLUDE_NETDB_H) && !defined(_XOS_INCLUDED_NETDB_H)# define _XOS_INCLUDED_NETDB_H#endif/***** <dirent.h> wrappers *****//* * Effective prototypes for <dirent.h> wrappers: * * #define X_INCLUDE_DIRENT_H * #define XOS_USE_..._LOCKING * #include <X11/Xos_r.h> * * typedef ... _Xreaddirparams; * * struct dirent *_XReaddir(DIR *dir_pointer, _Xreaddirparams); */#if defined(X_INCLUDE_DIRENT_H) && !defined(_XOS_INCLUDED_DIRENT_H)# include <sys/types.h># if !defined(X_NOT_POSIX) || defined(SYSV) || defined(USG)# include <dirent.h># else# include <sys/dir.h># ifndef dirent# define dirent direct# endif# endif# if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_DIRENTAPI)# define XOS_USE_MTSAFE_DIRENTAPI 1# endif#endif#if !defined(X_INCLUDE_DIRENT_H) || defined(_XOS_INCLUDED_DIRENT_H)/* Do nothing. */#elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)/* Use regular, unsafe API. */typedef int _Xreaddirparams; /* dummy */# define _XReaddir(d,p) readdir(d)#elif !defined(XOS_USE_MTSAFE_DIRENTAPI) || defined(XNO_MTSAFE_DIRENTAPI)/* Systems with thread support but no _r API. */typedef struct { struct dirent *result; struct dirent dir_entry;# ifdef _POSIX_PATH_MAX char buf[_POSIX_PATH_MAX];# elif defined(NAME_MAX) char buf[NAME_MAX];# else char buf[255];# endif} _Xreaddirparams;# define _XReaddir(d,p) \ ( (_Xos_processLock), \ (((p).result = readdir((d))) ? \ (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen), \ ((p).result = &(p).dir_entry), 0) : \ 0), \ (_Xos_processUnlock), \ (p).result )#elsetypedef struct { struct dirent *result; struct dirent dir_entry;# ifdef _POSIX_PATH_MAX char buf[_POSIX_PATH_MAX];# elif defined(NAME_MAX) char buf[NAME_MAX];# else char buf[255];# endif} _Xreaddirparams;# if defined(AIXV3) || defined(AIXV4) || defined(_POSIX_THREAD_SAFE_FUNCTIONS)/* AIX defines the draft POSIX symbol, but uses the final API. *//* POSIX final API, returns (int)0 on success. */# if defined(__osf__)/* OSF/1 V4.0 <dirent.h> doesn't declare _Preaddir_r, breaking under C++. */extern int _Preaddir_r(DIR *, struct dirent *, struct dirent **);# endif# define _XReaddir(d,p) \ (readdir_r((d), &((p).dir_entry), &((p).result)) ? NULL : (p).result)# elif defined(_POSIX_REENTRANT_FUNCTIONS) && defined(__osf__)/* * OSF/1 V3.2 readdir_r() will SEGV if the main program is not * explicitly linked with -lc_r. The library REQUIREDLIBS don't help. * Assume that if threads have been initialized we're linked properly. */# define _XReaddir(d,p) \ ( (_Xos_isThreadInitialized) ? \ (readdir_r((d), &((p).dir_entry)) ? NULL : &((p).dir_entry)) : \ ((_Xos_processLock), \ (((p).result = readdir((d))) ? \ (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen), \ ((p).result = &(p).dir_entry), 0) : \ 0), \ (_Xos_processUnlock), \ (p).result) )# elif defined(_POSIX_REENTRANT_FUNCTIONS)/* POSIX draft API, returns (int)0 on success. */# define _XReaddir(d,p) \ (readdir_r((d),&((p).dir_entry)) ? NULL : &((p).dir_entry))# elif defined(SVR4)/* Pre-POSIX API, returns non-NULL on success. */# define _XReaddir(d,p) (readdir_r((d), &(p).dir_entry))# else/* We have no idea what is going on. Fake it all using process locks. */# define _XReaddir(d,p) \ ( (_Xos_processLock), \ (((p).result = readdir((d))) ? \ (memcpy(&((p).dir_entry), (p).result, (p).result->d_reclen), \ ((p).result = &(p).dir_entry), 0) : \ 0), \ (_Xos_processUnlock), \ (p).result )# endif#endif /* X_INCLUDE_DIRENT_H */#if defined(X_INCLUDE_DIRENT_H) && !defined(_XOS_INCLUDED_DIRENT_H)# define _XOS_INCLUDED_DIRENT_H#endif/***** <unistd.h> wrappers *****//* * Effective prototypes for <unistd.h> wrappers: * * #define X_INCLUDE_UNISTD_H * #define XOS_USE_..._LOCKING * #include <X11/Xos_r.h> * * typedef ... _Xgetloginparams; * typedef ... _Xttynameparams; * * char *_XGetlogin(_Xgetloginparams); * char *_XTtyname(int, _Xttynameparams); */#if defined(X_INCLUDE_UNISTD_H) && !defined(_XOS_INCLUDED_UNISTD_H)/* <unistd.h> already included by <X11/Xos.h> */# if defined(XUSE_MTSAFE_API) || defined(XUSE_MTSAFE_UNISTDAPI)# define XOS_USE_MTSAFE_UNISTDAPI 1# endif#endif#if !defined(X_INCLUDE_UNISTD_H) || defined(_XOS_INCLUDED_UNISTD_H)/* Do nothing. */#elif !defined(XTHREADS) && !defined(X_FORCE_USE_MTSAFE_API)/* Use regular, unsafe API. */typedef int _Xgetloginparams; /* dummy */typedef int _Xttynameparams; /* dummy */# define _XGetlogin(p) getlogin()# define _XTtyname(f) ttyname((f))#elif !defined(XOS_USE_MTSAFE_UNISTDAPI) || defined(XNO_MTSAFE_UNISTDAPI)/* Systems with thread support but no _r API. */typedef struct { char *result;# if defined(MAXLOGNAME) char buf[MAXLOGNAME];# elif defined(LOGIN_NAME_MAX) char buf[LOGIN_NAME_MAX];# else char buf[64];# endif} _Xgetloginparams;typedef struct { char *result;# ifdef TTY_NAME_MAX char buf[TTY_NAME_MAX];# elif defined(_POSIX_TTY_NAME_MAX) char buf[_POSIX_TTY_NAME_MAX];# elif defined(_POSIX_PATH_MAX) char buf[_POSIX_PATH_MAX];# else char buf[256];# endif} _Xttynameparams;# define _XGetlogin(p) \ ( (_Xos_processLock), \ (((p).result = getlogin()) ? \ (strncpy((p).buf, (p).result, sizeof((p).buf)), \ ((p).buf[sizeof((p).buf)-1] = '\0'), \ ((p).result = (p).buf), 0) : 0), \ (_Xos_processUnlock), \ (p).result )#define _XTtyname(f,p) \ ( (_Xos_processLock), \ (((p).result = ttyname(f)) ? \ (strncpy((p).buf, (p).result, sizeof((p).buf)), \ ((p).buf[sizeof((p).buf)-1] = '\0'), \ ((p).result = (p).buf), 0) : 0), \ (_Xos_processUnlock), \ (p).result )#elif defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_POSIX_REENTRANT_FUNCTIONS)/* POSIX API. * * extern int getlogin_r(char *, size_t); * extern int ttyname_r(int, char *, size_t); */typedef struct {# if defined(MAXLOGNAME) char buf[MAXLOGNAME];# elif defined(LOGIN_NAME_MAX) char buf[LOGIN_NAME_MAX];# else char buf[64];# endif} _Xgetloginparams;typedef struct {# ifdef TTY_NAME_MAX char buf[TTY_NAME_MAX];# elif defined(_POSIX_TTY_NAME_MAX) char buf[_POSIX_TTY_NAME_MAX];# elif defined(_POSIX_PATH_MAX) char buf[_POSIX_PATH_MAX];# else char buf[256];# endif} _Xttynameparams;# define _XGetlogin(p) (getlogin_r((p).buf, sizeof((p).buf)) ? NULL : (p).buf)# define _XTtyname(f,p) \ (ttyname_r((f), (p).buf, sizeof((p).buf)) ? NULL : (p).buf)#else/* Pre-POSIX API. * * extern char *getlogin_r(char *, size_t); * extern char *ttyname_r(int, char *, size_t); */typedef struct {# if defined(MAXLOGNAME) char buf[MAXLOGNAME];# elif defined(LOGIN_NAME_MAX) char buf[LOGIN_NAME_MAX];# else char buf[64];# endif} _Xgetloginparams;typedef struct {# ifdef TTY_NAME_MAX char buf[TTY_NAME_MAX];# elif defined(_POSIX_TTY_NAME_MAX) char buf[_POSIX_TTY_NAME_MAX];# elif defined(_POSIX_PATH_MAX) char buf[_POSIX_PATH_MAX];# else char buf[256];# endif} _Xttynameparams;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -