home *** CD-ROM | disk | FTP | other *** search
- unit SockDef;
- (*
- **
- ** SOCKDEF routines
- **
- ** Copyright (c) 1998 by Thomas W. Mueller
- **
- ** Created : 24-Oct-1998
- ** Last update : 24-Oct-1998
- **
- **
- *)
-
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
- INTERFACE
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
-
- uses
- Sysutils,
- {$IFDEF OS2}
- Os2def;
- {$ENDIF}
- {$IFDEF LINUX}
- Linux;
- {$ENDIF}
- {$IFDEF WIN32}
- Windows;
- {$ENDIF}
-
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
-
- {$IFDEF VER0_99_12}
- type pInteger = ^Integer;
- tFarProc = pointer;
- SmallInt = System.Integer;
- {$ENDIF}
-
- {$IFDEF LINUX}
- type ULONG = longint;
- {$ENDIF}
-
- type
- tSockDesc = LongInt;
- SmallWord = System.Word;
-
- type
- eSocketErr = class(Exception);
-
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
-
- const
- MaxHostNameLen = 120;
-
- (*
- ** 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
-
- (*
- ** Additional options, not kept in so_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
-
- (*
- ** Level number for (get/set)sockopt() to apply to socket itself.
- *)
- SOL_SOCKET =$ffff; // options for socket level
-
- (*
- ** 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_NBS = 7; // nbs protocols
- 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; // Apple Talk
-
- AF_OS2 = AF_UNIX;
-
- AF_NB = 17; // Netbios
- AF_NETBIOS = AF_NB;
-
- AF_MAX = 18;
-
- (*
- ** Protocol families, same as address families for now.
- *)
- 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_NBS = AF_NBS;
- 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_NETBIOS = AF_NB;
- PF_NB = AF_NB;
- PF_OS2 = PF_UNIX;
- PF_MAX = AF_MAX;
-
- (*
- ** Maximum queue length specifiable by listen.
- *)
-
- SOMAXCONN = 5;
-
- FREAD =1;
- FWRITE =2;
-
- MSG_OOB =$1; // process out-of-band data
- MSG_PEEK =$2; // peek at incoming message
- MSG_DONTROUTE =$4; // send without using routing tables
- MSG_FULLREAD =$8; // send without using routing tables
-
- MSG_MAXIOVLEN =16;
-
- const
- { All Windows Sockets error constants are biased by WSABASEERR from the "normal" }
-
- WSABASEERR = 10000;
-
- { Windows Sockets definitions of regular Microsoft C error constants }
-
- 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 }
-
- 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);
-
- WSAEDISCON = (WSABASEERR+101);
-
- { Extended Windows Sockets error constant definitions }
-
- 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. }
-
- { 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.
- These are commented out in Windows NT to avoid conflicts with errno.h.
- Use the WSA constants instead. }
-
- 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;
-
- SockAddr_Len = 16;
- In_Addr_Len = 4;
-
- InAddr_Any = 0;
- InAddr_Loopback = $7F000001;
- InAddr_Broadcast = $FFFFFFFF;
- InAddr_None = $FFFFFFFF;
-
- SOCK_NULL = 0;
- 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
-
- IPPROTO_NULL = 0;
- IPPROTO_UP = 17;
- IPPROTO_TCP = 6;
-
-
- const
- IOCPARM_MASK = $7f;
- IOC_VOID = $20000000;
- IOC_OUT = $40000000;
- IOC_IN = $80000000;
- IOC_INOUT = (IOC_IN or IOC_OUT);
-
- FIONREAD = IOC_OUT or { get # bytes to read }
- ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
- (Longint(Byte('f')) shl 8) or 127;
- FIONBIO = IOC_IN or { set/clear non-blocking i/o }
- ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
- (Longint(Byte('f')) shl 8) or 126;
- FIOASYNC = IOC_IN or { set/clear async i/o }
- ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
- (Longint(Byte('f')) shl 8) or 125;
-
- type
- pLongInt = ^LongInt;
-
- pIoVec = ^tIoVec;
- tIoVec = packed record
- iov_base: POINTER;
- iov_len: LongInt;
- end;
-
- (*
- ** Structure used for manipulating linger option.
- *)
- tLinger = packed record
- l_onoff: LongInt; // option on/off
- l_linger: LongInt; // linger time
- END;
-
- (*
- ** Structure used by kernel to pass protocol
- ** information in raw sockets.
- *)
-
- tSockProto = packed record
- sp_family: WORD; // address family
- sp_protocol: WORD; // protocol
- END;
-
- off_t = LongInt;
-
- tuio = packed record
- uio_iov: pIoVec;
- uio_iovcnt: LongInt;
- uio_offset: off_t;
- uio_segflg: LongInt;
- uio_resid: LongInt;
- END;
-
- pIn_Addr = ^tIn_Addr;
- tIn_Addr = packed record
- case integer of
- 0: (IPAddr: ULong);
- 1: (ClassA: byte;
- ClassB: byte;
- ClassC: byte;
- ClassD: byte)
- end;
-
- (*
- ** Structure used by kernel to store most
- ** addresses.
- *)
- pSockAddr=^tSockAddr;
- tSockAddr=packed record
- case integer of
- 0: (Sin_Family: SmallWord;
- Sin_Port: SmallWord;
- Sin_Addr: tIn_Addr;
- Sin_Zero: array[1.. 8] of byte);
- 1: (Sa_Family: SmallWord;
- Sa_Addr: array[1..14] of byte);
- end;
-
- (*
- ** Message header for recvmsg and sendmsg calls.
- *)
- pMsgHdr = ^tMsgHdr;
- tMsgHdr = packed record
- msg_name: pChar; // optional address
- msg_namelen: LongInt; // size of address
- msg_iov: pIoVec; // scatter/gather array
- msg_iovlen: LongInt; // # elements in msg_iov
- msg_accrights: pChar; // access rights sent/received
- msg_accrightslen: LongInt;
- END;
-
- uio_rw = ( UIO_READ, UIO_WRITE );
-
- pHostEnt = ^tHostEnt;
- tHostEnt = packed record
- H_Name: ^string;
- H_Alias: pointer;
- {$IFDEF OS2}
- H_AddrType: longint;
- H_Length: longint;
- {$ELSE}
- h_addrtype: Smallint;
- h_length: Smallint;
- {$ENDIF}
- H_Addr_List: ^pIn_Addr;
- END;
-
- pProtoEnt = ^tProtoEnt;
- TProtoEnt = packed record
- p_name: pChar; (* official protocol name *)
- p_aliases: ^pChar; (* alias list *)
- p_proto: SmallInt; (* protocol # *)
- end;
-
- pServEnt = ^tServEnt;
- tServEnt = packed record
- s_name: pChar; // official service name
- s_aliases: ^pChar; // alias list
- s_port: SmallInt; // port #
- s_proto: pChar; // protocol to use
- END;
-
- // these types are only used in windows version
- const
- FD_SETSIZE = 64;
-
- type
- PFDSet = ^TFDSet;
- TFDSet = packed record
- fd_count: ULONG;
- fd_array: array[0..FD_SETSIZE-1] of ULONG;
- end;
-
- PTimeVal = ^TTimeVal;
- TTimeVal = packed record
- tv_sec: Longint;
- tv_usec: Longint;
- end;
-
- const
- WSADESCRIPTION_LEN = 256;
- WSASYS_STATUS_LEN = 128;
-
- type
- PWSAData = ^TWSAData;
- TWSAData = packed record
- wVersion: Word;
- wHighVersion: Word;
- szDescription: array[0..WSADESCRIPTION_LEN] of Char;
- szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
- iMaxSockets: Word;
- iMaxUdpDg: Word;
- lpVendorInfo: PChar;
- end;
-
- (*
- ** The re-defination of error constants are necessary to avoid conflict with
- ** standard IBM C Set/2 V1.0 error constants.
- **
- ** All OS/2 SOCKET API error constants are biased by SOCBASEERR from the "normal"
- **
- *)
-
- const
- SOCBASEERR = 10000;
-
- (*
- ** OS/2 SOCKET API definitions of regular Microsoft C 6.0 error constants
- *)
-
- const
- SOCEPERM = (SOCBASEERR+1); (* Not owner *)
- SOCESRCH = (SOCBASEERR+3); (* No such process *)
- SOCEINTR = (SOCBASEERR+4); (* Interrupted system call *)
- SOCENXIO = (SOCBASEERR+6); (* No such device or address *)
- SOCEBADF = (SOCBASEERR+9); (* Bad file number *)
- SOCEACCES = (SOCBASEERR+13); (* Permission denied *)
- SOCEFAULT = (SOCBASEERR+14); (* Bad address *)
- SOCEINVAL = (SOCBASEERR+22); (* Invalid argument *)
- SOCEMFILE = (SOCBASEERR+24); (* Too many open files *)
- SOCEPIPE = (SOCBASEERR+32); (* Broken pipe *)
-
- SOCEOS2ERR = (SOCBASEERR+100); (* OS/2 Error *)
-
- (*
- ** OS/2 SOCKET API definitions of regular BSD error constants
- *)
-
- const
- SOCEWOULDBLOCK = (SOCBASEERR+35); (* Operation would block *)
- SOCEINPROGRESS = (SOCBASEERR+36); (* Operation now in progress *)
- SOCEALREADY = (SOCBASEERR+37); (* Operation already in progress *)
- SOCENOTSOCK = (SOCBASEERR+38); (* Socket operation on non-socket *)
- SOCEDESTADDRREQ = (SOCBASEERR+39); (* Destination address required *)
- SOCEMSGSIZE = (SOCBASEERR+40); (* Message too long *)
- SOCEPROTOTYPE = (SOCBASEERR+41); (* Protocol wrong type for socket *)
- SOCENOPROTOOPT = (SOCBASEERR+42); (* Protocol not available *)
- SOCEPROTONOSUPPORT = (SOCBASEERR+43); (* Protocol not supported *)
- SOCESOCKTNOSUPPORT = (SOCBASEERR+44); (* Socket type not supported *)
- SOCEOPNOTSUPP = (SOCBASEERR+45); (* Operation not supported on socket *)
- SOCEPFNOSUPPORT = (SOCBASEERR+46); (* Protocol family not supported *)
- SOCEAFNOSUPPORT = (SOCBASEERR+47); (* Address family not supported by protocol family *)
- SOCEADDRINUSE = (SOCBASEERR+48); (* Address already in use *)
- SOCEADDRNOTAVAIL = (SOCBASEERR+49); (* Can't assign requested address *)
- SOCENETDOWN = (SOCBASEERR+50); (* Network is down *)
- SOCENETUNREACH = (SOCBASEERR+51); (* Network is unreachable *)
- SOCENETRESET = (SOCBASEERR+52); (* Network dropped connection on reset *)
- SOCECONNABORTED = (SOCBASEERR+53); (* Software caused connection abort *)
- SOCECONNRESET = (SOCBASEERR+54); (* Connection reset by peer *)
- SOCENOBUFS = (SOCBASEERR+55); (* No buffer space available *)
- SOCEISCONN = (SOCBASEERR+56); (* Socket is already connected *)
- SOCENOTCONN = (SOCBASEERR+57); (* Socket is not connected *)
- SOCESHUTDOWN = (SOCBASEERR+58); (* Can't send after socket shutdown *)
- SOCETOOMANYREFS = (SOCBASEERR+59); (* Too many references: can't splice *)
- SOCETIMEDOUT = (SOCBASEERR+60); (* Connection timed out *)
- SOCECONNREFUSED = (SOCBASEERR+61); (* Connection refused *)
- SOCELOOP = (SOCBASEERR+62); (* Too many levels of symbolic links *)
- SOCENAMETOOLONG = (SOCBASEERR+63); (* File name too long *)
- SOCEHOSTDOWN = (SOCBASEERR+64); (* Host is down *)
- SOCEHOSTUNREACH = (SOCBASEERR+65); (* No route to host *)
- SOCENOTEMPTY = (SOCBASEERR+66); (* Directory not empty *)
-
- (*
- ** OS/2 SOCKET API errors redefined as regular BSD error constants
- *)
-
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
- IMPLEMENTATION
- (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
-
- end. { unit SockDef }
-