Annotation of libwww/Library/src/wwwsys.html, revision 2.60

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

Webmaster