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

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

Webmaster