[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]

unit WinSock;

{$C FIXED PRELOAD DISCARDABLE}

(*
 * WINSOCK.H--definitions to be used with the WINSOCK.DLL
 *
 * This header file corresponds to version 1.1 of the Windows Sockets specification.
 *
 * This file includes parts which are Copyright (c) 1982-1986 Regents
 * of the University of California.  All rights reserved.  The
 * Berkeley Software License Agreement specifies the terms and
 * conditions for redistribution.
 *
 * Original WINSOCK.H Change log:
 *
 * Fri Apr 23 16:31:01 1993  Mark Towfiq  (towfiq@Microdyne.COM)
 *	New version from David Treadwell which adds extern "C" around
 *	__WSAFDIsSet() and removes "const" from buf param of
 *	WSAAsyncGetHostByAddr().  Added change log.
 *
 * Sat May 15 10:55:00 1993 David Treadwell (davidtr@microsoft.com)
 *	Fix the IN_CLASSC macro to account for class-D multicasts.
 *	Add AF_IPX == AF_NS.
 *
 * Tue Oct 19 13:05:02 1993  Mark Towfiq (Mark.Towfiq@Sun.COM)
 *	New version from David Treadwell which changes type of counter in
 *	fd_set to u_int instead of u_short, so that it is correctly
 *	promoted in Winsdows NT and other 32-bit environments.
 *
 * Translated to BP7 by:  Randy Bratton, CServe: 72355,1466
 *
 * NOTE:  I have tried to keep the declaration order in WINSOCK.PAS the
 *        same as that in WINSOCK.H.  Most of the comments from the original
 *        WINSOCK.H have been left intact in the Pascal version.
 *        My comments are labeled with RMB.
 *
 * NO WARRANTY EXPRESSED OR IMPLIED.
 *
 * WINSOCK.PAS Revision History
 *    Version         Date      By     Comments
 *      1.00        03/04/94    RMB    Initial revision.
 *      1.01        08/22/94    RMB    General cleanup before posting to
 *                                     CompuServe.
 *      1.02        09/29/94    RMB    Added h_addr function for THostEnt
 *                                     structure.
 *      1.03        03/10/96    RMB    Fixed bug (noted by P. Payzant) in
 *                                     TWSAData. Now corresponds to WINSOCK.H
 *                                     dated 10/19/93 (except where noted).
 *)

interface

uses
  WinTypes;

type
(*
 * Basic system type definitions, taken from the BSD file sys/types.h.
 *)
  u_char  = char;
  u_short = word;  (* in Borland C++, int and short are both 16-bits RMB *)
  u_int   = word;
  u_long  = longint;

(*
 * Other basic types needed for the C to Pascal translation.  RMB
 *)
  PPChar = ^PChar;  (* used with char FAR * FAR * xxx   RMB *)

(*
 * The new type to be used in all
 * instances which refer to sockets.
 *
 * Must be renamed from SOCKET as there is a function called
 * socket().  RMB
 *)
  PSocket = ^TSocket;
  TSocket = u_int;

(*
 * Select uses arrays of SOCKETs.  These macros manipulate such
 * arrays.  FD_SETSIZE may be defined by the user before including
 * this file, but the default here should be >= 64.
 *
 * CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
 * INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
 *)
const
  FD_SETSIZE =64;

type
  PFd_Set = ^TFd_Set;
  TFd_Set = record
    fd_count : u_int;                              (* how many are SET? *) (* RMB 03/10/96 1.03 *)
                                                   (* 10/19/93 update to original WINSOCK.H *)
    fd_array : array[0..FD_SETSIZE-1] of TSocket;  (* an array of SOCKETs *)
    end;

function  __WSAFDIsSet(fd: TSocket; aset: PFd_Set): integer;

(*
**  NB:  Have not done any work with socket arrays, therefore these
**  routines have not been tested.  RMB 08/22/94 1.01
*)
procedure Fd_Clr(fd: TSocket; aset: PFd_Set);
procedure Fd_Set(fd: TSocket; aset: PFd_Set);
procedure Fd_Zero(aset: PFd_Set);
function  Fd_IsSet(fd: TSocket; aset: PFd_Set): boolean;

(*
 * Structure used in select() call, taken from the BSD file sys/time.h.
 *)
type
  PTimeval = ^Timeval;
  Timeval = record
        tv_sec: longint;         (* seconds *)
        tv_usec: longint;        (* and microseconds *)
        end;
(*
 * Operations on timevals.
 *
 * NB: timercmp does not work for >= or <=.
 *)
(*
**  DEFINES (macros) for timerisset, timercmp, and timerclear
**  not implemented.  RMB
*)

(*
 * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
 *
 *
 * Ioctl's have the command encoded in the lower word,
 * and the size of any in or out parameters in the upper
 * word.  The high 2 bits of the upper word are used
 * to encode the in/out status of the parameter; for now
 * we restrict parameters to at most 128 bytes.
 *)
const
  IOCPARM_MASK =   $07f;            (* parameters must be < 128 bytes *)
  IOC_VOID     =   $20000000;       (* no parameters *)
  IOC_OUT      =   $040000000;      (* copy out parameters *)
  IOC_IN       =   $080000000;      (* copy in parameters *)
  IOC_INOUT    =   (IOC_IN or IOC_OUT);
																				(* 0x20000000 distinguishes new &
																					 old ioctl's *)
(*
**  DEFINES (macros) for _IO, _IOR, _IOW, FIONREAD, FIONBIO, FIOASYNC,
**    SIOCSHIWAT, SIOCGHIWAT, SIOCSLOWAT, SIOCGLOWAT, SIOCATMARK
**    not implemented.  RMB
*)

(*
 * Structures returned by network data base library, taken from the
 * BSD file netdb.h.  All addresses are supplied in host order, and
 * returned in network order (suitable for use in system calls).
 *)

type
  PHostEnt = ^THostEnt;
  THostEnt = record
        h_name : PChar;           (* official name of host *)
        h_aliases: PPChar;        (* alias list *)
        h_addrtype: integer;      (* host address type *)
        h_length :  integer;      (* length of address *)
        h_addr_list: PPChar;      (* list of addresses *)
        end;

{
  C #define h_addr h_addr_list[0] omitted as currently only needed for
  backward compatibility.  RMB 08/22/94 1.01
}
function h_addr(aHostEnt: THostEnt): PChar;  (* RMB 09/29/94 1.02 *)

(*
 * It is assumed here that a network number
 * fits in 32 bits.
 *)
type
  PNetEnt = ^TNetEnt;
  TNetEnt = record
        n_name : PChar;           (* official name of net *)
        n_aliases : PPChar;       (* alias list *)
        n_addrtype : integer;     (* net address type *)
        n_net : u_long;           (* network $ *)
        end;

type
  PServEnt = ^TServEnt;
  TServEnt = record
        s_name : PChar;           (* official service name *)
        s_aliases : PPChar;       (* alias list *)
        s_port : integer;         (* port $ *)
        s_proto : PChar;          (* protocol to use *)
        end;

type
  PProtoEnt = ^TProtoEnt;
  TProtoEnt = record
        p_name : PChar;           (* official protocol name *)
        p_aliases : PPChar;       (* alias list *)
        p_proto : integer;        (* protocol $ *)
        end;

(*
 * Constants and procedures defined by the internet system,
 * Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
 *)

(*
 * Protocols
 *)
const
   IPPROTO_IP          =    0;               (* dummy for IP *)
   IPPROTO_ICMP        =    1;               (* control message protocol *)
   IPPROTO_GGP         =    2;               (* gateway^2 (deprecated) *)
   IPPROTO_TCP         =    6;               (* tcp *)
   IPPROTO_PUP         =    12;              (* pup *)
   IPPROTO_UDP         =    17;              (* user datagram protocol *)
   IPPROTO_IDP         =    22;              (* xns idp *)
   IPPROTO_ND          =    77;              (* UNOFFICIAL net disk proto *)

   IPPROTO_RAW         =    255;             (* raw IP packet *)
   IPPROTO_MAX         =    256;

(*
 * Port/socket numbers: network standard functions
 *)
   IPPORT_ECHO         =    7;
   IPPORT_DISCARD      =    9;
   IPPORT_SYSTAT       =    11;
   IPPORT_DAYTIME      =    13;
   IPPORT_NETSTAT      =    15;
   IPPORT_FTP          =    21;
   IPPORT_TELNET       =    23;
   IPPORT_SMTP         =    25;
   IPPORT_TIMESERVER   =    37;
   IPPORT_NAMESERVER   =    42;
   IPPORT_WHOIS        =    43;
   IPPORT_MTP          =    57;

(*
 * Port/socket numbers: host specific functions
 *)
   IPPORT_TFTP         =    69;
   IPPORT_RJE          =    77;
   IPPORT_FINGER       =    79;
   IPPORT_TTYLINK      =    87;
   IPPORT_SUPDUP       =    95;

(*
 * UNIX TCP sockets
 *)
   IPPORT_EXECSERVER   =    512;
   IPPORT_LOGINSERVER  =    513;
   IPPORT_CMDSERVER    =    514;
   IPPORT_EFSSERVER    =    520;

(*
 * UNIX UDP sockets
 *)
   IPPORT_BIFFUDP      =    512;
   IPPORT_WHOSERVER    =    513;
   IPPORT_ROUTESERVER  =    520;
																				(* 520+1 also used *)

(*
 * Ports < IPPORT_RESERVED are reserved for
 * privileged processes (e.g. root).
 *)
   IPPORT_RESERVED    =     1024;

(*
 * Link numbers
 *)
   IMPLINK_IP         =     155;
   IMPLINK_LOWEXPER   =     156;
   IMPLINK_HIGHEXPER  =     158;

(*
 * Internet address (old style... should be updated)
 *)
type
  PIn_Addr = ^TIn_Addr;
  TIn_Addr = record
        case integer of
          1: (S_un_b : record
                      s_b1,
                      s_b2,
                      s_b3,
                      s_b4 : u_char;
                      end);
          2: (S_un_w : record
                      s_w1,
                      s_w2 : u_short;
                      end);
          3: (S_addr : u_long);
        end;

function s_addr(s_un: TIn_Addr): u_long;
function s_host(s_un: TIn_Addr): u_char;
function s_net(s_un: TIn_Addr): u_char;
function s_imp(s_un: TIn_Addr): u_short;
function s_impno(s_un: TIn_Addr): u_char;
function s_lh(s_un: TIn_Addr): u_char;

(*
 * Definitions of bits in internet address integers.
 * On subnets, the decomposition of addresses to host and net parts
 * is done according to subnet mask, not the masks here.
 *)
const
  IN_CLASSA_NET       =    $ff000000;
  IN_CLASSA_NSHIFT    =    24;
  IN_CLASSA_HOST      =    $00ffffff;
  IN_CLASSA_MAX       =    128;

  IN_CLASSB_NET       =    $ffff0000;
  IN_CLASSB_NSHIFT    =    16;
  IN_CLASSB_HOST      =    $0000ffff;
  IN_CLASSB_MAX       =    65536;

  IN_CLASSC_NET       =    $ffffff00;
  IN_CLASSC_NSHIFT    =    8;
  IN_CLASSC_HOST      =    $000000ff;

  INADDR_ANY          =    $000000000;
  INADDR_LOOPBACK     =    $7f000001;
  INADDR_BROADCAST    =    $ffffffff;
  INADDR_NONE         =    $ffffffff;

function In_ClassA(i : longint) : boolean;
function In_ClassB(i : longint) : boolean;
function In_ClassC(i : longint) : boolean;

(*
 * Socket address, internet style.
 *)
type
  PSockAddr_In = ^TSockAddr_In;
  TSockAddr_in = record
          sin_family  : integer;
          sin_port    : u_short;
          sin_addr    : TIn_Addr;
          sin_zero    : array[0..7] of char;
          end;

const
  WSADESCRIPTION_LEN   =   256;
  WSASYS_STATUS_LEN    =   128;

type
  PWSAData = ^TWSAData;
  TWSAData = record
          wVersion       : word;
          wHighVersion   : word;
          szDescription  : array[0..WSADESCRIPTION_LEN] of char;  (* RMB 03/10/96 1.03 *)
          szSystemStatus : array[0..WSASYS_STATUS_LEN] of char;   (* RMB 03/10/96 1.03 *)
          iMaxSockets    : u_short;
          iMaxUdpDg      : u_short;
          lpVendorInfo   : PChar;
          end;

(*
 * Options for use with [gs]etsockopt at the IP level.
 *)
const

  IP_OPTIONS  =    1;               (* set/get IP per-packet options *)

(*
 * Definitions related to sockets: types, address families, options,
 * taken from the BSD file sys/socket.h.
 *)

(*
 * This is used instead of -1, since the
 * SOCKET type is unsigned.
 *)
const
  INVALID_SOCKET = TSocket(not 0);
  SOCKET_ERROR   = -1;

(*
 * Types
 *)
  SOCK_STREAM     = 1;               (* stream socket *)
  SOCK_DGRAM      = 2;               (* datagram socket *)
  SOCK_RAW        = 3;               (* raw-protocol interface *)
  SOCK_RDM        = 4;               (* reliably-delivered message *)
  SOCK_SEQPACKET  = 5;               (* sequenced packet stream *)

(*
 * Option flags per-socket.
 *)
  SO_DEBUG        = $0001;          (* turn on debugging info recording *)
  SO_ACCEPTCONN   = $0002;          (* socket has had listen() *)
  SO_REUSEADDR    = $0004;          (* allow local address reuse *)
  SO_KEEPALIVE    = $0008;          (* keep connections alive *)
  SO_DONTROUTE    = $0010;          (* just use interface addresses *)
  SO_BROADCAST    = $0020;          (* permit sending of broadcast msgs *)
  SO_USELOOPBACK  = $0040;          (* bypass hardware when possible *)
  SO_LINGER       = $0080;          (* linger on close if data present *)
  SO_OOBINLINE    = $0100;          (* leave received OOB data in line *)

  SO_DONTLINGER   = u_int(not SO_LINGER);

(*
 * Additional options.
 *)
  SO_SNDBUF       = $1001;          (* send buffer size *)
  SO_RCVBUF       = $1002;          (* receive buffer size *)
  SO_SNDLOWAT     = $1003;          (* send low-water mark *)
  SO_RCVLOWAT     = $1004;          (* receive low-water mark *)
  SO_SNDTIMEO     = $1005;          (* send timeout *)
  SO_RCVTIMEO     = $1006;          (* receive timeout *)
  SO_ERROR        = $1007;          (* get error status and clear *)
  SO_TYPE         = $1008;          (* get socket type *)

(*
 * TCP options.
 *)
  TCP_NODELAY     = $0001;

(*
 * Address families.
 *)
  AF_UNSPEC       = 0;               (* unspecified *)
  AF_UNIX         = 1;               (* local to host (pipes, portals) *)
  AF_INET         = 2;               (* internetwork: UDP, TCP, etc. *)
  AF_IMPLINK      = 3;               (* arpanet imp addresses *)
  AF_PUP          = 4;               (* pup protocols: e.g. BSP *)
  AF_CHAOS        = 5;               (* mit CHAOS protocols *)
  AF_NS           = 6;               (* XEROX NS protocols *)
  AF_IPX          = 6;               (* IPX and SPX *) (* RMB 03/10/96 1.03 *)
                                                       (* 05/15/93 update to original WINSOCK.H *)
  AF_ISO          = 7;               (* ISO protocols *)
  AF_OSI          = AF_ISO;          (* OSI is ISO *)
  AF_ECMA         = 8;               (* european computer manufacturers *)
  AF_DATAKIT      = 9;               (* datakit protocols *)
  AF_CCITT        = 10;              (* CCITT protocols, X.25 etc *)
  AF_SNA          = 11;              (* IBM SNA *)
  AF_DECnet       = 12;              (* DECnet *)
  AF_DLI          = 13;              (* Direct data link interface *)
  AF_LAT          = 14;              (* LAT *)
  AF_HYLINK       = 15;              (* NSC Hyperchannel *)
  AF_APPLETALK    = 16;              (* AppleTalk *)
  AF_NETBIOS      = 17;              (* NetBios-style addresses *)

  AF_MAX          = 18;

(*
 * Structure used by kernel to store most
 * addresses.
 *)
type
  PSockAddr = ^TSockAddr;
  TSockAddr = record
        sa_family : u_short;            (* address family *)
        sa_data : array[0..13] of char; (* up to 14 bytes of direct address *)
        end;

(*
 * Structure used by kernel to pass protocol
 * information in raw sockets.
 *)
type
  PSockProto = ^TSockProto;
  TSockProto = record
        sp_family : u_short;              (* address family *)
        sp_protocol : u_short;            (* protocol *)
        end;

(*
 * Protocol families, same as address families for now.
 *)
const

  PF_UNSPEC       = AF_UNSPEC;
  PF_UNIX         = AF_UNIX;
  PF_INET         = AF_INET;
  PF_IMPLINK      = AF_IMPLINK;
  PF_PUP          = AF_PUP;
  PF_CHAOS        = AF_CHAOS;
  PF_NS           = AF_NS;
  PF_IPX          = AF_IPX;  (* RMB 3/9/96 1.03 *)
                             (* 5/15/93 update to original WINSOCK.H *)
  PF_ISO          = AF_ISO;
  PF_OSI          = AF_OSI;
  PF_ECMA         = AF_ECMA;
  PF_DATAKIT      = AF_DATAKIT;
  PF_CCITT        = AF_CCITT;
  PF_SNA          = AF_SNA;
  PF_DECnet       = AF_DECnet;
  PF_DLI          = AF_DLI;
  PF_LAT          = AF_LAT;
  PF_HYLINK       = AF_HYLINK;
  PF_APPLETALK    = AF_APPLETALK;

  PF_MAX          = AF_MAX;

(*
 * Structure used for manipulating linger option.
 *)
type
  PLinger = ^TLinger;
  TLinger = record
          l_onoff  : WordBool; {was u_short RMB} (* option on/off *) (* RMB 03/10/96 1.03 *)
          l_linger : u_short;                    (* linger time *)
          end;

(*
 * Level number for (get/set)sockopt() to apply to socket itself.
 *)
const
  SOL_SOCKET      = -1; {was $ffff  RMB}  (* options for socket level *)

(*
 * Maximum queue length specifiable by listen.
 *)
const
  SOMAXCONN       = 5;

  MSG_OOB         = $1;             (* process out-of-band data *)
  MSG_PEEK        = $2;             (* peek at incoming message *)
  MSG_DONTROUTE   = $4;             (* send without using routing tables *)

  MSG_MAXIOVLEN   = 16;

(*
 * Define constant based on rfc883, used by gethostbyxxxx() calls.
 *)
const
  MAXGETHOSTSTRUCT        = 1024;

(*
 * Define flags to be used with the WSAAsyncSelect() call.
 *)
const
  FD_READ         = $01;
  FD_WRITE        = $02;
  FD_OOB          = $04;
  FD_ACCEPT       = $08;
  FD_CONNECT      = $10;
  FD_CLOSE        = $20;

(*
 * All Windows Sockets error constants are biased by WSABASEERR from
 * the "normal"
 *)
const
  WSABASEERR              = 10000;

(*
 * Windows Sockets definitions of regular Microsoft C error constants
 *)
const
  WSAEINTR                = (WSABASEERR+4);
  WSAEBADF                = (WSABASEERR+9);
  WSAEACCES               = (WSABASEERR+13);
  WSAEFAULT               = (WSABASEERR+14);
  WSAEINVAL               = (WSABASEERR+22);
  WSAEMFILE               = (WSABASEERR+24);

(*
 * Windows Sockets definitions of regular Berkeley error constants
 *)
const
  WSAEWOULDBLOCK          = (WSABASEERR+35);
  WSAEINPROGRESS          = (WSABASEERR+36);
  WSAEALREADY             = (WSABASEERR+37);
  WSAENOTSOCK             = (WSABASEERR+38);
  WSAEDESTADDRREQ         = (WSABASEERR+39);
  WSAEMSGSIZE             = (WSABASEERR+40);
  WSAEPROTOTYPE           = (WSABASEERR+41);
  WSAENOPROTOOPT          = (WSABASEERR+42);
  WSAEPROTONOSUPPORT      = (WSABASEERR+43);
  WSAESOCKTNOSUPPORT      = (WSABASEERR+44);
  WSAEOPNOTSUPP           = (WSABASEERR+45);
  WSAEPFNOSUPPORT         = (WSABASEERR+46);
  WSAEAFNOSUPPORT         = (WSABASEERR+47);
  WSAEADDRINUSE           = (WSABASEERR+48);
  WSAEADDRNOTAVAIL        = (WSABASEERR+49);
  WSAENETDOWN             = (WSABASEERR+50);
  WSAENETUNREACH          = (WSABASEERR+51);
  WSAENETRESET            = (WSABASEERR+52);
  WSAECONNABORTED         = (WSABASEERR+53);
  WSAECONNRESET           = (WSABASEERR+54);
  WSAENOBUFS              = (WSABASEERR+55);
  WSAEISCONN              = (WSABASEERR+56);
  WSAENOTCONN             = (WSABASEERR+57);
  WSAESHUTDOWN            = (WSABASEERR+58);
  WSAETOOMANYREFS         = (WSABASEERR+59);
  WSAETIMEDOUT            = (WSABASEERR+60);
  WSAECONNREFUSED         = (WSABASEERR+61);
  WSAELOOP                = (WSABASEERR+62);
  WSAENAMETOOLONG         = (WSABASEERR+63);
  WSAEHOSTDOWN            = (WSABASEERR+64);
  WSAEHOSTUNREACH         = (WSABASEERR+65);
  WSAENOTEMPTY            = (WSABASEERR+66);
  WSAEPROCLIM             = (WSABASEERR+67);
  WSAEUSERS               = (WSABASEERR+68);
  WSAEDQUOT               = (WSABASEERR+69);
  WSAESTALE               = (WSABASEERR+70);
  WSAEREMOTE              = (WSABASEERR+71);

(*
 * Extended Windows Sockets error constant definitions
 *)
const
  WSASYSNOTREADY          = (WSABASEERR+91);
  WSAVERNOTSUPPORTED      = (WSABASEERR+92);
  WSANOTINITIALISED       = (WSABASEERR+93);

(*
 * Error return codes from gethostbyname() and gethostbyaddr()
 * (when using the resolver). Note that these errors are
 * retrieved via WSAGetLastError() and must therefore follow
 * the rules for avoiding clashes with error numbers from
 * specific implementations or language run-time systems.
 * For this reason the codes are based at WSABASEERR+1001.
 * Note also that [WSA]NO_ADDRESS is defined only for
 * compatibility purposes.
 *)

function h_errno : integer;

const
(* Authoritative Answer: Host not found *)
  WSAHOST_NOT_FOUND       = (WSABASEERR+1001);
  HOST_NOT_FOUND          = WSAHOST_NOT_FOUND;

(* Non-Authoritative: Host not found, or SERVERFAIL *)
  WSATRY_AGAIN            = (WSABASEERR+1002);
  TRY_AGAIN               = WSATRY_AGAIN;

(* Non recoverable errors, FORMERR, REFUSED, NOTIMP *)
  WSANO_RECOVERY          = (WSABASEERR+1003);
  NO_RECOVERY             = WSANO_RECOVERY;

(* Valid name, no data record of requested type *)
  WSANO_DATA              = (WSABASEERR+1004);
  NO_DATA                 = WSANO_DATA;

(* no address, look for MX record *)
  WSANO_ADDRESS           = WSANO_DATA;
  NO_ADDRESS              = WSANO_ADDRESS;

(*
 * Windows Sockets errors redefined as regular Berkeley error constants
 *)
const
  EWOULDBLOCK             = WSAEWOULDBLOCK;
  EINPROGRESS             = WSAEINPROGRESS;
  EALREADY                = WSAEALREADY;
  ENOTSOCK                = WSAENOTSOCK;
  EDESTADDRREQ            = WSAEDESTADDRREQ;
  EMSGSIZE                = WSAEMSGSIZE;
  EPROTOTYPE              = WSAEPROTOTYPE;
  ENOPROTOOPT             = WSAENOPROTOOPT;
  EPROTONOSUPPORT         = WSAEPROTONOSUPPORT;
  ESOCKTNOSUPPORT         = WSAESOCKTNOSUPPORT;
  EOPNOTSUPP              = WSAEOPNOTSUPP;
  EPFNOSUPPORT            = WSAEPFNOSUPPORT;
  EAFNOSUPPORT            = WSAEAFNOSUPPORT;
  EADDRINUSE              = WSAEADDRINUSE;
  EADDRNOTAVAIL           = WSAEADDRNOTAVAIL;
  ENETDOWN                = WSAENETDOWN;
  ENETUNREACH             = WSAENETUNREACH;
  ENETRESET               = WSAENETRESET;
  ECONNABORTED            = WSAECONNABORTED;
  ECONNRESET              = WSAECONNRESET;
  ENOBUFS                 = WSAENOBUFS;
  EISCONN                 = WSAEISCONN;
  ENOTCONN                = WSAENOTCONN;
  ESHUTDOWN               = WSAESHUTDOWN;
  ETOOMANYREFS            = WSAETOOMANYREFS;
  ETIMEDOUT               = WSAETIMEDOUT;
  ECONNREFUSED            = WSAECONNREFUSED;
  ELOOP                   = WSAELOOP;
  ENAMETOOLONG            = WSAENAMETOOLONG;
  EHOSTDOWN               = WSAEHOSTDOWN;
  EHOSTUNREACH            = WSAEHOSTUNREACH;
  ENOTEMPTY               = WSAENOTEMPTY;
  EPROCLIM                = WSAEPROCLIM;
  EUSERS                  = WSAEUSERS;
  EDQUOT                  = WSAEDQUOT;
  ESTALE                  = WSAESTALE;
  EREMOTE                 = WSAEREMOTE;

(* Socket function prototypes *)

function accept(s: TSOCKET; addr: PSockAddr; addrlen: PInteger): TSOCKET;

function bind(s: TSOCKET; const addr: PSockAddr; namelen: integer): integer;

function closesocket(s: TSOCKET): integer;

function connect(s: TSOCKET; const name: PSockAddr; namelen: integer): integer;

function getpeername(s: TSOCKET; name: PSockAddr; namelen: PInteger): integer;

function getsockname(s: TSOCKET; name: PSockAddr; namelen: PInteger): integer;

function getsockopt(s: TSOCKET; level: integer; optname: integer;
                    optval: PChar; optlen: PInteger): integer;

function htonl(hostlong: u_long): u_long;

function htons(hostshort: u_short): u_short;

function inet_addr(const cp: PChar): longint;

function inet_ntoa(ain: TIn_Addr): PChar;

function ioctlsocket(s: TSOCKET; cmd: longint; argp: PLongint) : integer;

function listen (s: TSOCKET; backlog: integer): integer;

function ntohl(netlong: u_long): u_long;

function ntohs(netshort: u_short): u_short;

function recv(s : TSOCKET; buf: PChar; len: integer; flags: integer): integer;

function recvfrom(s : TSOCKET; buf: PChar; len: integer; flags: integer;
                  from: PSockAddr; fromlen: PInteger): integer;

function select(nfds: integer; readfds: PFd_Set; writefds: PFd_Set;
                exceptfds: PFd_Set; const timeout: PTimeval): integer;

function send(s: TSOCKET; const buf: PChar; len: integer; flags: integer): integer;

function sendto(s: TSOCKET; const buf: PChar; len: integer; flags: integer;
                const ato: PSockAddr; tolen: integer): integer;

function setsockopt(s: TSOCKET; level: integer; optname: integer;
                    const optval: PChar; optlen: integer): integer;

function shutdown(s: TSOCKET; how: integer): integer;

function socket(af: integer; atype: integer; protocol: integer): TSOCKET;

(* Database function prototypes *)

function gethostbyaddr(const addr: PChar; len: integer; atype: integer): PHostEnt;

function gethostbyname(const name: PChar): PHostEnt;

function gethostname(name: PChar; namelen: integer): integer;

function getprotobyname(const name: PChar): PProtoEnt;

function getprotobynumber(proto: integer): PProtoEnt;

function getservbyname(const name: PChar; const proto: PChar): PServEnt;

function getservbyport(port: integer; const proto: PChar): PServEnt;


(* Microsoft Windows Extension function prototypes *)

function WSAAsyncGetHostByAddr(hWnd: HWND; wMsg: u_int;
                               const addr: PChar; len: integer; atype: integer;
                               buf: PChar; buflen: integer): THandle;  (* RMB 03/10/96 1.03 *)
                                                  (* 04/23/93 update to original WINSOCK.H *)

function WSAAsyncGetHostByName(hWnd: HWND; wMsg: u_int;
                               const name: PChar; buf: PChar;
                               buflen: integer): THandle;

function WSAAsyncGetProtoByName(hWnd: HWND; wMsg: u_int;
                                const name: PChar; buf: PChar;
                                buflen: integer): THandle;

function WSAAsyncGetProtoByNumber(hWnd: HWND; wMsg: u_int;
                                  number: integer; buf: PChar;
                                  buflen: integer): THandle;

function WSAAsyncGetServByName(hWnd: HWND; wMsg: u_int;
                               const name: PChar;
                               const proto: PChar;
                               buf: PChar; buflen: integer): THandle;

function WSAAsyncGetServByPort(hWnd: HWND; wMsg: u_int; port: integer;
                               const proto: PChar; buf: PChar;
                               buflen: integer): THandle;

function WSAAsyncSelect(s : TSocket; hWnd: HWND; wMsg: u_int;
                        lEvent: longint): integer;

function WSACancelAsyncRequest(hAsyncTaskHandle: THandle): integer;

function WSACancelBlockingCall: integer;

function WSACleanup: integer;

function WSAGetLastError: integer;

function WSAIsBlocking: boolean;

function WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc;

procedure WSASetLastError(iError: integer);

function WSAStartup(wVersionRequired: word; lpWSAData: PWSAData): integer;

function WSAUnhookBlockingHook: integer;

(*
 * Windows message parameter composition and decomposition
 * macros.
 *
 * WSAMAKEASYNCREPLY is inteneded for use by the Windows Sockets implementation
 * when constructing the response to a WSAAsyncGetXByX() routine.
 *)
function WSAMakeAsyncReply(buflen, error: word): longint;
(*
 * WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
 * when constructing the response to WSAAsyncSelect().
 *)
function WSAMakeSelectReply(event, error: word): longint;
(*
 * WSAGETASYNCBUFLEN is intended for use by the Windows Sockets application
 * to extract the buffer length from the lParam in the response
 * to a WSAGetXByY().
 *)
function WSAGetAsyncBuflen(lparam: longint): word;
(*
 * WSAGETASYNCERROR is intended for use by the Windows Sockets application
 * to extract the error code from the lParam in the response
 * to a WSAGetXByY().
 *)
function WSAGetAsyncError(lparam: longint): word;
(*
 * WSAGETSELECTEVENT is intended for use by the Windows Sockets application
 * to extract the event code from the lParam in the response
 * to a WSAAsyncSelect().
 *)
function WSAGetSelectEvent(lparam: longint): word;
(*
 * WSAGETSELECTERROR is intended for use by the Windows Sockets application
 * to extract the error code from the lParam in the response
 * to a WSAAsyncSelect().
 *)
function WSAGetSelectError(lparam: longint): word;

implementation

uses
  WinProcs;

function accept; external 'WINSOCK' index 1;
function bind; external 'WINSOCK' index 2;
function closesocket; external 'WINSOCK' index 3;
function connect; external 'WINSOCK' index 4;
function getpeername; external 'WINSOCK' index 5;
function getsockname; external 'WINSOCK' index 6;
function getsockopt; external 'WINSOCK' index 7;
function htonl; external 'WINSOCK' index 8;
function htons; external 'WINSOCK' index 9;
function inet_addr; external 'WINSOCK' index 10;
function inet_ntoa; external 'WINSOCK' index 11;
function ioctlsocket; external 'WINSOCK' index 12;
function listen; external 'WINSOCK' index 13;
function ntohl; external 'WINSOCK' index 14;
function ntohs; external 'WINSOCK' index 15;
function recv; external 'WINSOCK' index 16;
function recvfrom; external 'WINSOCK' index 17;
function select; external 'WINSOCK' index 18;
function send; external 'WINSOCK' index 19;
function sendto; external 'WINSOCK' index 20;
function setsockopt; external 'WINSOCK' index 21;
function shutdown; external 'WINSOCK' index 22;
function socket; external 'WINSOCK' index 23;

function gethostbyaddr; external 'WINSOCK' index 51;
function gethostbyname; external 'WINSOCK' index 52;
function getprotobyname; external 'WINSOCK' index 53;
function getprotobynumber; external 'WINSOCK' index 54;
function getservbyname; external 'WINSOCK' index 55;
function getservbyport; external 'WINSOCK' index 56;
function gethostname; external 'WINSOCK' index 57;

function WSAAsyncSelect; external 'WINSOCK' index 101;
function WSAAsyncGetHostByAddr; external 'WINSOCK' index 102;
function WSAAsyncGetHostByName; external 'WINSOCK' index 103;
function WSAAsyncGetProtoByNumber; external 'WINSOCK' index 104;
function WSAAsyncGetProtoByName; external 'WINSOCK' index 105;
function WSAAsyncGetServByPort; external 'WINSOCK' index 106;
function WSAAsyncGetServByName; external 'WINSOCK' index 107;
function WSACancelAsyncRequest; external 'WINSOCK' index 108;
function WSASetBlockingHook; external 'WINSOCK' index 109;
function WSAUnhookBlockingHook; external 'WINSOCK' index 110;
function WSAGetLastError; external 'WINSOCK' index 111;
procedure WSASetLastError; external 'WINSOCK' index 112;
function WSACancelBlockingCall; external 'WINSOCK' index 113;
function WSAIsBlocking; external 'WINSOCK' index 114;
function WSAStartup; external 'WINSOCK' index 115;
function WSACleanup; external 'WINSOCK' index 116;

function __WSAFDIsSet; external 'WINSOCK' index 151;

procedure Fd_Clr(fd: TSocket; aset: PFd_Set);
var
  i: u_int;
begin
  for i := 0 to aset^.fd_count do
    begin
    if aset^.fd_array[i] = fd then (* found the one to clear *)
      begin
      while i < (aset^.fd_count-1) do
        begin
        aset^.fd_array[i] := aset^.fd_array[i+1];
        inc(i);
        end;
      dec(aset^.fd_count);
      break;
      end;
    end;
end;

procedure Fd_Set(fd: TSocket; aset: PFd_Set);
begin
  if aset^.fd_count < FD_SETSIZE then
    begin
    aset^.fd_array[aset^.fd_count] := fd;
    inc(aset^.fd_count);
    end;
end;

procedure Fd_Zero(aset: PFd_Set);
begin
  aset^.fd_count := 0;
end;

function Fd_IsSet(fd: TSocket; aset: PFd_Set): boolean;
begin
  Fd_IsSet := (__WSAFDIsSet(fd, aSet) > 0);
end;

function h_addr(aHostEnt: THostEnt): PChar;  (* RMB 09/29/94 1.02 *)
begin
  h_addr := aHostEnt.h_addr_list^;
end;

function s_addr(S_un: TIn_Addr): u_long;
begin
  s_addr := S_un.S_addr;  (* can be used for most tcp & ip code *)
end;

function s_host(S_un: TIn_Addr): u_char;
begin
  s_host := S_un.S_un_b.s_b2;  (* host on imp *)
end;

function s_net(S_un: TIn_Addr): u_char;
begin
  s_net := S_un.S_un_b.s_b1;  (* network *)
end;

function s_imp(S_un: TIn_Addr): u_short;
begin
  s_imp := S_un.S_un_w.s_w2; (* imp *)
end;

function s_impno(S_un: TIn_Addr): u_char;
begin
  s_impno := S_un.S_un_b.s_b4; (* imp $ *)
end;

function s_lh(S_un: TIn_Addr): u_char;
begin
  s_lh := S_un.S_un_b.s_b3;  (* logical host *)
end;

function In_ClassA(i : longint) : boolean;
begin
  In_ClassA := ((i and $80000000) = 0);
end;

function In_ClassB(i : longint) : boolean;
begin
  In_ClassB := ((i and  $c0000000) = $80000000);
end;

function In_ClassC(i : longint) : boolean;
begin
  In_ClassC := ((i and $e0000000) = $c0000000);   (* RMB 03/10/96 1.03 *)
                                                  (* 05/15/93 to original WINSOCK.H *)
end;

function h_errno : integer;
begin
  h_errno := WSAGetLastError;
end;

function WSAMakeAsyncReply(buflen, error: word): longint;
begin
  WSAMakeAsyncReply := MakeLong(buflen, error);
end;

function WSAMakeSelectReply(event, error: word): longint;
begin
  WSAMakeSelectReply := MakeLong(event, error);
end;

function WSAGetAsyncBuflen(lparam: longint): word;
begin
  WSAGetAsyncBuflen := LoWord(lparam);
end;

function WSAGetAsyncError(lparam: longint): word;
begin
  WSAGetAsyncError := HiWord(lparam);
end;

function WSAGetSelectEvent(lparam: longint): word;
begin
  WSAGetSelectEvent := LoWord(lparam);
end;

function WSAGetSelectError(lparam: longint): word;
begin
  WSAGetSelectError := HiWord(lparam);
end;

END.

[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]