/*		  System dependencies in the W3 library
				   SYSTEM DEPENDENCIES

   System-system differences for TCP include files and macros. This
   file includes for each system the files necessary for network and
   file I/O.

  AUTHORS

  TBL		     Tim Berners-Lee, W3 project, CERN, <timbl@info.cern.ch>
  EvA			  Eelco van Asperen <evas@cs.few.eur.nl>
  MA			  Marc Andreessen NCSA
  AT			  Aleksandar Totic <atotic@ncsa.uiuc.edu>
  SCW			  Susan C. Weber <sweber@kyle.eitech.com>
  MJW			  Michael J Witbrock <witbrock@cmu.edu>
  MWM			  Mike Meyer  <mwm@contessa.phone.net>

  HISTORY:
  22 Feb 91		  Written (TBL) as part of the WWW library.
  16 Jan 92		  PC code from EvA
  22 Apr 93		  Merged diffs bits from xmosaic release
  29 Apr 93		  Windows/NT code from SCW

  Much of the cross-system portability stuff has been intentionally
  REMOVED from this version of the library by Marc A in order to
  discourage attempts to make "easy" ports of Mosaic for X to non-Unix
  platforms.  The library needs to be rewritten from the ground up; in
  the meantime, Unix is *all* we support or intend to support with
  this set of source code.

*/

#ifndef TCP_H
#define TCP_H

/*

Default values

   These values may be reset and altered by system-specific sections
   later on.  there are also a bunch of defaults at the end .

 */
#include "HTTCP.h"
/* Default values of those: */
#define NETCLOSE close	    /* Routine to close a TCP-IP socket 	*/
#define NETREAD  HTDoRead	/* 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

typedef struct sockaddr_in SockA;  /* See netinet/in.h */


#ifndef STDIO_H
#include <stdio.h>
#define STDIO_H
#endif

#ifdef _AIX
#define AIX
#endif
#ifdef AIX
#define unix
#endif

#ifdef _IBMR2
#define USE_DIRENT		/* sys V style directory open */
#endif

/* Solaris. */
#if defined(sun) && defined(__svr4__)
#define USE_DIRENT		/* sys V style directory open */
#endif

#if defined(__alpha)
#define USE_DIRENT
#endif

#ifndef USE_DIRENT
#ifdef SVR4
#define USE_DIRENT
#endif
#endif /* not USE_DIRENT */

#include <string.h>		/* For bzero etc */

/* Use builtin strdup when appropriate. */
#if defined(ultrix) || defined(VMS) || defined(NeXT)
extern char *strdup ();
#endif



/*

VAX/VMS

   Under VMS, there are many versions of TCP-IP. Define one if you do
   not use Digital's UCX product:

  UCX			  DEC's "Ultrix connection" (default)
  WIN_TCP		  From Wollongong, now GEC software.
  MULTINET		  From SRI, now from TGV Inv.
  DECNET		  Cern's TCP socket emulation over DECnet

   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.

 */
#ifdef vms
#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

#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

/*	Certainly this works for UCX and Multinet; not tried for Wollongong
*/
#ifdef MULTINET
#include "multinet_root:[multinet.include.sys]types.h"
#include "multinet_root:[multinet.include]errno.h"
#include "multinet_root:[multinet.include.sys]time.h"
#else
#include types
#include errno
#include time
#endif /* multinet */

#include string

#ifndef STDIO_H
#include stdio
#define STDIO_H
#endif

#include file

#include unixio

#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"

#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 */
#include socket
#include in
#include inet
#include netdb

#endif	/* not DECNET */
#endif	/* of Multinet or other TCP includes */

#define TCP_INCLUDES_DONE

#endif	/* vms */



/*

SCO ODT unix version

 */

#ifdef sco
#include <sys/fcntl.h>
#define USE_DIRENT
#endif

/*

MIPS unix

 */
/* Mips hack (bsd4.3/sysV mixture...) */

#ifdef mips
extern int errno;
#endif


/*

Regular BSD unix versions

   These are a default unix where not already defined specifically.

 */
#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>
#ifndef __AROS__
#include <sys/param.h>
#if defined(_AMIGA)
#include <fcntl.h>
#include <limits.h>
#else
#include <sys/file.h>	    /* For open() etc */
#endif
#endif
#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
#ifndef __AROS__
#include <sys/dir.h>
#endif
#endif
#if defined(sun) && defined(__svr4__)
#include <sys/fcntl.h>
#include <limits.h>
#endif
#endif

/* This stuff comes BEFORE the defaults below */

#ifdef _AMIGA	 /* MJW */
#ifndef _DNET
 #ifndef _AS225
  #undef NETREAD
  #undef NETWRITE
  #undef NETCLOSE
  #define NETREAD(s,b,l)  (recv((s),(b),(l),0))
  #define NETWRITE(s,b,l) (send((s),(b),(l),0))
  #define NETCLOSE(s)	  (CloseSocket(s))
 #else	  /* MWM */
  #undef NETREAD
  #undef NETWRITE
  #undef NETCLOSE
  #define NETREAD(s,b,l)  (recv((s),(b),(l),0))
  #define NETWRITE(s,b,l) (send((s),(b),(l),0))
  #define NETCLOSE(s)	  (s_close(s))
  #define IoctlSocket	s_ioctl
  #define _STRICT_ANSI 1
  #include <exec/types.h>
//  #include <sys/ioctl.h>
  #include <sys/time.h>
  #include <proto/socket.h>
  #include <netdb.h>
  #include <errno.h>
  #define INCLUDES_DONE
  #define TCP_INCLUDES_DONE
  #define sleep(t) Delay(50*(t))
 #endif /* _AS225 */
#else /* _DNET */
 #include "dnet.h"
 #define TCP_INCLUDES_DONE
 #define ENOTCONN -1
 #define ECONNRESET -1
 #undef NETREAD
 #undef NETWRITE
 #undef NETCLOSE
 #define NETREAD  DRead
 #define NETWRITE DWrite
 #define NETCLOSE DClose
#define sleep(t) Delay(50*(t))
#endif /* _DNET */
#endif	/* _AMIGA */

/*

Defaults

  INCLUDE FILES FOR TCP

 */
#ifndef __AROS__
#ifndef TCP_INCLUDES_DONE
//#include <sys/ioctl.h> /* EJB */
#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 */
#else
#include <unistd.h>
#endif


/*

  MACROS FOR MANIPULATING MASKS FOR SELECT()

 */
#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 */

#endif /* TCP_H */
