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

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

Webmaster