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