Annotation of libwww/Library/src/wwwsys.html, revision 2.39
2.7 timbl 1: <HTML>
2: <HEAD>
2.2 timbl 3: <TITLE>System dependencies in the W3 library</TITLE>
2.7 timbl 4: </HEAD>
2.2 timbl 5: <BODY>
2.35 frystyk 6:
7: <H1>System Dependencies</H1>
8:
9: <PRE>
10: /*
11: ** (c) COPYRIGHT CERN 1994.
12: ** Please first read the full copyright statement in the file COPYRIGH.
13: */
14: </PRE>
15:
16: System-system differences for TCP include files and macros. This file
17: includes for each system the files necessary for network and file
18: I/O. <P>
19:
20: This module is a part of the <A
21: HREF="http://info.cern.ch/hypertext/WWW/Library/User/Guide/Guide.html">
22: Library of Common Code</A>.
2.26 frystyk 23:
2.2 timbl 24: <H3>Authors</H3>
25: <DL>
26: <DT>TBL
2.26 frystyk 27: <DD> Tim Berners-Lee, W3 project, CERN, <timbl@info.cern.ch>
2.2 timbl 28: <DT>EvA
2.26 frystyk 29: <DD> Eelco van Asperen <evas@cs.few.eur.nl>
2.2 timbl 30: <DT>MA
31: <DD> Marc Andreesen NCSA
2.7 timbl 32: <DT>MD
2.26 frystyk 33: <DD> Mark Donszelmann <duns@vxcern.cern.ch>
2.2 timbl 34: <DT>AT
2.26 frystyk 35: <DD> Aleksandar Totic <atotic@ncsa.uiuc.edu>
2.4 timbl 36: <DT>SCW
2.26 frystyk 37: <DD> Susan C. Weber <sweber@kyle.eitech.com>
38: <DT>HF
39: <DD> Henrik Frystyk, <frystyk@dxcern.cern.ch>
2.2 timbl 40: </DL>
41:
42: <H3>History:</H3>
43: <DL>
44: <DT>22 Feb 91
45: <DD> Written (TBL) as part of
46: the WWW library.
47: <DT>16 Jan 92
2.7 timbl 48: <DD> PC code from (EvA)
2.2 timbl 49: <DT>22 Apr 93
50: <DD> Merged diffs bits from
51: xmosaic release
2.4 timbl 52: <DT>29 Apr 93
2.7 timbl 53: <DD> Windows/NT code from (SCW)
54: <DT>29 Sep 93
55: <DD> VMS fixes (MD)
2.2 timbl 56: </DL>
57:
2.1 timbl 58: <PRE>
59: #ifndef TCP_H
60: #define TCP_H
2.26 frystyk 61: </PRE>
62:
63: <H2>Default values</H2>These values may be reset and altered by
64: system-specific sections later on. There is also a bunch of
65: <A NAME="z5" HREF="#z2">defaults</A> at the end and a section for
66: <A NAME="z11" HREF="#z10">ordinary BSD unix versions</A>.
2.1 timbl 67:
2.37 frystyk 68: <PRE>
69: #define SELECT /* Can handle >1 channel */
70: #define GOT_SYSTEM /* Can call shell with string */
71: #define GOT_PASSWD /* Can we use getpass() command */
72: </PRE>
2.1 timbl 73:
2.37 frystyk 74: <HR>
2.26 frystyk 75:
2.32 frystyk 76: <A NAME="z1"><H1>Platform Specific Stuff</H1></A>
2.26 frystyk 77:
2.37 frystyk 78: Information below this line is specific for most platforms. See also
79: <A NAME="z6" HREF="#z2">General Stuff</A>
2.26 frystyk 80:
81: <H2>Macintosh - Think-C</H2>
2.1 timbl 82:
2.26 frystyk 83: Think-C is one development environment on the Mac.<P>
2.1 timbl 84:
2.26 frystyk 85: We recommend that you compile with 4-byte ints to be compatible with
86: MPW C. We used Tom Milligan's s_socket library which was written for 4 byte
87: int, and the MacTCP library assumes 4-byte int.
88:
89: <PRE>
90: #ifdef THINK_C
2.1 timbl 91: #undef GOT_SYSTEM
92: #define DEBUG /* Can't put it on the CC command line */
93: #define NO_UNIX_IO /* getuid() missing */
94: #define NO_GETPID /* getpid() does not exist */
95: #define NO_GETWD /* getwd() does not exist */
96:
97: #define NETCLOSE s_close /* Routine to close a TCP-IP socket */
98: #define NETREAD s_read /* Routine to read from a TCP-IP socket */
99: #define NETWRITE s_write /* Routine to write to a TCP-IP socket */
100:
101: #define bind s_bind /* Funny names presumably to prevent clashes */
102: #define connect s_connect
103: #define accept s_accept
104: #define listen s_listen
105: #define socket s_socket
106: #define getsockname s_getsockname
107:
2.26 frystyk 108: /* The function prototype checking is better than the include files */
2.1 timbl 109:
110: extern s_close(int s);
111: extern s_read(int s, char *buffer, int buflen);
112: extern s_write(int s, const char *buffer, int buflen);
113:
114: extern bind(int s, struct sockaddr *name, int namelen);
115: extern accept(int s, struct sockaddr *addr, int *addrlen);
116: extern listen(int s, int qlen);
117: extern connect(int s, struct sockaddr *addr, int addrlen);
118:
119: extern s_socket(int domain, int type, int protocol);
120: extern s_getsockname(int s, struct sockaddr *name, int *namelen);
121: extern struct hostent *gethostent(const char * name);
122: extern unsigned long inet_addr(const char * name);
2.26 frystyk 123: #endif /* THINK_C */
124: </PRE>
2.1 timbl 125:
2.26 frystyk 126: <H2>Macintosh - MPW</H2>
127:
128: MPW is one development environment on the Mac.<P>
2.1 timbl 129:
2.26 frystyk 130: This entry was created by Aleksandar Totic (atotic@ncsa.uiuc.edu) this
131: file is compatible with sockets package released by NCSA. One major conflict
132: is that this library redefines write/read/etc as macros. In some of HTML code
133: these macros get executed when they should not be. Such files should
134: define NO_SOCKET_DEFS on top. This is a temporary hack.
2.1 timbl 135:
2.26 frystyk 136: <PRE>
137: #ifdef applec /* MPW */
2.2 timbl 138: #undef GOT_SYSTEM
139: #define DEBUG /* Can't put it on the CC command line */
2.37 frystyk 140:
2.26 frystyk 141: #define NO_UNIX_IO /* getuid() missing */
142: #define NO_GETPID /* getpid() does not exist */
143: #define NO_GETWD /* getwd() does not exist */
2.2 timbl 144:
145: #define NETCLOSE s_close /* Routine to close a TCP-IP socket */
146: #define NETREAD s_read /* Routine to read from a TCP-IP socket */
147: #define NETWRITE s_write /* Routine to write to a TCP-IP socket */
2.37 frystyk 148:
2.2 timbl 149: #define _ANSI_SOURCE
150: #define GUI
151: #define LINEFEED 10
152: #define ANON_FTP_HOSTNAME
153: #ifndef NO_SOCKET_DEFS
2.32 frystyk 154: #include <MacSockDefs.h>
2.26 frystyk 155: #endif /* NO_SOCKET_DEFS */
2.2 timbl 156:
2.32 frystyk 157: #include <socket.ext.h>
158: #include <string.h>
2.2 timbl 159:
2.37 frystyk 160: #endif /* applec MPW */
2.26 frystyk 161: </PRE>
2.1 timbl 162:
2.6 timbl 163: <H2>Big Blue - the world of incompatibility</H2>
2.26 frystyk 164:
165: IBM RS600</H2>On the IBM RS-6000, AIX is almost Unix. <P>
166:
167: <PRE>
168: #ifdef _AIX
2.2 timbl 169: #define AIX
170: #endif
2.1 timbl 171: #ifdef AIX
172: #define unix
173: #endif
174:
2.2 timbl 175: /* AIX 3.2
176: ** -------
177: */
178:
179: #ifdef _IBMR2
2.6 timbl 180: #define USE_DIRENT /* sys V style directory open */
2.2 timbl 181: #endif
2.26 frystyk 182: </PRE>
2.2 timbl 183:
2.26 frystyk 184: <H2>IBM VM-CMS, VM-XA Mainframes</H2>
2.2 timbl 185:
2.26 frystyk 186: MVS is compiled as for VM. MVS has no unix-style I/O. The command line
187: compile options seem to come across in lower case.
188:
189: <PRE>
190: #ifdef mvs
2.1 timbl 191: #define MVS
192: #endif
193:
194: #ifdef MVS
195: #define VM
196: #endif
197:
198: #ifdef NEWLIB
199: #pragma linkage(newlib,OS) /* Enables recursive NEWLIB */
200: #endif
201:
202: /* VM doesn't have a built-in predefined token, so we cheat: */
203: #ifndef VM
2.32 frystyk 204: #include <string.h> /* For bzero etc - not VM */
2.2 timbl 205: #endif
206:
207: /* Note: All include file names must have 8 chars max (+".h")
208: **
209: ** Under VM, compile with "(DEF=VM,SHORT_NAMES,DEBUG)"
210: **
211: ** Under MVS, compile with "NOMAR DEF(MVS)" to get rid of 72 char margin
212: ** System include files TCPIP and COMMMAC neeed line number removal(!)
213: */
214:
215: #ifdef VM /* or MVS -- see above. */
2.37 frystyk 216: #define GOT_PIPE /* Of sorts */
2.2 timbl 217: #define NOT_ASCII /* char type is not ASCII */
218: #define NO_UNIX_IO /* Unix I/O routines are not supported */
219: #define NO_GETPID /* getpid() does not exist */
220: #define NO_GETWD /* getwd() does not exist */
221: #ifndef SHORT_NAMES
222: #define SHORT_NAMES /* 8 character uniqueness for globals */
223: #endif
2.32 frystyk 224: #include <manifest.h>
225: #include <bsdtypes.h>
226: #include <stdefs.h>
227: #include <socket.h>
228: #include <in.h>
229: #include <inet.h>
230: #include <netdb.h>
231: #include <errno.h> /* independent */
2.2 timbl 232: extern char asciitoebcdic[], ebcdictoascii[];
233: #define TOASCII(c) (c=='\n' ? 10 : ebcdictoascii[c])
2.26 frystyk 234: #define FROMASCII(c) (c== 10 ? '\n' : asciitoebcdic[c])
2.32 frystyk 235: #include <bsdtime.h>
236: #include <time.h>
237: #include <string.h>
2.2 timbl 238: #define INCLUDES_DONE
239: #define TCP_INCLUDES_DONE
2.1 timbl 240: #endif
2.26 frystyk 241: </PRE>
2.1 timbl 242:
2.26 frystyk 243: <H2>IBM-PC running MS-DOS with SunNFS for TCP/IP</H2>
2.32 frystyk 244: This code thanks to Eelco van Asperen <evas@cs.few.eur.nl>
2.1 timbl 245:
2.26 frystyk 246: <PRE>
247: #ifdef PCNFS
2.32 frystyk 248: #include <sys/types.h>
249: #include <string.h>
250: #include <errno.h> /* independent */
251: #include <sys/time.h> /* independent */
252: #include <sys/stat.h>
253: #include <fcntl.h> /* In place of sys/param and sys/file */
2.2 timbl 254: #define INCLUDES_DONE
255: #define FD_SET(fd,pmask) (*(unsigned*)(pmask)) |= (1<<(fd))
256: #define FD_CLR(fd,pmask) (*(unsigned*)(pmask)) &= ~(1<<(fd))
257: #define FD_ZERO(pmask) (*(unsigned*)(pmask))=0
258: #define FD_ISSET(fd,pmask) (*(unsigned*)(pmask) & (1<<(fd)))
2.26 frystyk 259: #define NO_GROUPS
2.2 timbl 260: #endif /* PCNFS */
2.26 frystyk 261: </PRE>
2.2 timbl 262:
2.38 frystyk 263: <H2>PC running Windows (16-bit)</H2>
2.37 frystyk 264:
265: Help provided by Susan C. Weber <sweber@kyle.eitech.com>, Paul
266: Hounslow <P.M.Hounslow@reading.ac.uk>, and a lot of other PC people.
2.26 frystyk 267:
268: <PRE>
269: #ifdef _WINDOWS
2.37 frystyk 270: #include <windows.h>
271: #include <fcntl.h>
272: #include <sys\types.h>
273: #include <sys\stat.h>
274:
275: #define NETREAD(s,b,l) recv((s),(b),(l),0)
276: #define NETWRITE(s,b,l) send((s),(b),(l),0)
277: #define NETCLOSE(s) closesocket(s)
278: #define IOCTL(s,c,a) ioctlsocket(s,c, (long *) a)
2.4 timbl 279:
2.32 frystyk 280: #include <io.h>
281: #include <string.h>
282: #include <process.h>
283: #include <time.h>
284: #include <direct.h>
285: #include <stdio.h>
2.37 frystyk 286: #include <stdlib.h>
2.32 frystyk 287: #include <winsock.h>
2.37 frystyk 288:
289: #ifdef _WINDLL
290: #define NO_STDIO /* If we are making a DLL */
291: #endif
292:
293: #define NO_PASSWD
294: #define NO_GETWD
295: #define HAS_GETCWD
296: #define NO_GETPASSWD
297: #define NO_GETDOMAINNAME
298:
2.4 timbl 299: #define INCLUDES_DONE
300: #define TCP_INCLUDES_DONE
2.37 frystyk 301:
302: #define SOCKFD SOCKET /* WinSocks socket descriptor */
303: #define INVSOC INVALID_SOCKET /* WinSocks invalid socket */
304:
305: #define DESIRED_WINSOCK_VERSION 0x0101 /* we'd like winsock ver 1.1... */
306: #define MINIMUM_WINSOCK_VERSION 0x0101 /* ...but we'll take ver 1.1 :) */
307: </PRE>
308:
309: <H3>File Access</H3>
310:
311: These next defintions are because the UNIX stuff is not supplied with
312: BC4 (Paul Hounslow <P.M.Hounslow@reading.ac.uk>
313:
314: <PRE>
315: #define NO_UNIX_IO
316:
317: typedef unsigned long mode_t;
318:
319: #define _IFMT 0170000 /* type of file */
320: #define _IFDIR 0040000 /* directory */
321: #define _IFCHR 0020000 /* character special */
322: #define _IFBLK 0060000 /* block special */
323: #define _IFREG 0100000 /* regular */
324: #define _IFLNK 0120000 /* symbolic link */
325: #define _IFSOCK 0140000 /* socket */
326: #define _IFIFO 0010000 /* fifo */
327:
328: #define S_ISUID 0004000 /* set user id on execution */
329: #define S_ISGID 0002000 /* set group id on execution */
330: #define S_ISVTX 0001000 /* save swapped text even after use */
331:
332: #ifdef S_IREAD
333: #undef S_IREAD
334: #define S_IREAD 0000400 /* read permission, owner */
335: #endif
336:
337: #ifdef S_IWRITE
338: #undef S_IWRITE
339: #define S_IWRITE 0000200 /* write permission, owner */
340: #endif
341:
342: #ifdef S_IEXEC
343: #undef S_IEXEC
344: #define S_IEXEC 0000100 /* execute/search permission, owner */
345: #endif
346:
347: #define S_ENFMT 0002000 /* enforcement-mode locking */
348:
349: #ifdef S_IFMT
350: #undef S_IFMT
351: #define S_IFMT _IFMT
352: #endif
353:
354: #ifdef S_IDIR
355: #undef S_IDIR
356: #define S_IFDIR _IFDIR
357: #endif
358:
359: #ifdef S_IFCHR
360: #undef S_IFCHR
361: #define S_IFCHR _IFCHR
362: #endif
363:
364: #ifdef S_IBLK
365: #undef S_IBLK
366: #define S_IFBLK _IFBLK
367: #endif
368:
369: #ifdef S_IREG
370: #undef S_IREG
371: #define S_IFREG _IFREG
372: #endif
373:
374: #define S_IFLNK _IFLNK
375:
376: #ifdef S_IFIFO
377: #undef S_IFIFO
378: #define S_IFIFO _IFIFO
379: #endif
380:
381: #define S_IRWXU 0000700 /* rwx, owner */
382: #define S_IRUSR 0000400 /* read permission, owner */
383: #define S_IWUSR 0000200 /* write permission, owner */
384: #define S_IXUSR 0000100 /* execute/search permission, owner */
385: #define S_IRWXG 0000070 /* rwx, group */
386: #define S_IRGRP 0000040 /* read permission, group */
387: #define S_IWGRP 0000020 /* write permission, grougroup */
388: #define S_IXGRP 0000010 /* execute/search permission, group */
389: #define S_IRWXO 0000007 /* rwx, other */
390: #define S_IROTH 0000004 /* read permission, other */
391: #define S_IWOTH 0000002 /* write permission, other */
392: #define S_IXOTH 0000001 /* execute/search permission, other */
393:
394: #define S_ISREG(m) (((m)&_IFMT) == _IFREG)
395: </PRE>
396:
397: <H3>Errno and Return Codes</H3>
398:
399: Winsock has its own errno codes and it returns them through
400: WSAGetLastError(). However, it does also support BSD error codes, so
401: we make a compromise.
402:
403: <PRE>
404: /* extern int errno; */
405: #define socerrno WSAGetLastError()
406: #define ERRNO_DONE
407: </PRE>
408:
409: Return code for socket functions. We can't use -1 as return value
410:
411: <PRE>
412:
2.4 timbl 413: #endif /* WINDOWS */
2.26 frystyk 414: </PRE>
2.2 timbl 415:
2.38 frystyk 416: <H2>Windows NT (32 bit)</H2>
417:
418: Some special things for the 32 bit version...
419:
420: <PRE>
421: #ifdef WIN32
422: #define EWOULDBLOCK WSAEWOULDBLOCK
423: #define EINPROGRESS WSAEINPROGRESS
424: #define ECONNREFUSED WSAECONNREFUSED
425: #define ETIMEDOUT WSAETIMEDOUT
426: #define ENETUNREACH WSAENETUNREACH
427: #define EHOSTUNREACH WSAEHOSTUNREACH
428: #define EHOSTDOWN WSAEHOSTDOWN
429: #define EISCONN WSAEISCONN
2.39 ! frystyk 430:
! 431: #define SLEEP(n) Sleep((n)000)
2.38 frystyk 432: #endif
433: </PRE>
434:
2.26 frystyk 435: <H2>VAX/VMS</H2>
2.38 frystyk 436:
2.26 frystyk 437: Under VMS, there are many versions of TCP-IP. Define one if you do not
2.4 timbl 438: use Digital's UCX product:
2.38 frystyk 439:
2.4 timbl 440: <DL>
441: <DT>UCX
2.5 timbl 442: <DD> DEC's "Ultrix connection" (default)
2.4 timbl 443: <DT>WIN_TCP
2.5 timbl 444: <DD> From Wollongong, now GEC
445: software.
2.4 timbl 446: <DT>MULTINET
2.5 timbl 447: <DD> From SRI, now from TGV Inv.
2.4 timbl 448: <DT>DECNET
2.5 timbl 449: <DD> Cern's TCP socket emulation
2.4 timbl 450: over DECnet
451: </DL>
2.37 frystyk 452:
453: The last three do not interfere with the unix i/o library, and so they
454: need special calls to read, write and close sockets. In these cases
455: the socket number is a VMS channel number, so we make the @@@ HORRIBLE
456: @@@ assumption that a channel number will be greater than 10 but a
457: unix file descriptor less than 10. It works.
2.26 frystyk 458:
459: <PRE>
460: #ifdef VMS
2.7 timbl 461: #define CACHE_FILE_PREFIX "SYS$LOGIN:Z_"
462:
463: #ifdef WIN_TCP
2.32 frystyk 464: #define NETREAD(s,b,l) ((s)>10 ? netread((s),(b),(l)) : read((s),(b),(l)))
465: #define NETWRITE(s,b,l) ((s)>10 ? netwrite((s),(b),(l)) : write((s),(b),(l)))
466: #define NETCLOSE(s) ((s)>10 ? netclose(s) : close(s))
2.16 duns 467: #endif /* WIN_TCP */
2.1 timbl 468:
469: #ifdef MULTINET
470: #undef NETCLOSE
471: #undef NETREAD
472: #undef NETWRITE
2.32 frystyk 473: #define NETREAD(s,b,l) ((s)>10 ? socket_read((s),(b),(l)) : read((s),(b),(l)))
474: #define NETWRITE(s,b,l) ((s)>10 ? socket_write((s),(b),(l)) : \
2.1 timbl 475: write((s),(b),(l)))
2.32 frystyk 476: #define NETCLOSE(s) ((s)>10 ? socket_close(s) : close(s))
2.37 frystyk 477: #define IOCTL(s,c,a) socket_ioctl(s,c,a);
2.16 duns 478: #endif /* MULTINET */
2.1 timbl 479:
480: #ifdef DECNET
481: #undef SELECT /* not supported */
2.32 frystyk 482: #define NETREAD(s,b,l) ((s)>10 ? recv((s),(b),(l),0) : read((s),(b),(l)))
483: #define NETWRITE(s,b,l) ((s)>10 ? send((s),(b),(l),0) : write((s),(b),(l)))
484: #define NETCLOSE(s) ((s)>10 ? socket_close(s) : close(s))
2.1 timbl 485: #endif /* Decnet */
2.31 duns 486:
2.1 timbl 487: /* Certainly this works for UCX and Multinet; not tried for Wollongong
488: */
489: #ifdef MULTINET
2.32 frystyk 490: #include <time.h>
2.16 duns 491: #ifdef __TIME_T
492: #define __TYPES
493: #define __TYPES_LOADED
494: #endif /* __TIME_T */
2.37 frystyk 495: #include <multinet_root:[multinet.include.sys]types.h>
496: #include <multinet_root:[multinet.include]errno.h>
2.16 duns 497: #ifdef __TYPES
498: #define __TIME_T
499: #endif /* __TYPE */
500: #ifdef __TIME_LOADED
501: #define __TIME
502: #endif /* __TIME_LOADED */
2.37 frystyk 503: #include <multinet_root:[multinet.include.sys]time.h>
2.16 duns 504: #else /* not MULTINET */
2.32 frystyk 505: #include <types.h>
506: #include <errno.h>
507: #include <time.h>
2.16 duns 508: #endif /* not MULTINET */
2.1 timbl 509:
510: #include string
511:
512: #ifndef STDIO_H
2.24 luotonen 513: #include <stdio>
2.1 timbl 514: #define STDIO_H
515: #endif
516:
517: #include file
518:
2.37 frystyk 519: #ifndef DECNET /* Why is it used at all ? Types conflict with "types.h> */
2.1 timbl 520: #include unixio
521: #endif
522:
523: #define INCLUDES_DONE
524:
525: #ifdef MULTINET /* Include from standard Multinet directories */
2.37 frystyk 526: #include <multinet_root:[multinet.include.sys]socket.h>
2.1 timbl 527: #ifdef __TIME_LOADED /* defined by sys$library:time.h */
528: #define __TIME /* to avoid double definitions in next file */
529: #endif
2.37 frystyk 530: #include <multinet_root:[multinet.include.netinet]in.h>
531: #include <multinet_root:[multinet.include.arpa]inet.h>
532: #include <multinet_root:[multinet.include]netdb.h>
533: #include <multinet_root:[multinet.include.sys]ioctl.h>
2.1 timbl 534:
535: #else /* not multinet */
536: #ifdef DECNET
2.37 frystyk 537: #include <types.h> /* for socket.h */
538: #include <socket.h>
539: #include <dn"
540: #include <dnetdb"
2.1 timbl 541:
542: #else /* UCX or WIN */
2.16 duns 543: #ifdef CADDR_T
544: #define __CADDR_T
545: #endif /* problem with xlib.h inclusion */
2.32 frystyk 546: #include <socket.h>
547: #include <in.h>
548: #include <inet.h>
549: #include <netdb.h>
550: #include <ucx$inetdef.h>
2.1 timbl 551:
552: #endif /* not DECNET */
553: #endif /* of Multinet or other TCP includes */
554:
555: #define TCP_INCLUDES_DONE
2.26 frystyk 556: </PRE>
2.1 timbl 557:
2.31 duns 558: On VMS directory browsing is available through a separate
559: copy of dirent.c. The definition of R_OK seem to be missing
560: from the system include files...
561:
562: <PRE>
563: #define USE_DIRENT
2.37 frystyk 564: #define GOT_READ_DIR
565: #include <dirent.h>
2.31 duns 566: #define STRUCT_DIRENT struct dirent
567: #define R_OK 4
568: </PRE>
569:
2.37 frystyk 570: On VMS machines, the linker needs to be told to put global data
571: sections into a data segment using these storage
2.7 timbl 572: classes. (MarkDonszelmann)
2.26 frystyk 573:
574: <PRE>
575: #ifdef VAXC
2.7 timbl 576: #define GLOBALDEF globaldef
577: #define GLOBALREF globalref
578: #endif /* VAXC */
2.1 timbl 579: #endif /* vms */
2.26 frystyk 580: </PRE>
2.1 timbl 581:
2.26 frystyk 582: On non-VMS machines, the GLOBALDEF and GLOBALREF storage types default
2.7 timbl 583: to normal C storage types.
2.26 frystyk 584:
585: <PRE>
586: #ifndef GLOBALREF
2.7 timbl 587: #define GLOBALDEF
588: #define GLOBALREF extern
589: #endif
2.31 duns 590: </PRE>
591:
592: On non-VMS machines HTStat should be stat...On VMS machines
593: HTStat is a function that converts directories and devices so that you
594: can stat them.
595:
596: <PRE>
597: #ifdef VMS
2.37 frystyk 598: typedef unsigned long mode_t;
2.31 duns 599: #define HTLstat HTStat
600: #else /* non VMS */
601: #define HTStat stat
602: #define HTLstat lstat
603: #endif /* non VMS */
2.26 frystyk 604: </PRE>
2.7 timbl 605:
2.37 frystyk 606: <H3>Definition of Errno</H3>
607:
608: <PRE>
609: #ifdef VMS
610: #ifndef __DECC
611: extern int uerrno; /* Deposit of error info (as per errno.h) */
612: extern volatile noshare int socket_errno; /* socket VMS error info
613: (used for translation of vmserrno) */
614: extern volatile noshare int vmserrno; /* Deposit of VMS error info */
615: extern volatile noshare int errno; /* noshare to avoid PSECT conflict */
616: #define ERRNO_DONE
617: #endif /* not DECC */
618: #endif /* VMS */
619: </PRE>
620:
2.26 frystyk 621: <H2>SCO ODT unix version</H2>
2.1 timbl 622:
2.32 frystyk 623: (by Brian King)
624:
2.2 timbl 625: <PRE>
626: #ifdef sco
2.32 frystyk 627: #include <grp.h>
628: #include <unistd.h>
629: #include <sys/fcntl.h>
630: #include <time.h>
2.2 timbl 631: #define USE_DIRENT
2.32 frystyk 632: #define NEED_INITGROUPS
2.37 frystyk 633: #define NO_GETDOMAINNAME
2.1 timbl 634: #endif
2.26 frystyk 635: </PRE>
2.1 timbl 636:
2.2 timbl 637: <H2>MIPS unix</H2>
2.26 frystyk 638: Mips hack (bsd4.3/sysV mixture...)
2.1 timbl 639:
2.26 frystyk 640: <PRE>
2.25 luotonen 641: #ifdef Mips /* Bruker */
642: typedef mode_t int;
643: #define S_ENFMT S_ISGID /* record locking enforcement flag */
2.37 frystyk 644: #define S_ISCHR(m) ((m) & S_IFCHR)
645: #define S_ISBLK(m) ((m) & S_IFBLK)
646: #define S_ISDIR(m) (((m)& S_IFMT) == S_IFDIR)
647: #define S_ISREG(m) (((m)& S_IFMT) == S_IFREG)
2.32 frystyk 648: #define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
649: #define NO_STRFTIME
2.26 frystyk 650: </PRE>
651:
652: <H3>File Permissions</H3>
2.1 timbl 653:
2.26 frystyk 654: <PRE>
655: #ifndef S_IRWXU
656: #define S_IRWXU 0000700
657: #define S_IRWXG 0000070
658: #define S_IRWXO 0000007
659: #define S_IRUSR 0000400
660: #define S_IWUSR 0000200
661: #define S_IXUSR 0000100
662: #define S_IRGRP 0000040
663: #define S_IWGRP 0000020
664: #define S_IXGRP 0000010
665: #define S_IROTH 0000004
666: #define S_IWOTH 0000002
667: #define S_IXOTH 0000001
668: #endif /* S_IRWXU */
669: #endif /* Mips */
2.8 timbl 670: </PRE>
2.26 frystyk 671:
2.10 luotonen 672: <H2>Solaris</H2>
2.32 frystyk 673:
674: Includes Linux (thanks to Rainer Klute) and other SVR5 based systems
675:
2.10 luotonen 676: <PRE>
2.21 frystyk 677: #if defined(__svr4__) || defined(_POSIX_SOURCE) || defined(__hpux)
2.32 frystyk 678:
679: #ifdef UTS4 /* UTS wants sys/types.h first */
680: #include <sys/types.h>
681: #endif
682:
2.28 luotonen 683: #include <unistd.h>
2.32 frystyk 684:
685: #ifdef UTS4
686: #include <sys/fcntl.h>
687: #define POSIXWAIT
688: #endif
689:
690: #ifdef AIX /* Apple Unix */
2.28 luotonen 691: #include <fcntl.h>
692: #else
693: #include <sys/fcntl.h>
694: #endif
695: </PRE>
696:
2.32 frystyk 697: This is for NCR 3000 and Pyramid that also are SVR4 systems. Thanks to
698: <EM>Alex Podlecki, <a.podlecki@att.com></EM>
699:
2.28 luotonen 700: <PRE>
2.32 frystyk 701: #ifndef NGROUPS_MAX
702: #include <limits.h>
703: #endif
2.37 frystyk 704: </PRE>
705:
706: <CODE>getwd()</CODE> is BSD. System V has <CODE>getcwd()</CODE>
707:
708: <PRE>
709: #define NO_GETWD
710: #define HAS_GETCWD
2.32 frystyk 711:
2.33 frystyk 712: #endif /* Solaris and SVR4 */
2.32 frystyk 713: </PRE>
2.28 luotonen 714:
2.32 frystyk 715: <H2>UTS 2.1 (BSD-like)</H2>
716: <PRE>
717: #ifdef UTS2
2.28 luotonen 718: #include <time.h>
2.32 frystyk 719: #include <fcntl.h>
2.28 luotonen 720:
2.32 frystyk 721: #define NO_STRFTIME
722: #define WEXITSTATUS(x) ((int)((x).w_T.w_Retcode))
2.28 luotonen 723:
2.32 frystyk 724: #undef POSIXWAIT
725: #endif /* UTS2 */
2.10 luotonen 726: </PRE>
2.28 luotonen 727:
2.8 timbl 728: <H2>OSF/1</H2>
2.26 frystyk 729: <PRE>
730: #ifdef __osf__
2.8 timbl 731: #define USE_DIRENT
732: #endif /* OSF1 AXP */
2.21 frystyk 733: </PRE>
734:
2.22 luotonen 735: <H2>ISC 3.0</H2>
736: by Lauren Weinstein <lauren@vortex.com>.
737: <PRE>
738:
2.30 luotonen 739: #ifdef ISC3 /* Lauren */
740: #define USE_DIRENT
2.37 frystyk 741: #define GOT_READ_DIR
2.30 luotonen 742: #include <sys/ipc.h>
743: #include <sys/dirent.h>
744: #define direct dirent
745: #include <sys/unistd.h>
746: #define d_namlen d_reclen
747: #include <sys/limits.h>
2.37 frystyk 748: typedef int mode_t;
2.30 luotonen 749: #define SIGSTP
750: #define POSIXWAIT
2.37 frystyk 751: #define _POSIX_SOURCE
2.30 luotonen 752: #include <sys/types.h>
753: #include <sys/wait.h>
754: #include <net/errno.h>
2.22 luotonen 755:
2.30 luotonen 756: #define _SYSV3
757: #include <time.h>
2.22 luotonen 758:
2.25 luotonen 759: #include <sys/fcntl.h>
2.22 luotonen 760: #define S_ISDIR(m) (((m) & 0170000) == 0040000)
761: #define S_ISCHR(m) (((m) & 0170000) == 0020000)
762: #define S_ISBLK(m) (((m) & 0170000) == 0060000)
763: #define S_ISREG(m) (((m) & 0170000) == 0100000)
764: #define S_ISFIFO(m) (((m) & 0170000) == 0010000)
765: #define S_ISLNK(m) (((m) & 0170000) == 0120000)
766: #endif /* ISC 3.0 */
2.21 frystyk 767: </PRE>
768:
2.13 luotonen 769: <H2>NeXT</H2>
770: <PRE>
771: #ifdef NeXT
2.37 frystyk 772: #include <sys/types.h>
773: #include <sys/stat.h>
2.15 luotonen 774:
2.17 luotonen 775: typedef unsigned short mode_t;
776:
2.15 luotonen 777: #ifndef S_ISDIR
778: #define S_ISDIR(m) (m & S_IFDIR)
779: #define S_ISREG(m) (m & S_IFREG)
780: #define S_ISCHR(m) (m & S_IFCHR)
781: #define S_ISBLK(m) (m & S_IFBLK)
782: #define S_ISLNK(m) (m & S_IFLNK)
783: #define S_ISSOCK(m) (m & S_IFSOCK)
784: #define S_ISFIFO(m) (NO)
785: #endif
786:
787: #ifndef WEXITSTATUS
788: #define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
789: #endif
2.36 frystyk 790:
791: #ifndef O_NONBLOCK
792: #define O_NONBLOCK O_NDELAY
793: #endif
2.25 luotonen 794: </PRE>
795:
2.26 frystyk 796: <H3>File Permissions for NeXT</H3>
2.25 luotonen 797: <PRE>
2.15 luotonen 798: #ifndef S_IRWXU
799: #define S_IRWXU 0000700
800: #define S_IRWXG 0000070
801: #define S_IRWXO 0000007
2.17 luotonen 802: #define S_IRUSR 0000400
803: #define S_IWUSR 0000200
804: #define S_IXUSR 0000100
805: #define S_IRGRP 0000040
806: #define S_IWGRP 0000020
807: #define S_IXGRP 0000010
808: #define S_IROTH 0000004
809: #define S_IWOTH 0000002
810: #define S_IXOTH 0000001
2.26 frystyk 811: #endif /* S_IRWXU */
812: #endif /* NeXT */
813: </PRE>
814:
2.32 frystyk 815: <H2>A/UX Apple UNIX</H2>
816:
817: <ADDRESS>Kelly King, bhutab@apple.com and Jim Jagielski,
818: jim@jagubox.gsfc.nasa.gov</ADDRESS>
819:
820: <PRE>
821: #ifdef _AUX
822: #include <time.h>
823: #define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
824: #endif
825: </PRE>
826:
2.26 frystyk 827: <H2><A NAME="z10">Regular BSD unix versions</H2>
828:
829: These are a default unix where not already defined specifically.
830:
831: <PRE>
832: #ifndef INCLUDES_DONE
833:
2.32 frystyk 834: #include <sys/types.h>
835: #include <string.h>
836:
837: #include <errno.h> /* independent */
838: #include <sys/time.h> /* independent */
839: #include <sys/stat.h>
840: #include <sys/param.h>
841: #include <sys/file.h> /* For open() etc */
2.26 frystyk 842: #define INCLUDES_DONE
843: #endif /* Normal includes */
844: </PRE>
845:
846: <H3>Directory reading stuff - BSD or SYS V</H3>
847: <PRE>
848: #ifdef unix /* if this is to compile on a UNIX machine */
2.37 frystyk 849:
850: #define GOT_PIPE /* We do have a pipe */
851:
852: #define GOT_READ_DIR /* if directory reading functions are available */
853: #include <pwd.h>
854: #include <grp.h>
855:
856: #include <stdio.h>
2.26 frystyk 857:
2.27 frystyk 858: #ifndef NeXT
2.26 frystyk 859: #define USE_DIRENT /* Try this all the time, Henrik May 29 94 */
2.27 frystyk 860: #endif
2.26 frystyk 861: #ifdef USE_DIRENT /* sys v version */
2.32 frystyk 862: #include <dirent.h>
2.26 frystyk 863: #define STRUCT_DIRENT struct dirent
864: #else
2.32 frystyk 865: #include <sys/dir.h>
2.26 frystyk 866: #define STRUCT_DIRENT struct direct
867: #endif
868:
869: #if defined(sun) && defined(__svr4__)
2.32 frystyk 870: #include <sys/fcntl.h>
871: #include <limits.h>
2.26 frystyk 872: #endif
873: #ifndef FNDELAY
874: #define FNDELAY O_NDELAY
2.15 luotonen 875: #endif
2.37 frystyk 876:
2.38 frystyk 877: #if !defined(NeXT) && !defined(BSD4_4) && !defined(NetBSD)
2.37 frystyk 878: extern char *sys_errlist[];
879: extern int sys_nerr;
2.25 luotonen 880: #endif
2.37 frystyk 881:
882: #endif /* unix */
2.26 frystyk 883: </PRE>
884:
2.37 frystyk 885: <HR>
2.26 frystyk 886: <H1><A NAME="z2">General Stuff</A></H1>
2.15 luotonen 887:
2.26 frystyk 888: Information below this line is general for most platforms. <P>
889:
890: See also <A NAME="z3" HREF="#z1">Platform Specific Stuff</A>
2.39 ! frystyk 891:
! 892: <H3>Sleep System Call</H3>
! 893:
! 894: Some systems use milliseconds instead of seconds
! 895:
! 896: <PRE>
! 897: #ifndef SLEEP
! 898: #define SLEEP(n) sleep(n)
! 899: #endif
! 900: </PRE>
2.13 luotonen 901:
2.37 frystyk 902: <H3>SOCKS</H3>
903:
904: SOCKS modifications by Ian Dunkin <imd1707@ggr.co.uk>.
905: <PRE>
906: #if defined(SOCKS) && !defined(RULE_FILE)
907: #define connect Rconnect
908: #define accept Raccept
909: #define getsockname Rgetsockname
910: #define bind Rbind
911: #define listen Rlisten
912: #endif
913: </PRE>
914:
915: <H3>Network Family</H3>
916:
917: <PRE>
918: #ifdef DECNET
919: typedef struct sockaddr_dn SockA; /* See netdnet/dn.h or custom vms.h */
920: #else /* Internet */
921: typedef struct sockaddr_in SockA; /* See netinet/in.h */
922: #endif
923: </PRE>
924:
925: <H3>Default Values of Network Access</H3>
926:
927: <PRE>
928: #ifndef NETCLOSE
929: #define NETCLOSE close /* Routine to close a TCP-IP socket */
930: #endif
931:
932: #ifndef NETREAD
933: #define NETREAD read /* Routine to read from a TCP-IP socket */
934: #endif
935:
936: #ifndef NETWRITE
937: #define NETWRITE write /* Routine to write to a TCP-IP socket */
938: #endif
939: </PRE>
940:
2.2 timbl 941: <H3>Include files for TCP</H3>
2.26 frystyk 942: <PRE>
943: #ifndef TCP_INCLUDES_DONE
2.32 frystyk 944: #include <sys/socket.h>
945: #include <netinet/in.h>
2.37 frystyk 946: #include <arpa/inet.h> /* Must be after netinet/in.h */
947: #include <netdb.h>
948: #define TCP_INCLUDES_DONE
949: #endif
950: </PRE>
951:
952: <H3>Definition of errno and Return Code</H3>
953:
954: <PRE>
955: #ifndef ERRNO_DONE
956: extern int errno;
957: #define socerrno errno
958: #endif
959: </PRE>
960:
961: <H3>Definition of Socket Desrciptores</H3>
2.19 luotonen 962:
2.37 frystyk 963: This is necessary in order to support Windows NT...
2.19 luotonen 964:
2.37 frystyk 965: <PRE>
966: #ifndef SOCKFD
967: #define SOCKFD int /* Unix like socket descriptor */
968: #define INVSOC -1 /* Unix invalid socket */
969: #endif
2.26 frystyk 970: </PRE>
2.1 timbl 971:
2.26 frystyk 972: <H3>Rough estimate of max path length</H3>
2.37 frystyk 973:
2.26 frystyk 974: <PRE>
975: #ifndef HT_MAX_PATH
976: #ifdef MAXPATHLEN
977: #define HT_MAX_PATH MAXPATHLEN
978: #else
979: #ifdef PATH_MAX
980: #define HT_MAX_PATH PATH_MAX
981: #else
982: #define HT_MAX_PATH 1024 /* Any better ideas? */
983: #endif
984: #endif
985: #endif /* HT_MAX_PATH */
986: </PRE>
2.1 timbl 987:
2.37 frystyk 988: <H3>Definition of NGROUPS</H3>
2.26 frystyk 989:
990: <PRE>
991: #ifdef NO_UNIX_IO
992: #define NO_GROUPS
993: #endif
994:
995: #ifndef NO_GROUPS
996: #ifndef NGROUPS
997: #ifdef NGROUPS_MAX
998: #define NGROUPS NGROUPS_MAX
999: #else
1000: #define NGROUPS 20 /* Any better ideas? */
1001: #endif
1002: #endif
1003: #endif
2.2 timbl 1004: </PRE>
2.26 frystyk 1005:
2.34 frystyk 1006: <H3>Definition of Standard File Descriptors</H3>
2.37 frystyk 1007:
1008: If we don't have stderr etc. then set STDIN_FILENO to a dummy
1009: value. However, the value <B>IS</B> used!
1010:
2.34 frystyk 1011: <PRE>
2.37 frystyk 1012: #ifdef NO_STDIO
1013: #define STDIN_FILENO -1
1014: #else
2.34 frystyk 1015: #ifndef STDIN_FILENO
1016: #define STDIN_FILENO 0
1017: #endif
1018: #ifndef STDOUT_FILENO
1019: #define STDOUT_FILENO 1
1020: #endif
1021: #ifndef STDERR_FILENO
1022: #define STDERR_FILENO 2
2.37 frystyk 1023: #endif
2.34 frystyk 1024: #endif
1025: </PRE>
1026:
2.29 frystyk 1027: <H3>Definition of Max Domain Name Length</H3>
1028: <PRE>
1029: #ifndef MAXHOSTNAMELEN
1030: #define MAXHOSTNAMELEN 64 /* Any better ideas? */
1031: #endif
1032: </PRE>
1033:
2.26 frystyk 1034: <H3>Macros for manipulating masks for select()</H3>
1035: <PRE>
1036: #ifdef SELECT
2.1 timbl 1037: #ifndef FD_SET
1038: typedef unsigned int fd_set;
2.2 timbl 1039: #define FD_SET(fd,pmask) (*(pmask)) |= (1<<(fd))
1040: #define FD_CLR(fd,pmask) (*(pmask)) &= ~(1<<(fd))
2.1 timbl 1041: #define FD_ZERO(pmask) (*(pmask))=0
2.2 timbl 1042: #define FD_ISSET(fd,pmask) (*(pmask) & (1<<(fd)))
2.1 timbl 1043: #endif /* FD_SET */
1044: #endif /* SELECT */
2.26 frystyk 1045: </PRE>
1046:
1047: <H3>Macros for converting characters</H3>
2.1 timbl 1048:
2.26 frystyk 1049: <PRE>
1050: #ifndef TOASCII
2.1 timbl 1051: #define TOASCII(c) (c)
1052: #define FROMASCII(c) (c)
2.5 timbl 1053: #endif
2.32 frystyk 1054: </PRE>
1055:
1056: <H3>White Characters</H3>
1057:
1058: Is character c white space? For speed, include all control characters
1059:
1060: <PRE>
1061: #define WHITE(c) (((unsigned char)(TOASCII(c))) <= 32)
2.26 frystyk 1062: </PRE>
1063:
1064: <H3>Cache file prefix</H3>
2.5 timbl 1065:
2.26 frystyk 1066: This is something onto which we tag something meaningful to make a cache
1067: file name. used in HTWSRC.c at least. If it is nor defined at all, caching
2.5 timbl 1068: is turned off.
2.26 frystyk 1069:
1070: <PRE>
1071: #ifndef CACHE_FILE_PREFIX
2.5 timbl 1072: #ifdef unix
2.6 timbl 1073: #define CACHE_FILE_PREFIX "/usr/wsrc/"
2.5 timbl 1074: #endif
2.1 timbl 1075: #endif
2.17 luotonen 1076: </PRE>
1077:
1078: <PRE>
1079: #endif
1080: </PRE>
2.26 frystyk 1081: End of system-specific file
1082: </BODY>
2.7 timbl 1083: </HTML>
Webmaster