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

2.7       timbl       1: <HTML>
                      2: <HEAD>
2.118     frystyk     3:   <!-- Changed by: Henrik Frystyk Nielsen, 15-Jul-1996 -->
2.109     frystyk     4:   <TITLE>W3C Sample Code Library libwww System Dependencies</TITLE>
2.7       timbl       5: </HEAD>
2.2       timbl       6: <BODY>
2.95      frystyk     7: <H1>
                      8:   System Dependencies
                      9: </H1>
2.35      frystyk    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>
2.95      frystyk    16: <P>
2.97      frystyk    17: This file makes up for the differencies in the systems and platforms supported
                     18: by libwww. On Unix, it is a question of <A HREF="../../INSTALL.html">using
                     19: autoconf</A> to figure out what environment we are in. This is done by running
2.113     frystyk    20: the configure script which creates a <CODE>wwwconf.h</CODE> file. This
2.97      frystyk    21: configuration include file contains a large set of macro definitions telling
                     22: what features we have and don't have. On platforms not supported by autoconf
                     23: (Windows, Mac, VMS etc.) you will find the information normally contained
2.113     frystyk    24: in the <CODE>wwwconf.h</CODE> file directly included below. The
2.97      frystyk    25: <A HREF="#Platform">second part of this file </A>uses all the information
2.113     frystyk    26: that we either have from the wwwconf.h file or directly coded and actually
2.97      frystyk    27: does the includes etc.
                     28: <P>
                     29: <UL>
                     30:   <LI>
2.113     frystyk    31:     <A HREF="wwwsys.html#Unix">Unix</A>
2.97      frystyk    32:   <LI>
2.113     frystyk    33:     <A HREF="wwwsys.html#Microsoft">Microsoft Windows Win32 API</A>
2.97      frystyk    34:   <LI>
2.113     frystyk    35:     <A HREF="wwwsys.html#Macintosh">Macintosh</A>
2.97      frystyk    36:   <LI>
2.113     frystyk    37:     <A HREF="wwwsys.html#Macintosh">Vax VMS</A>
2.97      frystyk    38: </UL>
2.95      frystyk    39: <P>
2.118     frystyk    40: This module is a part of the <A HREF="http://www.w3.org/Library/"> W3C Sample
                     41: Code Library</A>.
2.95      frystyk    42: <H3>
                     43:   Authors
                     44: </H3>
2.2       timbl      45: <DL>
2.95      frystyk    46:   <DT>
                     47:     TBL
                     48:   <DD>
                     49:     Tim Berners-Lee, W3 project, CERN, &lt;timbl@w3.org&gt;
                     50:   <DT>
                     51:     EvA
                     52:   <DD>
                     53:     Eelco van Asperen &lt;evas@cs.few.eur.nl&gt;
                     54:   <DT>
                     55:     MA
                     56:   <DD>
                     57:     Marc Andreesen NCSA
                     58:   <DT>
                     59:     MD
                     60:   <DD>
                     61:     Mark Donszelmann &lt;duns@vxcern.cern.ch&gt;
                     62:   <DT>
                     63:     AT
                     64:   <DD>
                     65:     Aleksandar Totic &lt;atotic@ncsa.uiuc.edu&gt;
                     66:   <DT>
                     67:     SCW
                     68:   <DD>
                     69:     Susan C. Weber &lt;sweber@kyle.eitech.com&gt;
                     70:   <DT>
                     71:     HF
                     72:   <DD>
                     73:     Henrik Frystyk, &lt;frystyk@w3.org&gt;
                     74:   <DT>
                     75:     CLB
                     76:   <DD>
                     77:     Charlie Brooks, &lt;cbrooks@osf.org&gt;
2.2       timbl      78: </DL>
2.95      frystyk    79: <H3>
                     80:   History:
                     81: </H3>
2.2       timbl      82: <DL>
2.95      frystyk    83:   <DT>
                     84:     22 Feb 91
                     85:   <DD>
                     86:     Written (TBL) as part of the WWW library.
                     87:   <DT>
                     88:     16 Jan 92
                     89:   <DD>
                     90:     PC code from (EvA)
                     91:   <DT>
                     92:     22 Apr 93
                     93:   <DD>
                     94:     Merged diffs bits from xmosaic release
                     95:   <DT>
                     96:     29 Apr 93
                     97:   <DD>
                     98:     Windows/NT code from (SCW)
                     99:   <DT>
                    100:     29 Sep 93
                    101:   <DD>
                    102:     Mar 96 CLB - changed SLEEP() macro for Windows/NT MSC compiler added
                    103:     BOOLEAN_DEFINED macro to avoid duplicate definitions in HUtils.h changed
                    104:     netread() macros to support reading from stdin,etc. as well as sockets. (Required
                    105:     for linemode browser to work).
                    106:   <DT>
                    107:     Henrik
                    108:   <DD>
                    109:     Changed to support autoconf for Unix
2.2       timbl     110: </DL>
2.1       timbl     111: <PRE>
2.88      frystyk   112: #ifndef SYSDEP_H
                    113: #define SYSDEP_H
2.26      frystyk   114: </PRE>
2.95      frystyk   115: <H1>
                    116:   Platform Specific Stuff
                    117: </H1>
                    118: <H2>
2.97      frystyk   119:   <A NAME="Unix">Unix</A>
2.95      frystyk   120: </H2>
                    121: <P>
2.97      frystyk   122: We rely on <I>autoconf</I> to do the dirty job. If you have any changhes
                    123: then please add them to the <A HREF="../../../INSTALL.html">configure
                    124: script</A>
2.26      frystyk   125: <PRE>
2.88      frystyk   126: #ifdef HAVE_CONFIG_H
2.113     frystyk   127: #include &lt;wwwconf.h&gt;
2.1       timbl     128: #endif
2.26      frystyk   129: </PRE>
2.95      frystyk   130: <H2>
2.97      frystyk   131:   <A NAME="Microsoft">Microsoft Windows Win32 API</A>
2.95      frystyk   132: </H2>
                    133: <P>
2.83      frystyk   134: Help provided by Eric Prud'hommeaux, Susan C. Weber
                    135: &lt;sweber@kyle.eitech.com&gt;, Paul Hounslow
                    136: &lt;P.M.Hounslow@reading.ac.uk&gt;, and a lot of other PC people.
2.26      frystyk   137: <PRE>
2.83      frystyk   138: #if defined(_WINDOWS) || defined(_CONSOLE)
                    139: #define WWW_MSWINDOWS
                    140: #endif
                    141: 
2.95      frystyk   142: #if defined(_WINDOWS) &amp;&amp; !defined (_CONSOLE)
2.83      frystyk   143: #define WWW_WIN_WINDOW
                    144: #endif
                    145: 
                    146: #if defined(_CONSOLE)
                    147: #define WWW_WIN_CONSOLE
                    148: #endif
                    149: 
2.84      frystyk   150: #ifdef WWW_MSWINDOWS
2.107     frystyk   151: 
2.111     frystyk   152: #include &lt;windows.h&gt;
                    153: #include &lt;io.h&gt;
                    154: #include &lt;process.h&gt;
                    155: #include &lt;winsock.h&gt;
                    156: 
2.107     frystyk   157: #include "windows/config.h"
                    158: 
2.37      frystyk   159: #define NETREAD(s,b,l)  recv((s),(b),(l),0)
                    160: #define NETWRITE(s,b,l) send((s),(b),(l),0)
                    161: #define NETCLOSE(s)     closesocket(s)
                    162: #define IOCTL(s,c,a)   ioctlsocket(s,c, (long *) a)
2.4       timbl     163: 
2.41      frystyk   164: #define MKDIR(a,b)     mkdir((a))
2.56      frystyk   165: #define REMOVE(a)      remove((a))
2.47      frystyk   166: #define DEFAULT_SUFFIXES       "."
2.41      frystyk   167: 
2.78      frystyk   168: #ifndef _CONSOLE
                    169: #define NO_STDIO
2.37      frystyk   170: #endif
                    171: 
2.79      frystyk   172: #define SOCKET SOCKET                  /* WinSocks socket descriptor */
2.37      frystyk   173: #define INVSOC INVALID_SOCKET          /* WinSocks invalid socket */
                    174: 
                    175: #define DESIRED_WINSOCK_VERSION        0x0101  /* we'd like winsock ver 1.1... */
                    176: #define MINIMUM_WINSOCK_VERSION        0x0101  /* ...but we'll take ver 1.1 :) */
                    177: </PRE>
2.95      frystyk   178: <H3>
                    179:   File and Directory Access
                    180: </H3>
                    181: <P>
                    182: These next defintions are because the UNIX stuff is not supplied with BC4
                    183: (Paul Hounslow &lt;P.M.Hounslow@reading.ac.uk&gt;)
2.37      frystyk   184: <PRE>
                    185: #define NO_UNIX_IO
                    186: 
2.84      frystyk   187: #define        _IFMT           0170000 /* type of file */
                    188: #define        _IFDIR          0040000 /* directory */
                    189: #define        _IFCHR          0020000 /* character special */
                    190: #define        _IFBLK          0060000 /* block special */
                    191: #define        _IFREG          0100000 /* regular */
                    192: #define        _IFLNK          0120000 /* symbolic link */
                    193: #define        _IFSOCK         0140000 /* socket */
                    194: #define        _IFIFO          0010000 /* fifo */
2.37      frystyk   195: 
                    196: #define        S_ISUID         0004000 /* set user id on execution */
                    197: #define        S_ISGID         0002000 /* set group id on execution */
                    198: #define        S_ISVTX         0001000 /* save swapped text even after use */
                    199: 
                    200: #ifdef S_IREAD
                    201: #undef S_IREAD
                    202: #define        S_IREAD         0000400 /* read permission, owner */
                    203: #endif
                    204: 
                    205: #ifdef S_IWRITE
                    206: #undef S_IWRITE
                    207: #define        S_IWRITE        0000200 /* write permission, owner */
                    208: #endif
                    209: 
                    210: #ifdef S_IEXEC
                    211: #undef S_IEXEC
                    212: #define        S_IEXEC         0000100 /* execute/search permission, owner */
                    213: #endif
                    214: 
                    215: #define        S_ENFMT         0002000 /* enforcement-mode locking */
                    216: 
                    217: #ifdef S_IFMT
                    218: #undef S_IFMT
                    219: #define        S_IFMT          _IFMT
                    220: #endif
                    221: 
                    222: #ifdef S_IDIR
                    223: #undef S_IDIR
                    224: #define        S_IFDIR         _IFDIR
                    225: #endif
                    226: 
                    227: #ifdef S_IFCHR
                    228: #undef S_IFCHR
                    229: #define        S_IFCHR         _IFCHR
                    230: #endif
                    231: 
                    232: #ifdef S_IBLK
                    233: #undef S_IBLK
                    234: #define        S_IFBLK         _IFBLK
                    235: #endif
                    236: 
                    237: #ifdef S_IREG
                    238: #undef S_IREG
                    239: #define        S_IFREG         _IFREG
                    240: #endif
                    241: 
                    242: #define        S_IFLNK         _IFLNK
                    243: 
                    244: #ifdef S_IFIFO
                    245: #undef S_IFIFO
                    246: #define        S_IFIFO         _IFIFO
                    247: #endif
                    248: 
                    249: #define        S_IRWXU         0000700 /* rwx, owner */
                    250: #define                S_IRUSR 0000400 /* read permission, owner */
                    251: #define                S_IWUSR 0000200 /* write permission, owner */
                    252: #define                S_IXUSR 0000100 /* execute/search permission, owner */
                    253: #define        S_IRWXG         0000070 /* rwx, group */
                    254: #define                S_IRGRP 0000040 /* read permission, group */
                    255: #define                S_IWGRP 0000020 /* write permission, grougroup */
                    256: #define                S_IXGRP 0000010 /* execute/search permission, group */
                    257: #define        S_IRWXO         0000007 /* rwx, other */
                    258: #define                S_IROTH 0000004 /* read permission, other */
                    259: #define                S_IWOTH 0000002 /* write permission, other */
                    260: #define                S_IXOTH 0000001 /* execute/search permission, other */
                    261: 
2.95      frystyk   262: #define        S_ISREG(m)      (((m)&amp;_IFMT) == _IFREG)
2.121     frystyk   263: 
                    264: #define DIR_SEPARATOR
                    265: #define DIR_SEPARATOR_CHAR     '\\'
                    266: #define DIR_SEPARATOR_STR      "\\"
2.37      frystyk   267: </PRE>
2.95      frystyk   268: <H3>
                    269:   Errno and Return Codes
                    270: </H3>
                    271: <P>
                    272: Winsock has its own errno codes and it returns them through WSAGetLastError().
                    273: However, it does also support BSD error codes, so we make a compromise. WSA
                    274: definitions moved from _WIN32 ifdef by EGP
2.37      frystyk   275: <PRE>
                    276: #define socerrno WSAGetLastError()
                    277: #define ERRNO_DONE
                    278: </PRE>
2.95      frystyk   279: <P>
                    280: Return code for socket functions. We can't use -1 as return value
                    281: <P>
2.104     eric      282: <PRE>
                    283: #define EWOULDBLOCK     WSAEWOULDBLOCK
2.77      frystyk   284: #define EINPROGRESS     WSAEINPROGRESS
                    285: #define ECONNREFUSED    WSAECONNREFUSED
                    286: #define ETIMEDOUT       WSAETIMEDOUT
                    287: #define ENETUNREACH     WSAENETUNREACH
                    288: #define EHOSTUNREACH    WSAEHOSTUNREACH
                    289: #define EHOSTDOWN       WSAEHOSTDOWN
                    290: #define EISCONN         WSAEISCONN
2.104     eric      291: #define EINVAL          WSAEINVAL
2.125     kahan     292: #define ECONNRESET      WSAECONNRESET
                    293: #define ECONNABORTED    WSAECONNABORTED
                    294: #define ESHUTDOWN       WSAESHUTDOWN
2.38      frystyk   295: 
2.48      frystyk   296: /* Some compilers do only define WIN32 and NOT _WINDOWS */
2.77      frystyk   297: #define NO_GROUPS
2.85      frystyk   298: 
2.77      frystyk   299: #ifdef _WIN32
2.85      frystyk   300: #define MKDIR(a,b)     mkdir((a))     /* CLB NT has mkdir, but only one arg */
2.77      frystyk   301: #define SLEEP(n)        Sleep((n)*1000)
                    302: #else
2.85      frystyk   303: #define MKDIR(a,b)     _mkdir((a))    /* CLB NT has mkdir, but only one arg */
2.50      frystyk   304: #endif /* WIN32 */
2.84      frystyk   305: 
                    306: #endif /* WWW_MSWINDOWS */
2.38      frystyk   307: </PRE>
2.95      frystyk   308: <H2>
2.97      frystyk   309:   <A NAME="Macintosh">Macintosh</A>
2.95      frystyk   310: </H2>
2.126     kahan     311: <H3>
                    312:   mingw32 - Minimalist GNU for Windows
                    313: </H3>
                    314: <P>
                    315: A bit like Cygwin, except it uses the native Windows API, which means
                    316: the programs do not need the huge Cygwin DLL to run.
                    317: <P>
                    318: Patch by Richard Atterer &lt;richard@atterer.net&gt;, October 2001
                    319: <PRE>
                    320: #ifdef __MINGW32__
                    321: 
                    322: #include &lt;winsock2.h&gt;
                    323: 
                    324: #define WWW_MSWINDOWS
                    325: /* #define WWW_WIN_CONSOLE */
                    326: #define WWW_WIN_WINDOW
                    327: /* #define WWW_WIN_ASYNC */
                    328: /* #define WWW_WIN_DLL */
                    329: 
                    330: #ifndef _WINSOCKAPI_
                    331: #define _WINSOCKAPI_
                    332: #endif
                    333: 
                    334: #define NETREAD(s,b,l)  recv((s),(b),(l),0)
                    335: #define NETWRITE(s,b,l) send((s),(b),(l),0)
                    336: #define NETCLOSE(s)     closesocket(s)
                    337: #define IOCTL(s,c,a)   ioctlsocket(s,c, (long *) a)
                    338: 
                    339: #define MKDIR(a,b)      mkdir(a)
                    340: #define REMOVE(a)      remove((a))
                    341: #define DEFAULT_SUFFIXES       "."
                    342: 
                    343: #define SOCKET SOCKET                  /* WinSocks socket descriptor */
                    344: #define INVSOC INVALID_SOCKET          /* WinSocks invalid socket */
                    345: 
                    346: #define DESIRED_WINSOCK_VERSION 0x0101  /* we'd like winsock ver 1.1... */
                    347: #define MINIMUM_WINSOCK_VERSION 0x0101  /* ...but we'll take ver 1.1 :) */
                    348: 
                    349: #define DIR_SEPARATOR
                    350: #define DIR_SEPARATOR_CHAR     '\\'
                    351: #define DIR_SEPARATOR_STR      "\\"
                    352: 
                    353: #define socerrno WSAGetLastError()
                    354: #define ERRNO_DONE
                    355: 
                    356: /* Taken from the WIN32 stuff above. */
                    357: #define EWOULDBLOCK     WSAEWOULDBLOCK
                    358: #define EINPROGRESS     WSAEINPROGRESS
                    359: #define ECONNREFUSED    WSAECONNREFUSED
                    360: #define ETIMEDOUT       WSAETIMEDOUT
                    361: #define ENETUNREACH     WSAENETUNREACH
                    362: #define EHOSTUNREACH    WSAEHOSTUNREACH
                    363: #define EHOSTDOWN       WSAEHOSTDOWN
                    364: #define EISCONN         WSAEISCONN
                    365: /*#define EINVAL          WSAEINVAL*/
                    366: #define ECONNRESET      WSAECONNRESET
                    367: #define ECONNABORTED    WSAECONNABORTED
                    368: #define ESHUTDOWN       WSAESHUTDOWN
                    369: 
                    370: /* The configure.in script is wrong to default to #define GETGROUPS_T int */
                    371: #ifdef GETGROUPS_T
                    372: #undef GETGROUPS_T
                    373: #endif
                    374: 
                    375: #define HT_LSTAT stat
                    376: 
                    377: #endif /* __MINGW32__ */
                    378: </PRE>
                    379: <H2>
                    380:   <A NAME="Macintosh">Macintosh</A>
                    381: </H2>
2.95      frystyk   382: <P>
2.97      frystyk   383: We have two environments on Macintosh: Codeworrior and MPV.
                    384: <H3>
                    385:   Metrowerks Codewarrior 6
                    386: </H3>
                    387: <P>
2.95      frystyk   388: Metrowerks Codewarrior is one development environment on the Mac. We are
                    389: using GUSI (1.5.9) by Matthias Neeracher &lt;neeri@iis.ee.ethz.ch&gt; for
2.97      frystyk   390: our socket lib. You can find more information about the
                    391: <A HREF="http://err.ethz.ch/~neeri/macintosh/gusiman/">GUSI Library</A> from
                    392: Switzerland.
2.95      frystyk   393: <P>
                    394: Compiles on PPC. Should compile on 68K.
                    395: <P>
2.118     frystyk   396: August 31, 1995 by Steven T. Roussey &lt;sroussey@eng.uci.edu&gt; (STR).
                    397: and jeff@macalot.com (Jeff Dripps). Thanks a bunch!
2.88      frystyk   398: <PRE>
                    399: #ifdef __MWERKS__
2.116     veillard  400: #include &lt;gusi.h&gt;
                    401: #include &lt;dirent.h&gt;
                    402: #include &lt;errno.h&gt;
                    403: #include &lt;sys/errno.h&gt;
                    404: #include &lt;sioux.h&gt;
2.88      frystyk   405: 
                    406: #define INCLUDES_DONE
                    407: #define TCP_INCLUDES_DONE
                    408: 
2.98      frystyk   409: #define GUSI                    /* Identifies changes made for GUSI */
2.88      frystyk   410: 
2.98      frystyk   411: #undef  HAVE_GETDOMAINNAME      /* STR */
2.88      frystyk   412: #undef  HAVE_GETPASS
                    413: #undef  HAVE_GETWD
                    414: 
                    415: #define HAVE_GETCWD
                    416: #define USE_DIRENT
                    417: #define NO_GROUPS
                    418: #define GOT_READ_DIR
                    419: 
2.98      frystyk   420: #undef  HAVE_TIMEZONE           /* STR */
2.88      frystyk   421: #define NO_GMTOFF
                    422: #define HAVE_STRERROR
2.98      frystyk   423: #define HAVE_GETHOSTNAME
2.88      frystyk   424: 
                    425: #define d_ino           d_fileno        /* backward compatibility */
                    426: 
2.98      frystyk   427: #define SLEEP(n)        GUSIDefaultSpin( SP_SLEEP, n/60)
2.88      frystyk   428: 
                    429: #define MKDIR(a,b)      mkdir(a)
2.98      frystyk   430: 
                    431: #define HAVE_STRFTIME           // added JTD:5/1/96
                    432: #define HAVE_MKTIME             // added JTD:5/1/96
                    433: #define HAVE_STRCHR             // added JTD:5/1/96
                    434: #define STDC_HEADERS            // added JTD:5/1/96
                    435: #define HAVE_MEMCPY             // added JTD:5/1/96
                    436: #define TTY_IS_SELECTABLE       // added JTD:5/1/96
                    437: #define HAVE_READDIR            // added JTD:5/1/96
                    438: #define HAVE_DIRENT_INO         // added JTD:5/1/96
                    439: #define HAVE_DIRENT_H           // added JTD:5/1/96
                    440: 
2.88      frystyk   441: #endif
                    442: </PRE>
2.97      frystyk   443: <H3>
                    444:   MPW
                    445: </H3>
2.95      frystyk   446: <P>
                    447: MPW is one development environment on the Mac.
                    448: <P>
                    449: This entry was created by Aleksandar Totic (atotic@ncsa.uiuc.edu) this file
                    450: is compatible with sockets package released by NCSA. One major conflict is
                    451: that this library redefines write/read/etc as macros. In some of HTML code
                    452: these macros get executed when they should not be. Such files should define
                    453: NO_SOCKET_DEFS on top. This is a temporary hack.
2.88      frystyk   454: <PRE>
                    455: #ifdef applec                  /* MPW  */
                    456: #undef HAVE_SYSTEM
                    457: #define DEBUG                  /* Can't put it on the CC command line */
                    458: 
                    459: #define NO_UNIX_IO             /* getuid() missing */
                    460: #undef  HAVE_GETPID            /* getpid() does not exist */
                    461: #define NO_GETWD               /* getwd() does not exist */
                    462: 
                    463: #define NETCLOSE s_close    /* Routine to close a TCP-IP socket */
                    464: #define NETREAD  s_read            /* Routine to read from a TCP-IP socket */
                    465: #define NETWRITE s_write    /* Routine to write to a TCP-IP socket */
                    466: 
                    467: #define _ANSI_SOURCE
                    468: #define GUI
                    469: #define LINEFEED 10
                    470: #define ANON_FTP_HOSTNAME
                    471: #ifndef NO_SOCKET_DEFS
                    472: #include &lt;MacSockDefs.h&gt;
                    473: #endif /* NO_SOCKET_DEFS */
                    474: 
                    475: #include &lt;socket.ext.h&gt;
                    476: #include &lt;string.h&gt;
                    477: 
                    478: #endif /* applec MPW */
                    479: </PRE>
2.95      frystyk   480: <H2>
2.97      frystyk   481:   <A NAME="VAX">VAX/VMS</A>
2.95      frystyk   482: </H2>
                    483: <P>
                    484: Under VMS, there are many versions of TCP-IP. Define one if you do not use
                    485: Digital's UCX product:
2.4       timbl     486: <DL>
2.95      frystyk   487:   <DT>
                    488:     UCX
                    489:   <DD>
                    490:     DEC's "Ultrix connection" (default)
                    491:   <DT>
                    492:     WIN_TCP
                    493:   <DD>
                    494:     From Wollongong, now GEC software.
                    495:   <DT>
                    496:     MULTINET
                    497:   <DD>
                    498:     From SRI, now from TGV Inv.
                    499:   <DT>
                    500:     DECNET
                    501:   <DD>
                    502:     Cern's TCP socket emulation over DECnet
2.4       timbl     503: </DL>
2.95      frystyk   504: <P>
                    505: The last three do not interfere with the unix i/o library, and so they need
                    506: special calls to read, write and close sockets. In these cases the socket
                    507: number is a VMS channel number, so we make the @@@ HORRIBLE @@@ assumption
                    508: that a channel number will be greater than 10 but a unix file descriptor
                    509: less than 10. It works.
2.26      frystyk   510: <PRE>
2.76      frystyk   511: #ifdef VMS
                    512: #include "HTVMSUtils.h"
2.47      frystyk   513: #define CACHE_FILE_PREFIX      "SYS$LOGIN:Z_"
                    514: #define DEFAULT_SUFFIXES       "._"
2.7       timbl     515: 
2.88      frystyk   516: #define HAVE_CUSERID
                    517: 
2.7       timbl     518: #ifdef WIN_TCP
2.32      frystyk   519: #define NETREAD(s,b,l) ((s)&gt;10 ? netread((s),(b),(l)) : read((s),(b),(l)))
                    520: #define NETWRITE(s,b,l)        ((s)&gt;10 ? netwrite((s),(b),(l)) : write((s),(b),(l)))
                    521: #define NETCLOSE(s)    ((s)&gt;10 ? netclose(s) : close(s))
2.16      duns      522: #endif /* WIN_TCP */
2.1       timbl     523: 
                    524: #ifdef MULTINET
                    525: #undef NETCLOSE
                    526: #undef NETREAD
                    527: #undef NETWRITE
2.32      frystyk   528: #define NETREAD(s,b,l) ((s)&gt;10 ? socket_read((s),(b),(l)) : read((s),(b),(l)))
                    529: #define NETWRITE(s,b,l)        ((s)&gt;10 ? socket_write((s),(b),(l)) : \
2.1       timbl     530:                                write((s),(b),(l)))
2.32      frystyk   531: #define NETCLOSE(s)    ((s)&gt;10 ? socket_close(s) : close(s))
2.37      frystyk   532: #define IOCTL(s,c,a)   socket_ioctl(s,c,a);
2.16      duns      533: #endif /* MULTINET */
2.1       timbl     534: 
                    535: #ifdef DECNET
2.74      frystyk   536: #define DNP_OBJ 80     /* This one doesn't look busy, but we must check */
                    537:                        /* That one was for decnet */
                    538: #undef SELECT          /* not supported */
2.32      frystyk   539: #define NETREAD(s,b,l) ((s)&gt;10 ? recv((s),(b),(l),0) : read((s),(b),(l)))
                    540: #define NETWRITE(s,b,l)        ((s)&gt;10 ? send((s),(b),(l),0) : write((s),(b),(l)))
                    541: #define NETCLOSE(s)    ((s)&gt;10 ? socket_close(s) : close(s))
2.73      frystyk   542: 
2.88      frystyk   543: #undef HAVE_GETHOSTNAME                        /* Decnet doesn't have a name server */
2.1       timbl     544: #endif /* Decnet */
2.73      frystyk   545: 
2.88      frystyk   546: #undef HAVE_GETDOMAINNAME
2.31      duns      547:          
2.1       timbl     548: /*     Certainly this works for UCX and Multinet; not tried for Wollongong
                    549: */
                    550: #ifdef MULTINET
2.32      frystyk   551: #include &lt;time.h&gt;
2.16      duns      552: #ifdef __TIME_T
                    553: #define __TYPES
                    554: #define __TYPES_LOADED
                    555: #endif /* __TIME_T */
2.37      frystyk   556: #include &lt;multinet_root:[multinet.include.sys]types.h&gt;
                    557: #include &lt;multinet_root:[multinet.include]errno.h&gt;
2.16      duns      558: #ifdef __TYPES
                    559: #define __TIME_T
                    560: #endif /* __TYPE */
                    561: #ifdef __TIME_LOADED
                    562: #define __TIME
                    563: #endif /* __TIME_LOADED */
2.37      frystyk   564: #include &lt;multinet_root:[multinet.include.sys]time.h&gt;
2.16      duns      565: #else /* not MULTINET */
2.32      frystyk   566: #include &lt;types.h&gt;
                    567: #include &lt;errno.h&gt;
                    568: #include &lt;time.h&gt;
2.16      duns      569: #endif /* not MULTINET */
2.1       timbl     570: 
                    571: #include string
                    572: 
                    573: #ifndef STDIO_H
2.24      luotonen  574: #include &lt;stdio&gt;
2.1       timbl     575: #define STDIO_H
                    576: #endif
                    577: 
                    578: #include file
                    579: 
2.37      frystyk   580: #ifndef DECNET  /* Why is it used at all ? Types conflict with "types.h&gt; */
2.1       timbl     581: #include unixio
                    582: #endif
                    583: 
                    584: #define INCLUDES_DONE
                    585: 
                    586: #ifdef MULTINET  /* Include from standard Multinet directories */
2.37      frystyk   587: #include &lt;multinet_root:[multinet.include.sys]socket.h&gt;
2.1       timbl     588: #ifdef __TIME_LOADED  /* defined by sys$library:time.h */
                    589: #define __TIME  /* to avoid double definitions in next file */
                    590: #endif
2.37      frystyk   591: #include &lt;multinet_root:[multinet.include.netinet]in.h&gt;
                    592: #include &lt;multinet_root:[multinet.include.arpa]inet.h&gt;
                    593: #include &lt;multinet_root:[multinet.include]netdb.h&gt;
                    594: #include &lt;multinet_root:[multinet.include.sys]ioctl.h&gt;
2.1       timbl     595: 
                    596: #else  /* not multinet */
                    597: #ifdef DECNET
2.37      frystyk   598: #include &lt;types.h&gt;  /* for socket.h */
                    599: #include &lt;socket.h&gt;
2.65      frystyk   600: #include &lt;dn&gt;
                    601: #include &lt;dnetdb&gt;
2.1       timbl     602: 
                    603: #else /* UCX or WIN */
2.16      duns      604: #ifdef CADDR_T
                    605: #define __CADDR_T
                    606: #endif /* problem with xlib.h inclusion */
2.32      frystyk   607: #include &lt;socket.h&gt;
                    608: #include &lt;in.h&gt;
                    609: #include &lt;inet.h&gt;
                    610: #include &lt;netdb.h&gt;
                    611: #include &lt;ucx$inetdef.h&gt;
2.1       timbl     612: 
                    613: #endif  /* not DECNET */
                    614: #endif  /* of Multinet or other TCP includes */
                    615: 
                    616: #define TCP_INCLUDES_DONE
2.63      frystyk   617: 
                    618: #ifdef UCX
                    619: #define SIMPLE_TELNET
                    620: #endif
2.26      frystyk   621: </PRE>
2.95      frystyk   622: <P>
                    623: On VMS directory browsing is available through a separate copy of dirent.c.
                    624: The definition of R_OK seem to be missing from the system include files...
2.31      duns      625: <PRE>
                    626: #define USE_DIRENT
2.37      frystyk   627: #define GOT_READ_DIR
                    628: #include &lt;dirent.h&gt;
2.88      frystyk   629: #define DIR struct dirent
2.31      duns      630: #define R_OK 4
                    631: </PRE>
2.95      frystyk   632: <P>
                    633: On VMS machines, the linker needs to be told to put global data sections
                    634: into a data segment using these storage classes. (MarkDonszelmann)
2.26      frystyk   635: <PRE>
                    636: #ifdef VAXC
2.7       timbl     637: #define GLOBALDEF globaldef
                    638: #define GLOBALREF globalref
                    639: #endif /*  VAXC */
2.1       timbl     640: #endif /* vms */
2.26      frystyk   641: </PRE>
2.95      frystyk   642: <P>
                    643: On non-VMS machines, the GLOBALDEF and GLOBALREF storage types default to
                    644: normal C storage types.
2.26      frystyk   645: <PRE>
                    646: #ifndef GLOBALREF
2.7       timbl     647: #define GLOBALDEF
                    648: #define GLOBALREF extern
                    649: #endif
2.31      duns      650: </PRE>
2.95      frystyk   651: <P>
2.126     kahan     652: On non-VMS machines STAT should be stat, unless that was overridden
                    653: somewhere above. On VMS machines STAT is a function that converts
                    654: directories and devices so that you can stat them.
2.31      duns      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
2.126     kahan     661: #ifndef HT_STAT
2.69      frystyk   662: #define HT_STAT                stat
2.126     kahan     663: #endif
                    664: #ifndef HT_LSTAT
2.69      frystyk   665: #define HT_LSTAT       lstat
2.126     kahan     666: #endif
2.31      duns      667: #endif /* non VMS */
2.26      frystyk   668: </PRE>
2.95      frystyk   669: <H3>
                    670:   Dynamic Memory
                    671: </H3>
                    672: <P>
                    673: Replace memory allocation and free C RTL functions with VAXC$xxx_OPT alternatives
                    674: for VAXC (but not DECC) on VMS. This makes a big performance difference.
                    675: (Foteos Macrides). Also have a look at the <A HREF="HTMemory.html">Dynamic
                    676: Memory Module</A> for how to handle <CODE>malloc</CODE> and
                    677: <CODE>calloc</CODE>.
2.88      frystyk   678: <PRE>
                    679: #ifdef VMS
                    680: #include &lt;stdio.h&gt;
                    681: #include &lt;stdlib.h&gt;
                    682: #include &lt;unixlib.h&gt;
                    683: #include &lt;ctype.h&gt;
2.95      frystyk   684: #if defined(VAXC) &amp;&amp; !defined(__DECC)
2.88      frystyk   685: #define malloc VAXC$MALLOC_OPT
                    686: #define calloc VAXC$CALLOC_OPT
                    687: #define free   VAXC$FREE_OPT
                    688: #define cfree  VAXC$CFREE_OPT
                    689: #define realloc        VAXC$REALLOC_OPT
                    690: #endif /* VAXC but not DECC */
                    691: #define unlink remove
                    692: #define gmtime localtime
                    693: #include &lt;stat.h&gt;
2.95      frystyk   694: #define S_ISDIR(m)      (((m)&amp;S_IFMT) == S_IFDIR)
                    695: #define S_ISREG(m)      (((m)&amp;S_IFMT) == S_IFREG)
2.88      frystyk   696: #define putenv HTVMS_putenv
                    697: #endif /* VMS */
                    698: </PRE>
2.95      frystyk   699: <H3>
                    700:   Strftime and other time stuff
                    701: </H3>
2.41      frystyk   702: <PRE>
                    703: #ifdef VMS
                    704: #ifndef DECC
2.88      frystyk   705: #undef  HAVE_STRFTIME
2.41      frystyk   706: #endif
2.88      frystyk   707: #undef  HAVE_MKTIME
                    708: #undef  HAVE_TIMEGM
2.41      frystyk   709: #define NO_GMTOFF
2.88      frystyk   710: #undef  HAVE_TIMEZONE
2.41      frystyk   711: #endif
2.90      eric      712: 
2.41      frystyk   713: </PRE>
2.95      frystyk   714: <H3>
                    715:   Definition of Errno
                    716: </H3>
2.37      frystyk   717: <PRE>
                    718: #ifdef VMS
                    719: #ifndef __DECC
                    720: extern int uerrno;     /* Deposit of error info (as per errno.h) */
                    721: extern volatile noshare int socket_errno; /* socket VMS error info 
                    722:                                           (used for translation of vmserrno) */
                    723: extern volatile noshare int vmserrno;  /* Deposit of VMS error info */
                    724: extern volatile noshare int errno;  /* noshare to avoid PSECT conflict */
                    725: #define ERRNO_DONE
                    726: #endif /* not DECC */
                    727: #endif /* VMS */
                    728: </PRE>
2.95      frystyk   729: <P>
                    730:   <HR>
                    731: <H1>
2.97      frystyk   732:   <A NAME="Platform">Platform Independent Stuff</A>
2.95      frystyk   733: </H1>
                    734: <P>
2.88      frystyk   735: Here we use all the knowledge we got above...
2.95      frystyk   736: <H2>
                    737:   Include Files
                    738: </H2>
                    739: <P>
                    740: This file includes all system header files that are needed, iff they exist.
                    741: Their existance is discovered by <CODE>configure</CODE>.
2.40      frystyk   742: <PRE>
2.88      frystyk   743: /* stdio.h */
                    744: #ifdef HAVE_STDIO_H
                    745: #include &lt;stdio.h&gt;
2.40      frystyk   746: #endif
                    747: 
2.128   ! vbancrof  748: /* stdef.h */
        !           749: #ifdef HAVE_STDDEF_H
        !           750: #include <stddef.h>
        !           751: #endif
        !           752: 
2.88      frystyk   753: /* types.h */
                    754: #ifdef HAVE_SYS_TYPES_H
                    755: #include &lt;sys/types.h&gt;
                    756: #else
                    757: #ifdef HAVE_TYPES_H
                    758: #include &lt;types.h&gt;
2.42      frystyk   759: #endif
2.32      frystyk   760: #endif
                    761: 
2.88      frystyk   762: /* unistd.h */
                    763: #ifdef HAVE_UNISTD_H
2.28      luotonen  764: #include &lt;unistd.h&gt;
2.88      frystyk   765: #else
                    766: #ifdef HAVE_SYS_UNISTD_H
                    767: #include &lt;sys/unistd.h&gt;
                    768: #endif
2.32      frystyk   769: #endif
                    770: 
2.88      frystyk   771: /* fcntl.h */
                    772: #ifdef HAVE_FCNTL_H
2.28      luotonen  773: #include &lt;fcntl.h&gt;
                    774: #else
2.88      frystyk   775: #ifdef HAVE_SYS_FCNTL_H
2.28      luotonen  776: #include &lt;sys/fcntl.h&gt;
                    777: #endif
2.88      frystyk   778: #endif
2.28      luotonen  779: 
2.115     frystyk   780: /* sys/machine.h */
                    781: #ifdef HAVE_SYS_MACHINE_H
                    782: #include &lt;sys/machine.h&gt;
                    783: #endif
                    784: 
2.88      frystyk   785: /* limits.h */
                    786: #ifdef HAVE_SYS_LIMITS_H
                    787: #include &lt;sys/limits.h&gt;
                    788: #else
                    789: #ifdef HAVE_LIMITS_H
2.32      frystyk   790: #include &lt;limits.h&gt;
2.88      frystyk   791: #endif
                    792: #endif
2.41      frystyk   793: 
2.88      frystyk   794: /* stat.h */
                    795: #ifdef HAVE_SYS_STAT_H
                    796: #include &lt;sys/stat.h&gt;
                    797: #else
                    798: #ifdef HAVE_STAT_H
                    799: #include &lt;stat.h&gt;
                    800: #endif
2.41      frystyk   801: #endif
                    802: 
2.112     frystyk   803: /* Patch for problems in glibc6 */
                    804: #if defined(__GLIBC__)
                    805: #undef S_IFMT
                    806: #undef S_IFDIR
                    807: #define S_IFMT __S_IFMT
                    808: #define S_IFDIR __S_IFDIR
                    809: #endif
                    810: 
2.117     frystyk   811: /* in.h */
                    812: #ifdef HAVE_NETINET_IN_H
                    813: #include &lt;netinet/in.h&gt;
                    814: #else
                    815: #ifdef HAVE_IN_H
                    816: #include &lt;in.h&gt;
                    817: #endif
                    818: #endif
                    819: 
2.103     frystyk   820: /* tcp.h */
                    821: #ifdef HAVE_NETINET_TCP_H
                    822: #include &lt;netinet/tcp.h&gt;
                    823: #else
                    824: #ifdef HAVE_TCP_H
                    825: #include &lt;tcp.h&gt;
                    826: #endif
                    827: #endif
                    828: 
2.88      frystyk   829: /* file.h */
                    830: #ifdef HAVE_SYS_FILE_H
                    831: #include &lt;sys/file.h&gt;
                    832: #endif
2.37      frystyk   833: 
2.88      frystyk   834: /* systeminfo.h */
                    835: #ifdef HAVE_SYS_SYSTEMINFO_H
                    836: #include &lt;sys/systeminfo.h&gt;
                    837: #endif
2.37      frystyk   838: 
2.88      frystyk   839: /* ioctl.h */
                    840: #ifdef HAVE_SYS_IOCTL_H
                    841: #include &lt;sys/ioctl.h&gt;
                    842: #endif
2.32      frystyk   843: 
2.108     frystyk   844: /* termios.h */
                    845: #ifdef HAVE_TERMIOS_H
                    846: #include &lt;termios.h&gt;
                    847: #endif
                    848: 
2.88      frystyk   849: /* time.h */
                    850: #ifdef TIME_WITH_SYS_TIME
                    851: #include &lt;sys/time.h&gt;
                    852: #include &lt;time.h&gt;
                    853: #else
                    854: #ifdef HAVE_SYS_TIME_H
                    855: #include &lt;sys/time.h&gt;
                    856: #else
                    857: #ifdef HAVE_TIME_H
2.28      luotonen  858: #include &lt;time.h&gt;
2.88      frystyk   859: #endif
                    860: #endif
                    861: #endif
2.28      luotonen  862: 
2.88      frystyk   863: /* string{,s}.h */
                    864: #ifdef HAVE_STRING_H
                    865: #include &lt;string.h&gt;
2.110     frystyk   866: #else
2.88      frystyk   867: #ifdef HAVE_STRINGS_H
                    868: #include &lt;strings.h&gt;
2.41      frystyk   869: #endif
2.110     frystyk   870: #endif
2.28      luotonen  871: 
2.88      frystyk   872: /* syslog.h */
                    873: #ifdef HAVE_SYSLOG_H
                    874: #include &lt;syslog.h&gt;
2.119     frystyk   875: #else
                    876: #ifdef HAVE_SYS_SYSLOG_H
                    877: #include &lt;sys/socket.h&gt;
                    878: #endif
2.88      frystyk   879: #endif
2.28      luotonen  880: 
2.88      frystyk   881: /* socket.h */
                    882: #ifdef HAVE_SYS_SOCKET_H
                    883: #include &lt;sys/socket.h&gt;
                    884: #else
                    885: #ifdef HAVE_SOCKET_H
                    886: #include &lt;socket.h&gt;
                    887: #endif
                    888: #endif
2.44      frystyk   889: 
2.88      frystyk   890: /* socket.ext.h */
                    891: #ifdef HAVE_SOCKET_EXT_H
                    892: #include &lt;socket.ext.h&gt;
                    893: #endif
2.43      frystyk   894: 
2.88      frystyk   895: /* appkit.h */
                    896: #ifdef HAVE_APPKIT_APPKIT_H
2.91      frystyk   897: #include &lt;appkit/appkit.h&gt;
2.88      frystyk   898: #else
                    899: #ifdef HAVE_APPKIT_H
2.91      frystyk   900: #include &lt;appkit.h&gt;
2.88      frystyk   901: #endif
                    902: #endif
2.43      frystyk   903: 
2.88      frystyk   904: /* dn.h */
                    905: #ifdef HAVE_DN_H
                    906: #include &lt;dn.h&gt;
                    907: #endif
2.22      luotonen  908: 
2.88      frystyk   909: /* ipc.h */
                    910: #ifdef HAVE_SYS_IPC_H
2.30      luotonen  911: #include &lt;sys/ipc.h&gt;
2.88      frystyk   912: #endif
2.41      frystyk   913: 
2.88      frystyk   914: /* errno.h */
                    915: #ifdef HAVE_ERRNO_H
                    916: #include &lt;errno.h&gt;
                    917: #else
                    918: #ifdef HAVE_SYS_ERRNO_H
                    919: #include &lt;sys/errno.h&gt;
                    920: #else
                    921: #ifdef HAVE_NET_ERRNO_H
2.30      luotonen  922: #include &lt;net/errno.h&gt;
2.88      frystyk   923: #endif
                    924: #endif
                    925: #endif
2.22      luotonen  926: 
2.88      frystyk   927: /* pwd.h */
                    928: #ifdef HAVE_PWD_H
                    929: #include &lt;pwd.h&gt;
                    930: #endif
2.22      luotonen  931: 
2.88      frystyk   932: /* grp.h */
                    933: #ifdef HAVE_GRP_H
                    934: #include &lt;grp.h&gt;
                    935: #endif
2.21      frystyk   936: 
2.88      frystyk   937: /* inet.h */
                    938: #ifdef HAVE_ARPA_INET_H
                    939: #include &lt;arpa/inet.h&gt;
                    940: #else
                    941: #ifdef HAVE_INET_H
                    942: #include &lt;inet.h&gt;
                    943: #endif
                    944: #endif
2.41      frystyk   945: 
2.88      frystyk   946: /* netdb.h */
                    947: #ifdef HAVE_NETDB_H
                    948: #include &lt;netdb.h&gt;
                    949: #endif
2.41      frystyk   950: 
2.88      frystyk   951: /* manifest.h */
                    952: #ifdef HAVE_MANIFEST_H
                    953: #include &lt;manifest.h&gt;
                    954: #endif
2.15      luotonen  955: 
2.88      frystyk   956: /* bsdtypes.h */
                    957: #ifdef HAVE_BSDTYPES_H
                    958: #include &lt;bsdtypes.h&gt;
                    959: #endif
2.17      luotonen  960: 
2.88      frystyk   961: /* stdefs.h */
                    962: #ifdef HAVE_STDEFS_H
                    963: #include &lt;stdefs.h&gt;
2.15      luotonen  964: #endif
                    965: 
2.88      frystyk   966: /* bsdtime.h */
                    967: #ifdef HAVE_BSDTIME_H
                    968: #include &lt;bsdtime.h&gt;
2.15      luotonen  969: #endif
2.36      frystyk   970: 
2.88      frystyk   971: /* select.h */
                    972: #ifdef HAVE_SYS_SELECT_H
                    973: #include &lt;sys/select.h&gt;
                    974: #else
                    975: #ifdef HAVE_SELECT_H
                    976: #include &lt;select.h&gt;
2.36      frystyk   977: #endif
2.88      frystyk   978: #endif
2.51      frystyk   979: 
2.88      frystyk   980: /* dnetdb.h */
                    981: #ifdef HAVE_DNETDB_H
                    982: #include &lt;dnetdb.h&gt;
                    983: #endif
2.25      luotonen  984: 
2.88      frystyk   985: /* ucx$inetdef.h */
                    986: #ifdef HAVE_UCX_INETDEF_H
                    987: #include &lt;ucx$inetdef.h&gt;
                    988: #endif
2.26      frystyk   989: 
2.88      frystyk   990: /* libc.h */
                    991: #ifdef HAVE_LIBC_H
                    992: #include &lt;libc.h&gt;
                    993: #endif
2.32      frystyk   994: 
2.88      frystyk   995: /* stdlib.h */
                    996: #ifdef HAVE_STDLIB_H
                    997: #include &lt;stdlib.h&gt;
                    998: #endif
2.32      frystyk   999: 
2.88      frystyk  1000: /* malloc.h */
                   1001: #ifdef HAVE_MALLOC_H
                   1002: #include &lt;malloc.h&gt;
2.58      frystyk  1003: #endif
                   1004: 
2.88      frystyk  1005: /* memory.h */
                   1006: #ifdef HAVE_MEMORY_H
                   1007: #include &lt;memory.h&gt;
                   1008: #endif
2.58      frystyk  1009: 
2.88      frystyk  1010: /* unixlib.h */
                   1011: #ifdef HAVE_UNIXLIB_H
                   1012: #include &lt;unixlib.h&gt;
                   1013: #endif
2.58      frystyk  1014: 
2.111     frystyk  1015: /* direct.h */
                   1016: #ifdef HAVE_DIRECT_H
                   1017: #include &lt;direct.h&gt;
                   1018: #endif
                   1019: 
2.88      frystyk  1020: /* ctype.h */
                   1021: #ifdef HAVE_CTYPE_H
                   1022: #include &lt;ctype.h&gt;
2.32      frystyk  1023: #endif
                   1024: 
2.88      frystyk  1025: /* curses.h */
                   1026: #ifdef CURSES
                   1027: #ifdef HAVE_CURSESX_H
                   1028: #include &lt;cursesX.h&gt;
                   1029: #else
                   1030: #ifdef HAVE_CURSES_H
                   1031: #include &lt;curses.h&gt;
                   1032: #endif
                   1033: #endif
2.62      frystyk  1034: #endif
                   1035: 
2.88      frystyk  1036: /* resource.h (some wait.h's require it) */
                   1037: #ifdef HAVE_SYS_RESOURCE_H
                   1038: #include &lt;sys/resource.h&gt;
                   1039: #else
                   1040: #ifdef HAVE_RESOURCE_H
                   1041: #include &lt;resource.h&gt;
2.45      frystyk  1042: #endif
2.81      frystyk  1043: #endif
                   1044: 
2.88      frystyk  1045: /* dirent.h / ndir.h / dir.h */
                   1046: #ifdef HAVE_DIRENT_H
2.32      frystyk  1047: #include &lt;dirent.h&gt;
2.95      frystyk  1048: #define NAMLEN(dirent) strlen((dirent)-&gt;d_name)
2.26      frystyk  1049: #else
2.88      frystyk  1050: #define dirent direct
2.95      frystyk  1051: #define NAMLEN(dirent) (dirent)-&gt;d_namlen
2.88      frystyk  1052: #ifdef HAVE_SYS_NDIR_H
                   1053: #include &lt;sys/ndir.h&gt;
                   1054: #endif
                   1055: #ifdef HAVE_SYS_DIR_H
2.32      frystyk  1056: #include &lt;sys/dir.h&gt;
2.88      frystyk  1057: #endif
                   1058: #ifdef HAVE_DIR_H
                   1059: #include &lt;dir.h&gt;
                   1060: #endif
                   1061: #ifdef HAVE_NDIR_H
                   1062: #include &lt;ndir.h&gt;
                   1063: #endif
2.26      frystyk  1064: #endif
                   1065: 
2.111     frystyk  1066: #if !defined(HAVE_STRCHR)
2.88      frystyk  1067: #define strchr index
                   1068: #define strrchr rindex
2.26      frystyk  1069: #endif
2.111     frystyk  1070: #if !defined(HAVE_MEMCPY)
2.88      frystyk  1071: #define memcpy(d, s, n) bcopy((s), (d), (n))
                   1072: #define memmove(d, s, n) bcopy((s), (d), (n))
2.25      luotonen 1073: #endif
2.37      frystyk  1074: 
2.101     frystyk  1075: /* Definition of var args */
                   1076: #if defined(STDC_HEADERS) || defined(__STDC__)
2.88      frystyk  1077: #include &lt;stdarg.h&gt;
                   1078: #else
2.90      eric     1079: #ifndef WWW_MSWINDOWS
2.88      frystyk  1080: #include &lt;varargs.h&gt;
2.90      eric     1081: #endif
2.88      frystyk  1082: #endif
2.26      frystyk  1083: 
2.88      frystyk  1084: /* wait.h */
                   1085: #ifdef HAVE_SYS_WAIT_H
                   1086: #include &lt;sys/wait.h&gt;
                   1087: #endif
                   1088: #ifndef WEXITSTATUS
2.95      frystyk  1089: #define WEXITSTATUS(stat_val) (((unsigned)(stat_val) &gt;&gt; 8) &amp; 255)
2.88      frystyk  1090: #endif
                   1091: #ifndef WIFEXITED
                   1092: #define WIFEXITED(stat_val) (((stat_val) &amp; 255) == 0)
                   1093: #endif
2.118     frystyk  1094: 
                   1095: #ifdef HT_POSIX_REGEX
                   1096: #ifdef HAVE_RXPOSIX_H
                   1097: #include &lt;rxposix.h&gt;
                   1098: #else
                   1099: #ifdef HAVE_REGEX_H
                   1100: #include &lt;regex.h&gt;
                   1101: #endif
                   1102: #endif
                   1103: #define W3C_DEFAULT_REGEX_FLAGS                (REG_EXTENDED | REG_NEWLINE)
                   1104: #endif
2.92      eric     1105: </PRE>
2.95      frystyk  1106: <H2>
                   1107:   Booleans
                   1108: </H2>
2.92      eric     1109: <PRE>
2.126     kahan    1110: #ifndef __MINGW32__ /* has a typedef for BOOLEAN */
2.111     frystyk  1111: #ifndef BOOLEAN
2.92      eric     1112: typedef char   BOOLEAN;                                    /* Logical value */
                   1113: #endif
2.126     kahan    1114: #endif
2.92      eric     1115: 
                   1116: #ifndef CURSES
                   1117: #ifndef TRUE
                   1118: #define TRUE   (BOOLEAN)1
                   1119: #define        FALSE   (BOOLEAN)0
                   1120: #endif
                   1121: #endif  /*  CURSES  */
                   1122: 
2.118     frystyk  1123: #if !defined(BOOL) &amp;&amp; !defined(WWW_MSWINDOWS)
2.92      eric     1124: #define BOOL BOOLEAN
                   1125: #endif
                   1126: 
                   1127: #ifndef YES
                   1128: #define YES             (BOOL)1
                   1129: #define NO              (BOOL)0
                   1130: #endif
                   1131: </PRE>
2.95      frystyk  1132: <H2>
2.112     frystyk  1133:   Integers
                   1134: </H2>
2.118     frystyk  1135: <P>
                   1136: If we don't have these (for some mysterious reason) then define them. This
                   1137: should (is?) be handled by the configure script already.
2.112     frystyk  1138: <PRE>
2.127     kahan    1139: /* Richard Atterer <libwww@list02.atterer.net> 
                   1140:    Disabled - caused problems because mingw32 has typedefs for these. 
                   1141:    They seem useless now. */
2.126     kahan    1142: 
2.127     kahan    1143: /* 
2.112     frystyk  1144: #ifndef u_short
                   1145: #define u_short unsigned short
                   1146: #endif
                   1147: 
                   1148: #ifndef u_long
                   1149: #define u_long unsigned long
                   1150: #endif
2.126     kahan    1151: 
2.127     kahan    1152: */
2.112     frystyk  1153: </PRE>
                   1154: <H2>
2.95      frystyk  1155:   NULL Definition
                   1156: </H2>
2.92      eric     1157: <PRE>
                   1158: #ifndef NULL
                   1159: #define NULL ((void *)0)
                   1160: #endif
2.95      frystyk  1161: </PRE>
                   1162: <H2>
                   1163:   Sleep System Call
                   1164: </H2>
                   1165: <P>
2.39      frystyk  1166: Some systems use milliseconds instead of seconds
                   1167: <PRE>
                   1168: #ifndef SLEEP
                   1169: #define SLEEP(n)       sleep(n)
                   1170: #endif
                   1171: </PRE>
2.95      frystyk  1172: <H2>
                   1173:   SOCKS
                   1174: </H2>
                   1175: <P>
                   1176: SOCKS is a package for allowing socket connections to tunnel through firewalls
                   1177: in carefully controlled situations. This package can be optionally compiled
                   1178: with SOCKS support; these definitions replace the normal socket calls with
                   1179: the SOCKS ones. Initial modification of the library is credited to Ian Dunkin
                   1180: &lt;imd1707@ggr.co.uk&gt;.
2.37      frystyk  1181: <PRE>
2.88      frystyk  1182: #ifdef SOCKS
2.101     frystyk  1183: #ifdef SOCKS4
                   1184: #define connect                Rconnect
                   1185: #define getsockname    Rgetsockname
                   1186: #define getpeername    Rgetpeername
                   1187: #define bind           Rbind
                   1188: #define accept         Raccept
                   1189: #define listen         Rlisten
                   1190: #define select         Rselect
                   1191: #define recvfrom       Rrecvfrom
                   1192: #define sendto         Rsendto
                   1193: #define recv           Rrecv
                   1194: #define send           Rsend
                   1195: #define read           Rread
                   1196: #define write          Rwrite
                   1197: #define rresvport      Rrresvport
                   1198: #define shutdown       Rshutdown
                   1199: #define listen         Rlisten
                   1200: #define close          Rclose
                   1201: #define dup            Rdup
                   1202: #define dup2           Rdup2
                   1203: #define fclose         Rfclose
                   1204: #define gethostbyname  Rgethostbyname
                   1205: #else
                   1206: #ifdef SOCKS5
                   1207: #define connect                SOCKSconnect
                   1208: #define getsockname    SOCKSgetsockname
                   1209: #define getpeername    SOCKSgetpeername
                   1210: #define bind           SOCKSbind
                   1211: #define accept         SOCKSaccept
                   1212: #define listen         SOCKSlisten
                   1213: #define select         SOCKSselect
                   1214: #define recvfrom       SOCKSrecvfrom
                   1215: #define sendto         SOCKSsendto
                   1216: #define recv           SOCKSrecv
                   1217: #define send           SOCKSsend
                   1218: #define read           SOCKSread
                   1219: #define write          SOCKSwrite
                   1220: #define rresvport      SOCKSrresvport
                   1221: #define shutdown       SOCKSshutdown
                   1222: #define listen         SOCKSlisten
                   1223: #define close          SOCKSclose
                   1224: #define dup            SOCKSdup
                   1225: #define dup2           SOCKSdup2
                   1226: #define fclose         SOCKSfclose
                   1227: #define gethostbyname  SOCKSgethostbyname
                   1228: #endif /* SOCKS5 */
                   1229: #endif /* SOCKS4 */
                   1230: #endif /* SOCKS */
2.37      frystyk  1231: </PRE>
2.95      frystyk  1232: <H2>
                   1233:   Network Family
                   1234: </H2>
2.37      frystyk  1235: <PRE>
                   1236: #ifdef DECNET
                   1237: typedef struct sockaddr_dn SockA;  /* See netdnet/dn.h or custom vms.h */
                   1238: #else /* Internet */
                   1239: typedef struct sockaddr_in SockA;  /* See netinet/in.h */
                   1240: #endif
                   1241: </PRE>
2.95      frystyk  1242: <H2>
                   1243:   Default Values of Network Access
                   1244: </H2>
2.37      frystyk  1245: <PRE>
                   1246: #ifndef NETCLOSE
                   1247: #define NETCLOSE close         /* Routine to close a TCP-IP socket */
                   1248: #endif
                   1249: 
                   1250: #ifndef NETREAD
                   1251: #define NETREAD  read          /* Routine to read from a TCP-IP socket */
                   1252: #endif
                   1253: 
                   1254: #ifndef NETWRITE
                   1255: #define NETWRITE write         /* Routine to write to a TCP-IP socket */
                   1256: #endif
2.101     frystyk  1257: 
                   1258: #ifndef NETWRITEV
                   1259: #define NETWRITEV writev
                   1260: #endif
2.37      frystyk  1261: </PRE>
2.95      frystyk  1262: <H2>
                   1263:   Definition of errno and Return Code
                   1264: </H2>
                   1265: <P>
                   1266: This is the definition of error codes and the corresponding string constants.
                   1267: If we do not have the <CODE>strerror</CODE> function then try the error list
                   1268: table.
2.37      frystyk  1269: <PRE>
                   1270: #ifndef ERRNO_DONE
                   1271: extern int errno;
                   1272: #define socerrno errno
                   1273: #endif
2.41      frystyk  1274: 
                   1275: #ifndef HAVE_STRERROR                            /* Otherwise use the table */
                   1276: extern char *sys_errlist[];
                   1277: extern int sys_nerr;
                   1278: #endif
2.37      frystyk  1279: </PRE>
2.95      frystyk  1280: <H2>
                   1281:   Definition of Socket Desrciptores
                   1282: </H2>
                   1283: <P>
2.37      frystyk  1284: This is necessary in order to support Windows NT...
                   1285: <PRE>
2.79      frystyk  1286: #ifndef SOCKET
                   1287: #define SOCKET int             /* Unix like socket descriptor */
                   1288: #define INVSOC (-1)            /* Unix invalid socket */
2.37      frystyk  1289: #endif
2.79      frystyk  1290: 
                   1291: #ifdef __svr4__
                   1292: #define HT_BACKLOG 32           /* Number of pending connect requests (TCP) */
                   1293: #else
                   1294: #define HT_BACKLOG 5            /* Number of pending connect requests (TCP) */
                   1295: #endif /* __svr4__ */
2.26      frystyk  1296: </PRE>
2.95      frystyk  1297: <H2>
                   1298:   Additional Network variables for SOCKET, file access bits
                   1299: </H2>
2.59      frystyk  1300: <PRE>
2.101     frystyk  1301: #if 0
2.66      frystyk  1302: #ifndef _WINSOCKAPI_
2.59      frystyk  1303: #define FD_READ         0x01
                   1304: #define FD_WRITE        0x02
                   1305: #define FD_OOB          0x04
                   1306: #define FD_ACCEPT       0x08
                   1307: #define FD_CONNECT      0x10
                   1308: #define FD_CLOSE        0x20
                   1309: #endif /* _WINSOCKAPI_ */
2.101     frystyk  1310: #endif
2.59      frystyk  1311: </PRE>
2.95      frystyk  1312: <H2>
                   1313:   Rough estimate of max path length
                   1314: </H2>
2.26      frystyk  1315: <PRE>
                   1316: #ifndef HT_MAX_PATH
                   1317: #ifdef MAXPATHLEN
                   1318: #define HT_MAX_PATH MAXPATHLEN
                   1319: #else
                   1320: #ifdef PATH_MAX
                   1321: #define HT_MAX_PATH PATH_MAX
                   1322: #else
                   1323: #define HT_MAX_PATH 1024                       /* Any better ideas? */
                   1324: #endif
                   1325: #endif
                   1326: #endif /* HT_MAX_PATH */
2.99      frystyk  1327: 
                   1328: #ifndef HT_MAX_TMPNAM
                   1329: #ifdef L_tmpnam
                   1330: #define HT_MAX_TMPNAM  L_tmpnam
                   1331: #else
                   1332: #define HT_MAX_TMPNAM  128
                   1333: #endif
                   1334: #endif
2.26      frystyk  1335: </PRE>
2.95      frystyk  1336: <H2>
2.123     frystyk  1337:   <A NAME="Hash">Hash Table Sizes</A>
2.122     frystyk  1338: </H2>
                   1339: <P>
                   1340: The size of the hash tables used by the various libwww classes like the
                   1341: <A HREF="HTNet.html">HTNet</A> class, the <A HREF="HTHost.html">HTHost</A>
                   1342: class etc. is a speed-size compromize. Here you can set the sizes depending
                   1343: on whether you have a lot of memory or not. The values must be prime numbers,
                   1344: of course.
                   1345: <PRE>
                   1346: #ifdef LIBWWW_SMALL
                   1347: #define HT_XL_HASH_SIZE                101
2.123     frystyk  1348: #define HT_L_HASH_SIZE         67
2.122     frystyk  1349: #define HT_M_HASH_SIZE         31
                   1350: #define HT_S_HASH_SIZE         5
                   1351: #else
2.123     frystyk  1352: #ifdef LIBWWW_LARGE
                   1353: #define HT_XL_HASH_SIZE                1499
                   1354: #define HT_L_HASH_SIZE         599
                   1355: #define HT_M_HASH_SIZE         101
                   1356: #define HT_S_HASH_SIZE         67
                   1357: #else
                   1358: #ifdef LIBWWW_EXTRA_LARGE
                   1359: #define HT_XL_HASH_SIZE                9973
                   1360: #define HT_L_HASH_SIZE         1499
                   1361: #define HT_M_HASH_SIZE         599
                   1362: #define HT_S_HASH_SIZE         101
                   1363: #else
2.122     frystyk  1364: #define HT_XL_HASH_SIZE                599
                   1365: #define HT_L_HASH_SIZE         101
                   1366: #define HT_M_HASH_SIZE         67
                   1367: #define HT_S_HASH_SIZE         11
                   1368: #endif
2.123     frystyk  1369: #endif
                   1370: #endif
2.122     frystyk  1371: </PRE>
                   1372: <H2>
2.95      frystyk  1373:   Definition of NGROUPS
                   1374: </H2>
2.26      frystyk  1375: <PRE>
2.94      frystyk  1376: #ifdef GETGROUPS_T
2.26      frystyk  1377: #ifndef NGROUPS
                   1378: #ifdef NGROUPS_MAX
2.94      frystyk  1379: #define NGROUPS                NGROUPS_MAX
2.26      frystyk  1380: #else
2.94      frystyk  1381: #define NGROUPS                20                      /* Any better ideas? */
2.26      frystyk  1382: #endif
2.37      frystyk  1383: #endif
2.34      frystyk  1384: #endif
                   1385: </PRE>
2.95      frystyk  1386: <H2>
                   1387:   Definition of Max Domain Name Length
                   1388: </H2>
2.29      frystyk  1389: <PRE>
                   1390: #ifndef MAXHOSTNAMELEN
                   1391: #define MAXHOSTNAMELEN 64                      /* Any better ideas? */
                   1392: #endif
                   1393: </PRE>
2.95      frystyk  1394: <H2>
                   1395:   File/Directory Management
                   1396: </H2>
2.41      frystyk  1397: <PRE>
                   1398: #ifndef MKDIR
                   1399: #define MKDIR(a,b)     mkdir((a), (b))
                   1400: #endif
                   1401: 
2.56      frystyk  1402: #ifndef RMDIR
                   1403: #define RMDIR(a)       rmdir((a))
                   1404: #endif
                   1405: 
                   1406: #ifndef REMOVE
                   1407: #define REMOVE(a)      unlink((a))
2.47      frystyk  1408: #endif
                   1409: 
                   1410: #ifndef DEFAULT_SUFFIXES
                   1411: #define DEFAULT_SUFFIXES       ".,_"
2.41      frystyk  1412: #endif
2.100     frystyk  1413: 
2.121     frystyk  1414: #ifndef DIR_SEPARATOR
                   1415: #define DIR_SEPARATOR_CHAR     '/'
                   1416: #define DIR_SEPARATOR_STR      "/"
                   1417: #endif
                   1418: 
2.100     frystyk  1419: #ifndef F_OK
                   1420: #define R_OK    4
                   1421: #define W_OK    2
                   1422: #define X_OK    1
                   1423: #define F_OK    0
                   1424: #endif
2.41      frystyk  1425: </PRE>
2.95      frystyk  1426: <H2>
                   1427:   Macros for manipulating masks for select()
                   1428: </H2>
2.26      frystyk  1429: <PRE>
2.1       timbl    1430: #ifndef FD_SET
2.88      frystyk  1431: #define FD_SET(fd, m) (*(unsigned*)(m) |=  (1 &lt;&lt; (fd)))
                   1432: #endif
                   1433: 
                   1434: #ifndef FD_CLR
                   1435: #define FD_CLR(fd, m) (*(unsigned*)(m) &amp;= ~(1 &lt;&lt; (fd)))
                   1436: #endif
                   1437: 
                   1438: #ifndef FD_ZERO
                   1439: #define FD_ZERO(m)    (*(unsigned*)(m)) = 0
                   1440: #endif
                   1441: 
                   1442: #ifndef FD_ISSET
                   1443: #define FD_ISSET(fd, m) (*(unsigned*)(m) &amp; (1 &lt;&lt; (fd)))
                   1444: #endif
2.26      frystyk  1445: </PRE>
2.95      frystyk  1446: <H2>
                   1447:   Macros for converting characters
                   1448: </H2>
2.26      frystyk  1449: <PRE>
                   1450: #ifndef TOASCII
2.1       timbl    1451: #define TOASCII(c) (c)
                   1452: #define FROMASCII(c) (c)                                   
2.5       timbl    1453: #endif
2.26      frystyk  1454: </PRE>
2.95      frystyk  1455: <H2>
                   1456:   Cache file prefix
                   1457: </H2>
                   1458: <P>
2.26      frystyk  1459: This is something onto which we tag something meaningful to make a cache
2.95      frystyk  1460: file name. used in HTWSRC.c at least. If it is not defined at all, caching
2.5       timbl    1461: is turned off.
2.26      frystyk  1462: <PRE>
                   1463: #ifndef CACHE_FILE_PREFIX
2.88      frystyk  1464: #ifdef unix
2.6       timbl    1465: #define CACHE_FILE_PREFIX  "/usr/wsrc/"
2.5       timbl    1466: #endif
2.60      frystyk  1467: #endif
                   1468: </PRE>
2.95      frystyk  1469: <H2>
                   1470:   Thread Safe Setup
                   1471: </H2>
                   1472: <P>
                   1473: These are some constants setting the size of buffers used by thread safe
                   1474: versions of some system calls.
2.60      frystyk  1475: <PRE>
                   1476: #ifdef HT_REENTRANT
2.120     frystyk  1477: 
                   1478: #ifdef _POSIX_LOGIN_NAME_MAX
                   1479: #define HT_LOGNAME_MAX  _POSIX_LOGIN_NAME_MAX
                   1480: #else
                   1481: #ifdef LOGNAME_MAX
                   1482: #define HT_LOGNAME_MAX  (LOGNAME_MAX+1)
                   1483: #else
                   1484: #define HT_LOGNAME_MAX  64
                   1485: #endif
                   1486: #endif
                   1487: 
2.124     kahan    1488: #define HOSTENT_MAX    1024
2.60      frystyk  1489: #define CTIME_MAX      26
2.101     frystyk  1490: #endif /* HT_REENTRANT */
2.17      luotonen 1491: </PRE>
2.102     frystyk  1492: <H2>
                   1493:   Types
                   1494: </H2>
                   1495: <P>
                   1496: We define some types here so we son't have to worry about it later
                   1497: <PRE>
                   1498: typedef unsigned long ms_t;
                   1499: </PRE>
2.17      luotonen 1500: <PRE>
                   1501: #endif
                   1502: </PRE>
2.95      frystyk  1503: <P>
                   1504:   <HR>
2.94      frystyk  1505: <ADDRESS>
2.128   ! vbancrof 1506:   @(#) $Id: wwwsys.html,v 2.127 2002/06/06 10:46:04 kahan Exp $
2.94      frystyk  1507: </ADDRESS>
2.95      frystyk  1508: </BODY></HTML>

Webmaster