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