Annotation of libwww/Library/src/wwwsys.html, revision 2.43
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.42 frystyk 725: <H2>SGI/IRIX</H2>
726:
727: <PRE>
728: #ifdef __sgi
729: #define NO_GMTOFF
730: #endif
731: </PRE>
732:
2.10 luotonen 733: <H2>Solaris</H2>
2.32 frystyk 734:
735: Includes Linux (thanks to Rainer Klute) and other SVR5 based systems
736:
2.10 luotonen 737: <PRE>
2.21 frystyk 738: #if defined(__svr4__) || defined(_POSIX_SOURCE) || defined(__hpux)
2.32 frystyk 739:
2.42 frystyk 740: #define NO_GMTOFF /* They should have timezone */
741:
742: #ifdef __hpux
743: #define NO_ALTZONE
744: #endif
2.41 frystyk 745:
2.32 frystyk 746: #ifdef UTS4 /* UTS wants sys/types.h first */
747: #include <sys/types.h>
748: #endif
749:
2.28 luotonen 750: #include <unistd.h>
2.32 frystyk 751:
752: #ifdef UTS4
753: #include <sys/fcntl.h>
754: #define POSIXWAIT
755: #endif
756:
757: #ifdef AIX /* Apple Unix */
2.28 luotonen 758: #include <fcntl.h>
759: #else
760: #include <sys/fcntl.h>
761: #endif
762: </PRE>
763:
2.32 frystyk 764: This is for NCR 3000 and Pyramid that also are SVR4 systems. Thanks to
765: <EM>Alex Podlecki, <a.podlecki@att.com></EM>
766:
2.28 luotonen 767: <PRE>
2.32 frystyk 768: #ifndef NGROUPS_MAX
769: #include <limits.h>
770: #endif
2.41 frystyk 771:
772: /* Pyramid and Mips can't uppercase non-alpha */
773: #ifdef pyramid
774: #define TOLOWER(c) (isupper(c) ? tolower(c) : (c))
775: #define TOUPPER(c) (islower(c) ? toupper(c) : (c))
776: #endif
777:
2.37 frystyk 778: </PRE>
779:
780: <CODE>getwd()</CODE> is BSD. System V has <CODE>getcwd()</CODE>
781:
782: <PRE>
783: #define NO_GETWD
784: #define HAS_GETCWD
2.32 frystyk 785:
2.33 frystyk 786: #endif /* Solaris and SVR4 */
2.32 frystyk 787: </PRE>
2.28 luotonen 788:
2.32 frystyk 789: <H2>UTS 2.1 (BSD-like)</H2>
790: <PRE>
791: #ifdef UTS2
2.28 luotonen 792: #include <time.h>
2.32 frystyk 793: #include <fcntl.h>
2.28 luotonen 794:
2.41 frystyk 795: #ifndef R_OK
796: #define R_OK 4
797: #endif
2.32 frystyk 798: #define NO_STRFTIME
799: #define WEXITSTATUS(x) ((int)((x).w_T.w_Retcode))
2.28 luotonen 800:
2.32 frystyk 801: #undef POSIXWAIT
802: #endif /* UTS2 */
2.10 luotonen 803: </PRE>
2.28 luotonen 804:
2.8 timbl 805: <H2>OSF/1</H2>
2.26 frystyk 806: <PRE>
807: #ifdef __osf__
2.8 timbl 808: #define USE_DIRENT
2.43 ! frystyk 809: #define NO_TIMEZONE
2.8 timbl 810: #endif /* OSF1 AXP */
2.43 ! frystyk 811: </PRE>
! 812:
! 813: <H2>Ultrix Decstation</H2>
! 814:
! 815: <PRE>
! 816: #ifdef decstation
! 817: #define NO_TIMEZONE /* Ultrix has gmtoff */
! 818: #endif
2.21 frystyk 819: </PRE>
820:
2.22 luotonen 821: <H2>ISC 3.0</H2>
822: by Lauren Weinstein <lauren@vortex.com>.
823: <PRE>
824:
2.30 luotonen 825: #ifdef ISC3 /* Lauren */
826: #define USE_DIRENT
2.37 frystyk 827: #define GOT_READ_DIR
2.30 luotonen 828: #include <sys/ipc.h>
829: #include <sys/dirent.h>
830: #define direct dirent
831: #include <sys/unistd.h>
832: #define d_namlen d_reclen
833: #include <sys/limits.h>
2.37 frystyk 834: typedef int mode_t;
2.41 frystyk 835:
2.30 luotonen 836: #define SIGSTP
2.41 frystyk 837: #define NO_GMTOFF
838:
2.30 luotonen 839: #define POSIXWAIT
2.37 frystyk 840: #define _POSIX_SOURCE
2.41 frystyk 841:
2.30 luotonen 842: #include <sys/types.h>
843: #include <sys/wait.h>
844: #include <net/errno.h>
2.22 luotonen 845:
2.30 luotonen 846: #define _SYSV3
847: #include <time.h>
2.22 luotonen 848:
2.25 luotonen 849: #include <sys/fcntl.h>
2.22 luotonen 850: #define S_ISDIR(m) (((m) & 0170000) == 0040000)
851: #define S_ISCHR(m) (((m) & 0170000) == 0020000)
852: #define S_ISBLK(m) (((m) & 0170000) == 0060000)
853: #define S_ISREG(m) (((m) & 0170000) == 0100000)
854: #define S_ISFIFO(m) (((m) & 0170000) == 0010000)
855: #define S_ISLNK(m) (((m) & 0170000) == 0120000)
856: #endif /* ISC 3.0 */
2.21 frystyk 857: </PRE>
858:
2.13 luotonen 859: <H2>NeXT</H2>
2.41 frystyk 860:
861: Next has a lot of strange changes in constants...
862:
2.13 luotonen 863: <PRE>
864: #ifdef NeXT
2.37 frystyk 865: #include <sys/types.h>
866: #include <sys/stat.h>
2.15 luotonen 867:
2.17 luotonen 868: typedef unsigned short mode_t;
869:
2.15 luotonen 870: #ifndef S_ISDIR
871: #define S_ISDIR(m) (m & S_IFDIR)
872: #define S_ISREG(m) (m & S_IFREG)
873: #define S_ISCHR(m) (m & S_IFCHR)
874: #define S_ISBLK(m) (m & S_IFBLK)
875: #define S_ISLNK(m) (m & S_IFLNK)
876: #define S_ISSOCK(m) (m & S_IFSOCK)
877: #define S_ISFIFO(m) (NO)
878: #endif
879:
880: #ifndef WEXITSTATUS
881: #define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
882: #endif
2.36 frystyk 883:
884: #ifndef O_NONBLOCK
885: #define O_NONBLOCK O_NDELAY
886: #endif
2.25 luotonen 887: </PRE>
888:
2.26 frystyk 889: <H3>File Permissions for NeXT</H3>
2.25 luotonen 890: <PRE>
2.15 luotonen 891: #ifndef S_IRWXU
892: #define S_IRWXU 0000700
893: #define S_IRWXG 0000070
894: #define S_IRWXO 0000007
2.17 luotonen 895: #define S_IRUSR 0000400
896: #define S_IWUSR 0000200
897: #define S_IXUSR 0000100
898: #define S_IRGRP 0000040
899: #define S_IWGRP 0000020
900: #define S_IXGRP 0000010
901: #define S_IROTH 0000004
902: #define S_IWOTH 0000002
903: #define S_IXOTH 0000001
2.26 frystyk 904: #endif /* S_IRWXU */
905: #endif /* NeXT */
906: </PRE>
907:
2.32 frystyk 908: <H2>A/UX Apple UNIX</H2>
909:
910: <ADDRESS>Kelly King, bhutab@apple.com and Jim Jagielski,
911: jim@jagubox.gsfc.nasa.gov</ADDRESS>
912:
913: <PRE>
914: #ifdef _AUX
915: #include <time.h>
916: #define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
2.41 frystyk 917: #define NO_STRFTIME
2.32 frystyk 918: #endif
919: </PRE>
920:
2.26 frystyk 921: <H2><A NAME="z10">Regular BSD unix versions</H2>
922:
923: These are a default unix where not already defined specifically.
924:
925: <PRE>
926: #ifndef INCLUDES_DONE
927:
2.32 frystyk 928: #include <sys/types.h>
929: #include <string.h>
930:
931: #include <errno.h> /* independent */
932: #include <sys/time.h> /* independent */
933: #include <sys/stat.h>
934: #include <sys/param.h>
935: #include <sys/file.h> /* For open() etc */
2.26 frystyk 936: #define INCLUDES_DONE
937: #endif /* Normal includes */
938: </PRE>
939:
940: <H3>Directory reading stuff - BSD or SYS V</H3>
941: <PRE>
942: #ifdef unix /* if this is to compile on a UNIX machine */
2.37 frystyk 943:
944: #define GOT_PIPE /* We do have a pipe */
945:
946: #define GOT_READ_DIR /* if directory reading functions are available */
947: #include <pwd.h>
948: #include <grp.h>
949:
950: #include <stdio.h>
2.26 frystyk 951:
2.27 frystyk 952: #ifndef NeXT
2.26 frystyk 953: #define USE_DIRENT /* Try this all the time, Henrik May 29 94 */
2.27 frystyk 954: #endif
2.26 frystyk 955: #ifdef USE_DIRENT /* sys v version */
2.32 frystyk 956: #include <dirent.h>
2.26 frystyk 957: #define STRUCT_DIRENT struct dirent
958: #else
2.32 frystyk 959: #include <sys/dir.h>
2.26 frystyk 960: #define STRUCT_DIRENT struct direct
961: #endif
962:
963: #if defined(sun) && defined(__svr4__)
2.32 frystyk 964: #include <sys/fcntl.h>
965: #include <limits.h>
2.26 frystyk 966: #endif
967: #ifndef FNDELAY
968: #define FNDELAY O_NDELAY
2.15 luotonen 969: #endif
2.37 frystyk 970:
2.41 frystyk 971: #if defined(sun) && !defined(__svr4__)
972: #define NO_MKTIME
2.25 luotonen 973: #endif
2.37 frystyk 974:
975: #endif /* unix */
2.26 frystyk 976: </PRE>
977:
2.37 frystyk 978: <HR>
2.26 frystyk 979: <H1><A NAME="z2">General Stuff</A></H1>
2.15 luotonen 980:
2.26 frystyk 981: Information below this line is general for most platforms. <P>
982:
983: See also <A NAME="z3" HREF="#z1">Platform Specific Stuff</A>
2.39 frystyk 984:
985: <H3>Sleep System Call</H3>
986:
987: Some systems use milliseconds instead of seconds
988:
989: <PRE>
990: #ifndef SLEEP
991: #define SLEEP(n) sleep(n)
992: #endif
993: </PRE>
2.13 luotonen 994:
2.37 frystyk 995: <H3>SOCKS</H3>
996:
997: SOCKS modifications by Ian Dunkin <imd1707@ggr.co.uk>.
998: <PRE>
999: #if defined(SOCKS) && !defined(RULE_FILE)
1000: #define connect Rconnect
1001: #define accept Raccept
1002: #define getsockname Rgetsockname
1003: #define bind Rbind
1004: #define listen Rlisten
1005: #endif
1006: </PRE>
1007:
1008: <H3>Network Family</H3>
1009:
1010: <PRE>
1011: #ifdef DECNET
1012: typedef struct sockaddr_dn SockA; /* See netdnet/dn.h or custom vms.h */
1013: #else /* Internet */
1014: typedef struct sockaddr_in SockA; /* See netinet/in.h */
1015: #endif
1016: </PRE>
1017:
1018: <H3>Default Values of Network Access</H3>
1019:
1020: <PRE>
1021: #ifndef NETCLOSE
1022: #define NETCLOSE close /* Routine to close a TCP-IP socket */
1023: #endif
1024:
1025: #ifndef NETREAD
1026: #define NETREAD read /* Routine to read from a TCP-IP socket */
1027: #endif
1028:
1029: #ifndef NETWRITE
1030: #define NETWRITE write /* Routine to write to a TCP-IP socket */
1031: #endif
1032: </PRE>
1033:
2.2 timbl 1034: <H3>Include files for TCP</H3>
2.26 frystyk 1035: <PRE>
1036: #ifndef TCP_INCLUDES_DONE
2.32 frystyk 1037: #include <sys/socket.h>
1038: #include <netinet/in.h>
2.37 frystyk 1039: #include <arpa/inet.h> /* Must be after netinet/in.h */
1040: #include <netdb.h>
1041: #define TCP_INCLUDES_DONE
1042: #endif
1043: </PRE>
1044:
1045: <H3>Definition of errno and Return Code</H3>
1046:
2.41 frystyk 1047: This is the definition of error codes and the corresponding string
1048: constants. If we do not have the <CODE>strerror</CODE> function then
1049: try the error list table.
1050:
2.37 frystyk 1051: <PRE>
1052: #ifndef ERRNO_DONE
1053: extern int errno;
1054: #define socerrno errno
1055: #endif
2.41 frystyk 1056:
1057: #ifndef HAVE_STRERROR /* Otherwise use the table */
1058: extern char *sys_errlist[];
1059: extern int sys_nerr;
1060: #endif
2.37 frystyk 1061: </PRE>
1062:
1063: <H3>Definition of Socket Desrciptores</H3>
2.19 luotonen 1064:
2.37 frystyk 1065: This is necessary in order to support Windows NT...
2.19 luotonen 1066:
2.37 frystyk 1067: <PRE>
1068: #ifndef SOCKFD
1069: #define SOCKFD int /* Unix like socket descriptor */
1070: #define INVSOC -1 /* Unix invalid socket */
1071: #endif
2.26 frystyk 1072: </PRE>
2.1 timbl 1073:
2.26 frystyk 1074: <H3>Rough estimate of max path length</H3>
2.37 frystyk 1075:
2.26 frystyk 1076: <PRE>
1077: #ifndef HT_MAX_PATH
1078: #ifdef MAXPATHLEN
1079: #define HT_MAX_PATH MAXPATHLEN
1080: #else
1081: #ifdef PATH_MAX
1082: #define HT_MAX_PATH PATH_MAX
1083: #else
1084: #define HT_MAX_PATH 1024 /* Any better ideas? */
1085: #endif
1086: #endif
1087: #endif /* HT_MAX_PATH */
1088: </PRE>
2.1 timbl 1089:
2.37 frystyk 1090: <H3>Definition of NGROUPS</H3>
2.26 frystyk 1091:
1092: <PRE>
1093: #ifdef NO_UNIX_IO
1094: #define NO_GROUPS
1095: #endif
1096:
1097: #ifndef NO_GROUPS
1098: #ifndef NGROUPS
1099: #ifdef NGROUPS_MAX
1100: #define NGROUPS NGROUPS_MAX
1101: #else
1102: #define NGROUPS 20 /* Any better ideas? */
1103: #endif
1104: #endif
1105: #endif
2.2 timbl 1106: </PRE>
2.26 frystyk 1107:
2.34 frystyk 1108: <H3>Definition of Standard File Descriptors</H3>
2.37 frystyk 1109:
1110: If we don't have stderr etc. then set STDIN_FILENO to a dummy
1111: value. However, the value <B>IS</B> used!
1112:
2.34 frystyk 1113: <PRE>
2.37 frystyk 1114: #ifdef NO_STDIO
1115: #define STDIN_FILENO -1
1116: #else
2.34 frystyk 1117: #ifndef STDIN_FILENO
1118: #define STDIN_FILENO 0
1119: #endif
1120: #ifndef STDOUT_FILENO
1121: #define STDOUT_FILENO 1
1122: #endif
1123: #ifndef STDERR_FILENO
1124: #define STDERR_FILENO 2
2.37 frystyk 1125: #endif
2.34 frystyk 1126: #endif
1127: </PRE>
1128:
2.29 frystyk 1129: <H3>Definition of Max Domain Name Length</H3>
1130: <PRE>
1131: #ifndef MAXHOSTNAMELEN
1132: #define MAXHOSTNAMELEN 64 /* Any better ideas? */
1133: #endif
1134: </PRE>
1135:
2.41 frystyk 1136: <H3>File/Directory Management</H3>
1137: <PRE>
1138: #ifndef MKDIR
1139: #define MKDIR(a,b) mkdir((a), (b))
1140: #endif
1141:
1142: #ifndef REMOVE_FILE
1143: #define REMOVE_FILE unlink
1144: #endif
1145: </PRE>
1146:
2.26 frystyk 1147: <H3>Macros for manipulating masks for select()</H3>
1148: <PRE>
1149: #ifdef SELECT
2.1 timbl 1150: #ifndef FD_SET
1151: typedef unsigned int fd_set;
2.2 timbl 1152: #define FD_SET(fd,pmask) (*(pmask)) |= (1<<(fd))
1153: #define FD_CLR(fd,pmask) (*(pmask)) &= ~(1<<(fd))
2.1 timbl 1154: #define FD_ZERO(pmask) (*(pmask))=0
2.2 timbl 1155: #define FD_ISSET(fd,pmask) (*(pmask) & (1<<(fd)))
2.1 timbl 1156: #endif /* FD_SET */
1157: #endif /* SELECT */
2.26 frystyk 1158: </PRE>
1159:
1160: <H3>Macros for converting characters</H3>
2.1 timbl 1161:
2.26 frystyk 1162: <PRE>
1163: #ifndef TOASCII
2.1 timbl 1164: #define TOASCII(c) (c)
1165: #define FROMASCII(c) (c)
2.5 timbl 1166: #endif
2.26 frystyk 1167: </PRE>
1168:
1169: <H3>Cache file prefix</H3>
2.5 timbl 1170:
2.26 frystyk 1171: This is something onto which we tag something meaningful to make a cache
1172: file name. used in HTWSRC.c at least. If it is nor defined at all, caching
2.5 timbl 1173: is turned off.
2.26 frystyk 1174:
1175: <PRE>
1176: #ifndef CACHE_FILE_PREFIX
2.5 timbl 1177: #ifdef unix
2.6 timbl 1178: #define CACHE_FILE_PREFIX "/usr/wsrc/"
2.5 timbl 1179: #endif
2.1 timbl 1180: #endif
2.17 luotonen 1181: </PRE>
1182:
1183: <PRE>
1184: #endif
1185: </PRE>
2.26 frystyk 1186: End of system-specific file
1187: </BODY>
2.7 timbl 1188: </HTML>
Webmaster