FSlibos.h revision ba6a1819
1ba6a1819Smrg/* $XdotOrg: xc/lib/FS/FSlibos.h,v 1.3 2005/06/09 15:52:02 ago Exp $ */ 2ba6a1819Smrg/* $Xorg: FSlibos.h,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ 3ba6a1819Smrg 4ba6a1819Smrg/* @(#)FSlibos.h 4.1 91/05/02 5ba6a1819Smrg * Copyright 1990 Network Computing Devices; 6ba6a1819Smrg * Portions Copyright 1987 by Digital Equipment Corporation 7ba6a1819Smrg * 8ba6a1819Smrg * Permission to use, copy, modify, distribute, and sell this software 9ba6a1819Smrg * and its documentation for any purpose is hereby granted without fee, 10ba6a1819Smrg * provided that the above copyright notice appear in all copies and 11ba6a1819Smrg * that both that copyright notice and this permission notice appear 12ba6a1819Smrg * in supporting documentation, and that the names of Network Computing 13ba6a1819Smrg * Devices or Digital not be used in advertising or publicity pertaining 14ba6a1819Smrg * to distribution of the software without specific, written prior 15ba6a1819Smrg * permission. Network Computing Devices or Digital make no representations 16ba6a1819Smrg * about the suitability of this software for any purpose. It is provided 17ba6a1819Smrg * "as is" without express or implied warranty. 18ba6a1819Smrg * 19ba6a1819Smrg * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH 20ba6a1819Smrg * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 21ba6a1819Smrg * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES 22ba6a1819Smrg * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES 23ba6a1819Smrg * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 24ba6a1819Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 25ba6a1819Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 26ba6a1819Smrg * SOFTWARE. 27ba6a1819Smrg */ 28ba6a1819Smrg 29ba6a1819Smrg/* 30ba6a1819Smrg 31ba6a1819SmrgCopyright 1987, 1994, 1998 The Open Group 32ba6a1819Smrg 33ba6a1819SmrgPermission to use, copy, modify, distribute, and sell this software and its 34ba6a1819Smrgdocumentation for any purpose is hereby granted without fee, provided that 35ba6a1819Smrgthe above copyright notice appear in all copies and that both that 36ba6a1819Smrgcopyright notice and this permission notice appear in supporting 37ba6a1819Smrgdocumentation. 38ba6a1819Smrg 39ba6a1819SmrgThe above copyright notice and this permission notice shall be included in 40ba6a1819Smrgall copies or substantial portions of the Software. 41ba6a1819Smrg 42ba6a1819SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 43ba6a1819SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 44ba6a1819SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 45ba6a1819SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 46ba6a1819SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 47ba6a1819SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 48ba6a1819Smrg 49ba6a1819SmrgExcept as contained in this notice, the name of The Open Group shall not be 50ba6a1819Smrgused in advertising or otherwise to promote the sale, use or other dealings 51ba6a1819Smrgin this Software without prior written authorization from The Open Group. 52ba6a1819Smrg 53ba6a1819Smrg*/ 54ba6a1819Smrg/* $XFree86: xc/lib/FS/FSlibos.h,v 3.10 2003/09/01 20:50:10 herrb Exp $ */ 55ba6a1819Smrg 56ba6a1819Smrg/* 57ba6a1819Smrg * FSlib networking & os include file 58ba6a1819Smrg */ 59ba6a1819Smrg 60ba6a1819Smrg#include <X11/Xfuncs.h> 61ba6a1819Smrg#include <X11/Xosdefs.h> 62ba6a1819Smrg 63ba6a1819Smrg#ifndef WIN32 64ba6a1819Smrg 65ba6a1819Smrg#if defined(__SCO__) || defined(__UNIXWARE__) 66ba6a1819Smrg#include <stdint.h> /* For SIZE_MAX */ 67ba6a1819Smrg#endif 68ba6a1819Smrg 69ba6a1819Smrg/* 70ba6a1819Smrg * makedepend screws up on #undef OPEN_MAX, so we define a new symbol 71ba6a1819Smrg */ 72ba6a1819Smrg 73ba6a1819Smrg#ifndef FS_OPEN_MAX 74ba6a1819Smrg 75ba6a1819Smrg#ifndef X_NOT_POSIX 76ba6a1819Smrg#ifdef _POSIX_SOURCE 77ba6a1819Smrg#include <limits.h> 78ba6a1819Smrg#else 79ba6a1819Smrg#define _POSIX_SOURCE 80ba6a1819Smrg#include <limits.h> 81ba6a1819Smrg#undef _POSIX_SOURCE 82ba6a1819Smrg#endif 83ba6a1819Smrg#endif 84ba6a1819Smrg#ifndef SIZE_MAX 85ba6a1819Smrg# ifdef ULONG_MAX 86ba6a1819Smrg# define SIZE_MAX ULONG_MAX 87ba6a1819Smrg# else 88ba6a1819Smrg# define SIZE_MAX UINT_MAX 89ba6a1819Smrg# endif 90ba6a1819Smrg#endif 91ba6a1819Smrg#ifndef OPEN_MAX 92ba6a1819Smrg#ifdef SVR4 93ba6a1819Smrg#define OPEN_MAX 256 94ba6a1819Smrg#else 95ba6a1819Smrg#include <sys/param.h> 96ba6a1819Smrg#ifndef OPEN_MAX 97ba6a1819Smrg#ifdef __OSF1__ 98ba6a1819Smrg#define OPEN_MAX 256 99ba6a1819Smrg#else 100ba6a1819Smrg#ifdef NOFILE 101ba6a1819Smrg#define OPEN_MAX NOFILE 102ba6a1819Smrg#else 103ba6a1819Smrg#if !defined(__UNIXOS2__) && !defined(__QNX__) 104ba6a1819Smrg#ifdef __GNU__ 105ba6a1819Smrg#define OPEN_MAX (sysconf(_SC_OPEN_MAX)) 106ba6a1819Smrg#else /* !__GNU__ */ 107ba6a1819Smrg#define OPEN_MAX NOFILES_MAX 108ba6a1819Smrg#endif /* __GNU__ */ 109ba6a1819Smrg#else /* !__UNIXOS2__ && !__QNX__ */ 110ba6a1819Smrg#define OPEN_MAX 256 111ba6a1819Smrg#endif /* __UNIXOS2__ */ 112ba6a1819Smrg#endif 113ba6a1819Smrg#endif 114ba6a1819Smrg#endif 115ba6a1819Smrg#endif 116ba6a1819Smrg#endif 117ba6a1819Smrg 118ba6a1819Smrg#ifdef __GNU__ 119ba6a1819Smrg#define FS_OPEN_MAX 256 120ba6a1819Smrg#else /*!__GNU__*/ 121ba6a1819Smrg#if OPEN_MAX > 256 122ba6a1819Smrg#define FS_OPEN_MAX 256 123ba6a1819Smrg#else 124ba6a1819Smrg#define FS_OPEN_MAX OPEN_MAX 125ba6a1819Smrg#endif 126ba6a1819Smrg#endif /*__GNU__*/ 127ba6a1819Smrg 128ba6a1819Smrg#endif /* FS_OPEN_MAX */ 129ba6a1819Smrg 130ba6a1819Smrg/* Utek leaves kernel macros around in include files (bleah) */ 131ba6a1819Smrg 132ba6a1819Smrg#ifdef dirty 133ba6a1819Smrg#undef dirty 134ba6a1819Smrg#endif 135ba6a1819Smrg 136ba6a1819Smrg#ifdef WORD64 137ba6a1819Smrg#define NMSKBITS 64 138ba6a1819Smrg#else 139ba6a1819Smrg#define NMSKBITS 32 140ba6a1819Smrg#endif 141ba6a1819Smrg 142ba6a1819Smrg#define MSKCNT ((FS_OPEN_MAX + NMSKBITS - 1) / NMSKBITS) 143ba6a1819Smrg 144ba6a1819Smrg#ifdef LONG64 145ba6a1819Smrgtypedef unsigned int FdSet[MSKCNT]; 146ba6a1819Smrg#else 147ba6a1819Smrgtypedef unsigned long FdSet[MSKCNT]; 148ba6a1819Smrg#endif 149ba6a1819Smrg 150ba6a1819Smrg#if (MSKCNT==1) 151ba6a1819Smrg#define BITMASK(i) (1 << (i)) 152ba6a1819Smrg#define MASKIDX(i) 0 153ba6a1819Smrg#endif 154ba6a1819Smrg 155ba6a1819Smrg#if (MSKCNT>1) 156ba6a1819Smrg#define BITMASK(i) (1 << ((i) & (NMSKBITS - 1))) 157ba6a1819Smrg#define MASKIDX(i) ((i) / NMSKBITS) 158ba6a1819Smrg#endif 159ba6a1819Smrg 160ba6a1819Smrg#define MASKWORD(buf, i) buf[MASKIDX(i)] 161ba6a1819Smrg#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i) 162ba6a1819Smrg#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i) 163ba6a1819Smrg#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i)) 164ba6a1819Smrg 165ba6a1819Smrg#if (MSKCNT==1) 166ba6a1819Smrg#define COPYBITS(src, dst) dst[0] = src[0] 167ba6a1819Smrg#define CLEARBITS(buf) buf[0] = 0 168ba6a1819Smrg#define MASKANDSETBITS(dst, b1, b2) dst[0] = (b1[0] & b2[0]) 169ba6a1819Smrg#define ORBITS(dst, b1, b2) dst[0] = (b1[0] | b2[0]) 170ba6a1819Smrg#define UNSETBITS(dst, b1) (dst[0] &= ~b1[0]) 171ba6a1819Smrg#define _FSANYSET(src) (src[0]) 172ba6a1819Smrg#endif 173ba6a1819Smrg 174ba6a1819Smrg#if (MSKCNT==2) 175ba6a1819Smrg#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; } 176ba6a1819Smrg#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; } 177ba6a1819Smrg#define MASKANDSETBITS(dst, b1, b2) {\ 178ba6a1819Smrg dst[0] = (b1[0] & b2[0]);\ 179ba6a1819Smrg dst[1] = (b1[1] & b2[1]); } 180ba6a1819Smrg#define ORBITS(dst, b1, b2) {\ 181ba6a1819Smrg dst[0] = (b1[0] | b2[0]);\ 182ba6a1819Smrg dst[1] = (b1[1] | b2[1]); } 183ba6a1819Smrg#define UNSETBITS(dst, b1) {\ 184ba6a1819Smrg dst[0] &= ~b1[0]; \ 185ba6a1819Smrg dst[1] &= ~b1[1]; } 186ba6a1819Smrg#define _FSANYSET(src) (src[0] || src[1]) 187ba6a1819Smrg#endif 188ba6a1819Smrg 189ba6a1819Smrg#if (MSKCNT==3) 190ba6a1819Smrg#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; \ 191ba6a1819Smrg dst[2] = src[2]; } 192ba6a1819Smrg#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; buf[2] = 0; } 193ba6a1819Smrg#define MASKANDSETBITS(dst, b1, b2) {\ 194ba6a1819Smrg dst[0] = (b1[0] & b2[0]);\ 195ba6a1819Smrg dst[1] = (b1[1] & b2[1]);\ 196ba6a1819Smrg dst[2] = (b1[2] & b2[2]); } 197ba6a1819Smrg#define ORBITS(dst, b1, b2) {\ 198ba6a1819Smrg dst[0] = (b1[0] | b2[0]);\ 199ba6a1819Smrg dst[1] = (b1[1] | b2[1]);\ 200ba6a1819Smrg dst[2] = (b1[2] | b2[2]); } 201ba6a1819Smrg#define UNSETBITS(dst, b1) {\ 202ba6a1819Smrg dst[0] &= ~b1[0]; \ 203ba6a1819Smrg dst[1] &= ~b1[1]; \ 204ba6a1819Smrg dst[2] &= ~b1[2]; } 205ba6a1819Smrg#define _FSANYSET(src) (src[0] || src[1] || src[2]) 206ba6a1819Smrg#endif 207ba6a1819Smrg 208ba6a1819Smrg#if (MSKCNT==4) 209ba6a1819Smrg#define COPYBITS(src, dst) dst[0] = src[0]; dst[1] = src[1]; \ 210ba6a1819Smrg dst[2] = src[2]; dst[3] = src[3] 211ba6a1819Smrg#define CLEARBITS(buf) buf[0] = 0; buf[1] = 0; buf[2] = 0; buf[3] = 0 212ba6a1819Smrg#define MASKANDSETBITS(dst, b1, b2) \ 213ba6a1819Smrg dst[0] = (b1[0] & b2[0]);\ 214ba6a1819Smrg dst[1] = (b1[1] & b2[1]);\ 215ba6a1819Smrg dst[2] = (b1[2] & b2[2]);\ 216ba6a1819Smrg dst[3] = (b1[3] & b2[3]) 217ba6a1819Smrg#define ORBITS(dst, b1, b2) \ 218ba6a1819Smrg dst[0] = (b1[0] | b2[0]);\ 219ba6a1819Smrg dst[1] = (b1[1] | b2[1]);\ 220ba6a1819Smrg dst[2] = (b1[2] | b2[2]);\ 221ba6a1819Smrg dst[3] = (b1[3] | b2[3]) 222ba6a1819Smrg#define UNSETBITS(dst, b1) \ 223ba6a1819Smrg dst[0] &= ~b1[0]; \ 224ba6a1819Smrg dst[1] &= ~b1[1]; \ 225ba6a1819Smrg dst[2] &= ~b1[2]; \ 226ba6a1819Smrg dst[3] &= ~b1[3] 227ba6a1819Smrg#define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3]) 228ba6a1819Smrg#endif 229ba6a1819Smrg 230ba6a1819Smrg#if (MSKCNT>4) 231ba6a1819Smrg#define COPYBITS(src, dst) bcopy((caddr_t) src, (caddr_t) dst, sizeof(FdSet)) 232ba6a1819Smrg#define CLEARBITS(buf) bzero((caddr_t) buf, sizeof(FdSet)) 233ba6a1819Smrg#define MASKANDSETBITS(dst, b1, b2) \ 234ba6a1819Smrg { int cri; \ 235ba6a1819Smrg for (cri=0; cri<MSKCNT; cri++) \ 236ba6a1819Smrg dst[cri] = (b1[cri] & b2[cri]) } 237ba6a1819Smrg#define ORBITS(dst, b1, b2) \ 238ba6a1819Smrg { int cri; \ 239ba6a1819Smrg for (cri=0; cri<MSKCNT; cri++) \ 240ba6a1819Smrg dst[cri] = (b1[cri] | b2[cri]) } 241ba6a1819Smrg#define UNSETBITS(dst, b1) \ 242ba6a1819Smrg { int cri; \ 243ba6a1819Smrg for (cri=0; cri<MSKCNT; cri++) \ 244ba6a1819Smrg dst[cri] &= ~b1[cri]; } 245ba6a1819Smrg#if (MSKCNT==8) 246ba6a1819Smrg#define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3] || \ 247ba6a1819Smrg src[4] || src[5] || src[6] || src[7]) 248ba6a1819Smrg#endif 249ba6a1819Smrg/* 250ba6a1819Smrg * If MSKCNT>4 and not 8, then _FSANYSET is a routine defined in FSlibInt.c. 251ba6a1819Smrg * 252ba6a1819Smrg * #define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3] || src[4] ...) 253ba6a1819Smrg */ 254ba6a1819Smrg#endif 255ba6a1819Smrg 256ba6a1819Smrg 257ba6a1819Smrg#else 258ba6a1819Smrg 259ba6a1819Smrg#include <X11/Xwinsock.h> 260ba6a1819Smrg#include <X11/Xw32defs.h> 261ba6a1819Smrg 262ba6a1819Smrgtypedef fd_set FdSet; 263ba6a1819Smrg 264ba6a1819Smrg#define CLEARBITS(set) FD_ZERO(&set) 265ba6a1819Smrg#define BITSET(set,s) FD_SET(s,&set) 266ba6a1819Smrg#define _FSANYSET(set) set.fd_count 267ba6a1819Smrg 268ba6a1819Smrg#endif 269ba6a1819Smrg 270ba6a1819Smrg#include <X11/Xtrans/Xtrans.h> 271ba6a1819Smrg#include <stdlib.h> 272ba6a1819Smrg#include <string.h> 273ba6a1819Smrg 274ba6a1819Smrg/* 275ba6a1819Smrg * The following definitions can be used for locking requests in multi-threaded 276ba6a1819Smrg * address spaces. 277ba6a1819Smrg */ 278ba6a1819Smrg#define LockDisplay(dis) 279ba6a1819Smrg#define LockMutex(mutex) 280ba6a1819Smrg#define UnlockMutex(mutex) 281ba6a1819Smrg#define UnlockDisplay(dis) 282ba6a1819Smrg#define FSfree(ptr) free((ptr)) 283ba6a1819Smrg 284ba6a1819Smrg 285ba6a1819Smrg/* 286ba6a1819Smrg * Note that some machines do not return a valid pointer for malloc(0), in 287ba6a1819Smrg * which case we provide an alternate under the control of the 288ba6a1819Smrg * define MALLOC_0_RETURNS_NULL. This is necessary because some 289ba6a1819Smrg * FSlib code expects malloc(0) to return a valid pointer to storage. 290ba6a1819Smrg */ 291ba6a1819Smrg 292ba6a1819Smrg#ifdef MALLOC_0_RETURNS_NULL 293ba6a1819Smrg#define FSmalloc(size) malloc(((size) > 0 ? (size) : 1)) 294ba6a1819Smrg#define FSrealloc(ptr, size) realloc((ptr), ((size) > 0 ? (size) : 1)) 295ba6a1819Smrg#define FScalloc(nelem, elsize) calloc(((nelem) > 0 ? (nelem) : 1), (elsize)) 296ba6a1819Smrg 297ba6a1819Smrg#else 298ba6a1819Smrg 299ba6a1819Smrg#define FSmalloc(size) malloc((size)) 300ba6a1819Smrg#define FSrealloc(ptr, size) realloc((ptr), (size)) 301ba6a1819Smrg#define FScalloc(nelem, elsize) calloc((nelem), (elsize)) 302ba6a1819Smrg#endif 303ba6a1819Smrg 304ba6a1819Smrg/* 305ba6a1819Smrg * ReadvFromServer and WritevToSever use struct iovec, normally found 306ba6a1819Smrg * in Berkeley systems in <sys/uio.h>. See the readv(2) and writev(2) 307ba6a1819Smrg * manual pages for details. 308ba6a1819Smrg * 309ba6a1819Smrg * struct iovec { 310ba6a1819Smrg * caddr_t iov_base; 311ba6a1819Smrg * int iov_len; 312ba6a1819Smrg * }; 313ba6a1819Smrg */ 314ba6a1819Smrg 315ba6a1819Smrg#ifdef USG 316ba6a1819Smrg 317ba6a1819Smrg#if defined(USG) && !defined(CRAY) && !defined(umips) && !defined(MOTOROLA) 318ba6a1819Smrg#ifndef __TIMEVAL__ 319ba6a1819Smrg#define __TIMEVAL__ 320ba6a1819Smrgstruct timeval { /* BSD has in <sys/time.h> */ 321ba6a1819Smrg long tv_sec; 322ba6a1819Smrg long tv_usec; 323ba6a1819Smrg}; 324ba6a1819Smrg 325ba6a1819Smrg#endif /* __TIMEVAL__ */ 326ba6a1819Smrg 327ba6a1819Smrg#endif /* not CRAY or umips */ 328ba6a1819Smrg 329ba6a1819Smrg#endif /* USG */ 330ba6a1819Smrg 331ba6a1819Smrg 332ba6a1819Smrg#define SearchString(string, char) index((string), (char)) 333