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