<HTML>
<HEAD>
<TITLE>System dependencies in the W3 library</TITLE>
<NEXTID N="z5">
</HEAD>
<BODY>
<H1>System Dependencies</H1>System-system differences for TCP
include files and macros. This file
includes for each system the files
necessary for network and file I/O.
Part of <A
NAME="z4" HREF="Overview.html">libwww</A>.
<H3>Authors</H3>
<DL>
<DT>TBL
<DD> Tim Berners-Lee, W3 project,
CERN, <timbl@info.cern.ch>
<DT>EvA
<DD> Eelco van Asperen <evas@cs.few.eur.nl>
<DT>MA
<DD> Marc Andreesen NCSA
<DT>MD
<DD> Mark Donszelmann <duns@vxcern.cern.ch>
<DT>AT
<DD> Aleksandar Totic <atotic@ncsa.uiuc.edu>
<DT>SCW
<DD> Susan C. Weber <sweber@kyle.eitech.com>
</DL>
<H3>History:</H3>
<DL>
<DT>22 Feb 91
<DD> Written (TBL) as part of
the WWW library.
<DT>16 Jan 92
<DD> PC code from (EvA)
<DT>22 Apr 93
<DD> Merged diffs bits from
xmosaic release
<DT>29 Apr 93
<DD> Windows/NT code from (SCW)
<DT>29 Sep 93
<DD> VMS fixes (MD)
</DL>
<PRE>
#ifndef TCP_H
#define TCP_H
</PRE>
<H2>Default values</H2>These values may be reset and altered
by system-specific sections later
on. there are also a bunch of <A
NAME="z2" HREF="#z1">defaults
at the end</A> .
<PRE>/* Default values of those: */
#define NETCLOSE close /* Routine to close a TCP-IP socket */
#define NETREAD read /* Routine to read from a TCP-IP socket */
#define NETWRITE write /* Routine to write to a TCP-IP socket */
/* Unless stated otherwise, */
#define SELECT /* Can handle >1 channel. */
#define GOT_SYSTEM /* Can call shell with string */
#ifdef unix
#define GOT_PIPE
#endif
#ifdef VM
#define GOT_PIPE /* Of sorts */
#endif
#ifdef DECNET
typedef struct sockaddr_dn SockA; /* See netdnet/dn.h or custom vms.h */
#else /* Internet */
typedef struct sockaddr_in SockA; /* See netinet/in.h */
#endif
</PRE>
<H2>Macintosh - Think-C</H2>Think-C is one development environment
on the Mac.<P>
We recommend that you compile with
4-byte ints to be compatible with
MPW C. We used Tom Milligan's s_socket
library which was written for 4 byte
int, and the MacTCP library assumes
4-byte int.
<PRE>#ifdef THINK_C
#undef GOT_SYSTEM
#define DEBUG /* Can't put it on the CC command line */
#define NO_UNIX_IO /* getuid() missing */
#define NO_GETPID /* getpid() does not exist */
#define NO_GETWD /* getwd() does not exist */
#undef NETCLOSE /* Routine to close a TCP-IP socket */
#undef NETREAD /* Routine to read from a TCP-IP socket */
#undef NETWRITE /* Routine to write to a TCP-IP socket */
#define NETCLOSE s_close /* Routine to close a TCP-IP socket */
#define NETREAD s_read /* Routine to read from a TCP-IP socket */
#define NETWRITE s_write /* Routine to write to a TCP-IP socket */
#define bind s_bind /* Funny names presumably to prevent clashes */
#define connect s_connect
#define accept s_accept
#define listen s_listen
#define socket s_socket
#define getsockname s_getsockname
/* The function prototype checking is better than the include files
*/
extern s_close(int s);
extern s_read(int s, char *buffer, int buflen);
extern s_write(int s, const char *buffer, int buflen);
extern bind(int s, struct sockaddr *name, int namelen);
extern accept(int s, struct sockaddr *addr, int *addrlen);
extern listen(int s, int qlen);
extern connect(int s, struct sockaddr *addr, int addrlen);
extern s_socket(int domain, int type, int protocol);
extern s_getsockname(int s, struct sockaddr *name, int *namelen);
extern struct hostent *gethostent(const char * name);
extern unsigned long inet_addr(const char * name);
#endif /* THINK_C */
</PRE>
<H2>Macintosh - MPW</H2>MPW is one development environment
on the Mac.<P>
This entry was created by Aleksandar
Totic (atotic@ncsa.uiuc.edu) this
file is compatible with sockets package
released by NCSA. One major conflict
is that this library redefines write/read/etc
as macros. In some of HTML code
these macros get executed when they
should not be. Such files should
define NO_SOCKET_DEFS on top. This
is a temporary hack.
<PRE>#ifdef applec /* MPW */
#undef GOT_SYSTEM
#define DEBUG /* Can't put it on the CC command line */
#define NO_UNIX_IO /* getuid() missing
*/
#define NO_GETPID /* getpid() does not exist
*/
#define NO_GETWD /* getwd() does not exist
*/
#undef NETCLOSE /* Routine to close a TCP-IP socket */
#undef NETREAD /* Routine to read from a TCP-IP socket */
#undef NETWRITE /* Routine to write to a TCP-IP socket */
#define NETCLOSE s_close /* Routine to close a TCP-IP socket */
#define NETREAD s_read /* Routine to read from a TCP-IP socket */
#define NETWRITE s_write /* Routine to write to a TCP-IP socket */
#define _ANSI_SOURCE
#define GUI
#define LINEFEED 10
#define ANON_FTP_HOSTNAME
#ifndef NO_SOCKET_DEFS
#include <MacSockDefs.h>
#endif
#include <socket.ext.h>
#include <string.h>
#endif /* MPW */
#ifndef STDIO_H
#include <stdio.h>
#define STDIO_H
#endif
</PRE>
<H2>Big Blue - the world of incompatibility</H2>
<H2>IBM RS600</H2>On the IBM RS-6000, AIX is almost
Unix.
<PRE>#ifdef _AIX
#define AIX
#endif
#ifdef AIX
#define unix
#endif
/* AIX 3.2
** -------
*/
#ifdef _IBMR2
#define USE_DIRENT /* sys V style directory open */
#endif
</PRE>
<H2>IBM VM-CMS, VM-XA Mainframes</H2>MVS is compiled as for VM. MVS has
no unix-style I/O. The command line
compile options seem to come across
in lower case.
<PRE>#ifdef mvs
#define MVS
#endif
#ifdef MVS
#define VM
#endif
#ifdef NEWLIB
#pragma linkage(newlib,OS) /* Enables recursive NEWLIB */
#endif
/* VM doesn't have a built-in predefined token, so we cheat: */
#ifndef VM
#include <string.h> /* For bzero etc - not VM */
#endif
/* Note: All include file names must have 8 chars max (+".h")
**
** Under VM, compile with "(DEF=VM,SHORT_NAMES,DEBUG)"
**
** Under MVS, compile with "NOMAR DEF(MVS)" to get rid of 72 char margin
** System include files TCPIP and COMMMAC neeed line number removal(!)
*/
#ifdef VM /* or MVS -- see above. */
#define NOT_ASCII /* char type is not ASCII */
#define NO_UNIX_IO /* Unix I/O routines are not supported */
#define NO_GETPID /* getpid() does not exist */
#define NO_GETWD /* getwd() does not exist */
#ifndef SHORT_NAMES
#define SHORT_NAMES /* 8 character uniqueness for globals */
#endif
#include <manifest.h>
#include <bsdtypes.h>
#include <stdefs.h>
#include <socket.h>
#include <in.h>
#include <inet.h>
#include <netdb.h>
#include <errno.h> /* independent */
extern char asciitoebcdic[], ebcdictoascii[];
#define TOASCII(c) (c=='\n' ? 10 : ebcdictoascii[c])
#define FROMASCII(c) (c== 10 ? '\n' : asciitoebcdic[c])
#include <bsdtime.h>
#include <time.h>
#include <string.h>
#define INCLUDES_DONE
#define TCP_INCLUDES_DONE
#endif
</PRE>
<H2>IBM-PC running MS-DOS with SunNFS
for TCP/IP</H2>This code thanks to Eelco van Asperen
<evas@cs.few.eur.nl>
<PRE>#ifdef PCNFS
#include <sys/types.h>
#include <string.h>
#include <errno.h> /* independent */
#include <sys/time.h> /* independent */
#include <sys/stat.h>
#include <fcntl.h> /* In place of sys/param and sys/file */
#define INCLUDES_DONE
#define FD_SET(fd,pmask) (*(unsigned*)(pmask)) |= (1<<(fd))
#define FD_CLR(fd,pmask) (*(unsigned*)(pmask)) &= ~(1<<(fd))
#define FD_ZERO(pmask) (*(unsigned*)(pmask))=0
#define FD_ISSET(fd,pmask) (*(unsigned*)(pmask) & (1<<(fd)))
#endif /* PCNFS */
</PRE>
<H2>IBM-PC running Windows NT</H2>These parameters providede by Susan
C. Weber <sweber@kyle.eitech.com>.
<PRE>#ifdef _WINDOWS
#include "fcntl.h" /* For HTFile.c */
#include "sys\types.h" /* For HTFile.c */
#include "sys\stat.h" /* For HTFile.c */
#undef NETREAD
#undef NETWRITE
#undef NETCLOSE
#define NETREAD(s,b,l) ((s)>10 ? recv((s),(b),(l),0) : read((s),(b),(l)))
#define NETWRITE(s,b,l) ((s)>10 ? send((s),(b),(l),0) : write((s),(b),(l)))
#define NETCLOSE(s) ((s)>10 ? closesocket(s) : close(s))
#include <io.h>
#include <string.h>
#include <process.h>
#include <time.h>
#include <direct.h>
#include <stdio.h>
#include <winsock.h>
typedef struct sockaddr_in SockA; /* See netinet/in.h */
#define INCLUDES_DONE
#define TCP_INCLUDES_DONE
#endif /* WINDOWS */
</PRE>
<H2>VAX/VMS</H2>Under VMS, there are many versions
of TCP-IP. Define one if you do not
use Digital's UCX product:
<DL>
<DT>UCX
<DD> DEC's "Ultrix connection" (default)
<DT>WIN_TCP
<DD> From Wollongong, now GEC
software.
<DT>MULTINET
<DD> From SRI, now from TGV Inv.
<DT>DECNET
<DD> Cern's TCP socket emulation
over DECnet
</DL>
The last three do not interfere with
the unix i/o library, and so they
need special calls to read, write
and close sockets. In these cases
the socket number is a VMS channel
number, so we make the @@@ HORRIBLE
@@@ assumption that a channel number
will be greater than 10 but a unix
file descriptor less than 10. It
works.
<PRE>#ifdef VMS
#define CACHE_FILE_PREFIX "SYS$LOGIN:Z_"
#ifdef WIN_TCP
#undef NETREAD
#undef NETWRITE
#undef NETCLOSE
#define NETREAD(s,b,l) ((s)>10 ? netread((s),(b),(l)) : read((s),(b),(l)))
#define NETWRITE(s,b,l) ((s)>10 ? netwrite((s),(b),(l)) : write((s),(b),(l)))
#define NETCLOSE(s) ((s)>10 ? netclose(s) : close(s))
#endif /* WIN_TCP */
#ifdef MULTINET
#undef NETCLOSE
#undef NETREAD
#undef NETWRITE
#define NETREAD(s,b,l) ((s)>10 ? socket_read((s),(b),(l)) : read((s),(b),(l)))
#define NETWRITE(s,b,l) ((s)>10 ? socket_write((s),(b),(l)) : \
write((s),(b),(l)))
#define NETCLOSE(s) ((s)>10 ? socket_close(s) : close(s))
#endif /* MULTINET */
#ifdef DECNET
#undef SELECT /* not supported */
#undef NETREAD
#undef NETWRITE
#undef NETCLOSE
#define NETREAD(s,b,l) ((s)>10 ? recv((s),(b),(l),0) : read((s),(b),(l)))
#define NETWRITE(s,b,l) ((s)>10 ? send((s),(b),(l),0) : write((s),(b),(l)))
#define NETCLOSE(s) ((s)>10 ? socket_close(s) : close(s))
#endif /* Decnet */
/* Certainly this works for UCX and Multinet; not tried for Wollongong
*/
#ifdef MULTINET
#ifdef __TIME_T
#define __TYPES
#define __TYPES_LOADED
#endif /* __TIME_T */
#include "multinet_root:[multinet.include.sys]types.h"
#include "multinet_root:[multinet.include]errno.h"
#ifdef __TYPES
#define __TIME_T
#endif /* __TYPE */
#ifdef __TIME_LOADED
#define __TIME
#endif /* __TIME_LOADED */
#include "multinet_root:[multinet.include.sys]time.h"
#else /* not MULTINET */
#include <types.h>
#include <errno.h>
#include <time.h>
#endif /* not MULTINET */
#include string
#ifndef STDIO_H
#include stdio
#define STDIO_H
#endif
#include file
#ifndef DECNET /* Why is it used at all ? Types conflict with "types.h" */
#include unixio
#endif
#define INCLUDES_DONE
#ifdef MULTINET /* Include from standard Multinet directories */
#include "multinet_root:[multinet.include.sys]socket.h"
#ifdef __TIME_LOADED /* defined by sys$library:time.h */
#define __TIME /* to avoid double definitions in next file */
#endif
#include "multinet_root:[multinet.include.netinet]in.h"
#include "multinet_root:[multinet.include.arpa]inet.h"
#include "multinet_root:[multinet.include]netdb.h"
#include "multinet_root:[multinet.include.sys]ioctl.h"
#else /* not multinet */
#ifdef DECNET
#include "types.h" /* for socket.h */
#include "socket.h"
#include "dn"
#include "dnetdb"
/* #include "vms.h" */
#else /* UCX or WIN */
#ifdef CADDR_T
#define __CADDR_T
#endif /* problem with xlib.h inclusion */
#include <socket.h>
#include <in.h>
#include <inet.h>
#include <netdb.h>
#endif /* not DECNET */
#endif /* of Multinet or other TCP includes */
#define TCP_INCLUDES_DONE
</PRE>On VMS machines, the linker needs
to be told to put global data sections
into a data segment using these storage
classes. (MarkDonszelmann)
<PRE>#ifdef VAXC
#define GLOBALDEF globaldef
#define GLOBALREF globalref
#endif /* VAXC */
#endif /* vms */
</PRE>On non-VMS machines, the GLOBALDEF
and GLOBALREF storage types default
to normal C storage types.
<PRE>#ifndef GLOBALREF
#define GLOBALDEF
#define GLOBALREF extern
#endif
</PRE>
<H2>SCO ODT unix version</H2>
<PRE>
#ifdef sco
#include <sys/fcntl.h>
#define USE_DIRENT
#endif
</PRE>
<H2>MIPS unix</H2>
<PRE>/* Mips hack (bsd4.3/sysV mixture...) */
#ifdef mips
extern int errno;
#endif
</PRE>
<H2>Solaris</H2>
(And Linux, thanks to Rainer Klute)
<PRE>
#if defined(__svr4__) || defined(_POSIX_SOURCE)
#include <unistd.h>
#endif
</PRE>
<H2>OSF/1</H2>
<PRE>#ifdef __osf__
#define USE_DIRENT
#endif /* OSF1 AXP */
</PRE>
<H2>Regular BSD unix versions</H2>These are a default unix where not
already defined specifically.
<PRE>#ifndef INCLUDES_DONE
#include <sys/types.h>
/* #include <streams/streams.h> not ultrix */
#include <string.h>
#include <errno.h> /* independent */
#include <sys/time.h> /* independent */
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/file.h> /* For open() etc */
#define INCLUDES_DONE
#endif /* Normal includes */
/* Directory reading stuff - BSD or SYS V
*/
#ifdef unix /* if this is to compile on a UNIX machine */
#define GOT_READ_DIR 1 /* if directory reading functions are available */
#ifdef USE_DIRENT /* sys v version */
#include <dirent.h>
#define direct dirent
#else
#include <sys/dir.h>
#endif
#if defined(sun) && defined(__svr4__)
#include <sys/fcntl.h>
#include <limits.h>
#endif
#endif
</PRE>
<H2>NeXT</H2>
<PRE>
#ifdef NeXT
#include "sys/types.h"
#include "sys/stat.h"
#ifndef S_ISDIR
#define S_ISDIR(m) (m & S_IFDIR)
#define S_ISREG(m) (m & S_IFREG)
#define S_ISCHR(m) (m & S_IFCHR)
#define S_ISBLK(m) (m & S_IFBLK)
#define S_ISLNK(m) (m & S_IFLNK)
#define S_ISSOCK(m) (m & S_IFSOCK)
#define S_ISFIFO(m) (NO)
#endif
#ifndef WEXITSTATUS
#define WEXITSTATUS(s) (((s).w_status >> 8) & 0377)
#endif
#ifndef S_IRWXU
#define S_IRWXU 0000700
#define S_IRWXG 0000070
#define S_IRWXO 0000007
#endif
#endif
</PRE>
<H2><A
NAME="z1">Defaults</A></H2>
<H3>Include files for TCP</H3>
<PRE>#ifndef TCP_INCLUDES_DONE
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef __hpux /* this may or may not be good -marc */
#include <arpa/inet.h> /* Must be after netinet/in.h */
#endif
#include <netdb.h>
#endif /* TCP includes */
</PRE>
<H3>Macros for manipulating masks for
select()</H3>
<PRE>#ifdef SELECT
#ifndef FD_SET
typedef unsigned int fd_set;
#define FD_SET(fd,pmask) (*(pmask)) |= (1<<(fd))
#define FD_CLR(fd,pmask) (*(pmask)) &= ~(1<<(fd))
#define FD_ZERO(pmask) (*(pmask))=0
#define FD_ISSET(fd,pmask) (*(pmask) & (1<<(fd)))
#endif /* FD_SET */
#endif /* SELECT */
</PRE>
<H3><A
NAME="z0">M</A> acros for converting characters</H3>
<PRE>#ifndef TOASCII
#define TOASCII(c) (c)
#define FROMASCII(c) (c)
#endif
</PRE>
<H3>Cache file prefix</H3>This is something onto which we tag
something meaningful to make a cache
file name. used in HTWSRC.c at least.
If it is nor defined at all, caching
is turned off.
<PRE>#ifndef CACHE_FILE_PREFIX
#ifdef unix
#define CACHE_FILE_PREFIX "/usr/wsrc/"
#endif
#endif
#endif /* TCP_H */
</PRE>end of system-specific file</A></BODY>
</HTML>
Webmaster