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