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