mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 13:59:29 +02:00
+ Winsock unit added
* PMWSock unit updated (to be less or more compitilbe with win32 winsock)
This commit is contained in:
parent
26fd8fad6b
commit
e0e20d6b67
@ -16,11 +16,13 @@
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
****************************************************************************}
|
||||
{$ifndef winsock}
|
||||
unit pmwsock;
|
||||
{$endif}
|
||||
|
||||
Interface
|
||||
|
||||
{$PACKRECORDS 1}
|
||||
{$MACRO ON}
|
||||
Interface
|
||||
|
||||
Uses OS2Def;
|
||||
|
||||
@ -28,6 +30,10 @@ Uses OS2Def;
|
||||
type
|
||||
TSocket=Cardinal;
|
||||
|
||||
type
|
||||
PLongint=^Longint;
|
||||
PCardinal=^Cardinal;
|
||||
|
||||
// Select uses arrays of TSockets. These macros manipulate such
|
||||
// arrays. FD_SETSIZE may be defined by the user before including
|
||||
// this file, but the default here should be >= 64.
|
||||
@ -37,22 +43,25 @@ type
|
||||
const
|
||||
FD_SETSIZE = 64;
|
||||
|
||||
//#pragma pack(4)
|
||||
type
|
||||
fd_set=record
|
||||
fdset=record
|
||||
fd_count: Word; // how many are SET?
|
||||
fd_array: Array[0..FD_SETSIZE-1] of TSocket; // an array of TSockets
|
||||
end;
|
||||
//#pragma pack()
|
||||
TFDSet = fdset;
|
||||
PFDSet = ^fdset;
|
||||
|
||||
Function __WSAFDIsSet(a: TSocket;var b: fd_set): Longint; cdecl;
|
||||
|
||||
Function __WSAFDIsSet(a: TSocket;var b: fdset): Longint; cdecl;
|
||||
external 'PMWSock' name '__WSAFDIsSet';
|
||||
Function __WSAFDIsSet_(s:TSocket; var FDSet:TFDSet): Longint; cdecl;
|
||||
external 'PMWSock' name '__WSAFDIsSet';
|
||||
|
||||
Function FD_ISSET(a: TSocket;var b: fd_set): Longint; cdecl;
|
||||
Function FD_ISSET(a: TSocket;var b: fdset): Longint; cdecl;
|
||||
external 'PMWSock' name '__WSAFDIsSet';
|
||||
|
||||
Procedure FD_CLR(ASocket: TSocket; var aset: fd_set);
|
||||
Procedure FDSET(ASocket: TSocket; var FDSet: fd_set);
|
||||
Procedure FD_CLR(ASocket: TSocket; var aset: fdset);
|
||||
Procedure FD_SET(Socket:TSocket; var FDSet:TFDSet);
|
||||
|
||||
// Structure used in select() call, taken from the BSD file sys/time.h.
|
||||
type
|
||||
@ -61,8 +70,21 @@ type
|
||||
tv_usec: LongInt; // and microseconds
|
||||
end;
|
||||
|
||||
TTimeVal = timeval;
|
||||
PTimeVal = ^TTimeVal;
|
||||
|
||||
{ found no reference to this type in c header files and here. AlexS }
|
||||
{ minutes west of Greenwich }
|
||||
{ type of dst correction }
|
||||
timezone = record
|
||||
tz_minuteswest : longint;
|
||||
tz_dsttime : longint;
|
||||
end;
|
||||
TTimeZone = timezone;
|
||||
PTimeZone = ^TTimeZone;
|
||||
|
||||
// Operations on timevals.
|
||||
// * NB: timercmp does not work for >= or <=.
|
||||
// timercmp does not work for >= or <=.
|
||||
|
||||
Function timerisset(tvp: timeval): Boolean;
|
||||
//Function timercmp(tvp, uvp, cmp);
|
||||
@ -83,10 +105,6 @@ const
|
||||
IOC_IN = $80000000; // copy in parameters
|
||||
IOC_INOUT = IOC_IN or IOC_OUT; // 0x20000000 distinguishes new &
|
||||
// old ioctl's
|
||||
{$define _IOR(x,y,t):=(IOC_OUT or ((Longint (sizeof(t)) and IOCPARM_MASK) shl 16) or (x shl 8) or y)}
|
||||
|
||||
{$define _IOW(x,y,t):=(IOC_IN or ((Longint(sizeof(t)) and IOCPARM_MASK) shl 16) or (x shl 8) or y)}
|
||||
|
||||
const
|
||||
// get # bytes to read
|
||||
FIONREAD=(IOC_OUT or ((Longint (sizeof(Cardinal)) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127);
|
||||
@ -118,10 +136,12 @@ type
|
||||
h_aliases: PPChar; // alias list
|
||||
h_addrtype: LongInt; // host address type
|
||||
h_length: LongInt; // length of address
|
||||
h_addr_list: PPChar; // list of addresses from name server
|
||||
{$define h_addr:=h_addr_list[0]} // address, for backward compatiblity
|
||||
case byte of
|
||||
0: (h_addr_list: ppchar); // list of addresses from name server
|
||||
1: (h_addr: ppchar) // address, for backward compatiblity
|
||||
end;
|
||||
phostent=^hostent;
|
||||
THostEnt = hostent;
|
||||
|
||||
// It is assumed here that a network number
|
||||
// fits in 32 bits.
|
||||
@ -133,13 +153,16 @@ type
|
||||
n_net: Cardinal; // network #
|
||||
End;
|
||||
pnetent=^netent;
|
||||
TNetEnt = netent;
|
||||
|
||||
type
|
||||
servent=record
|
||||
s_name: PChar; // official service name
|
||||
s_aliases: PPChar; // alias list
|
||||
s_port: LongInt; // port #
|
||||
s_proto: PChar; // protocol to use
|
||||
end;
|
||||
TServEnt = servent;
|
||||
pservent=^servent;
|
||||
|
||||
protoent=record
|
||||
@ -147,6 +170,7 @@ type
|
||||
p_aliases: PPChar; // alias list
|
||||
p_proto: LongInt; // protocol #
|
||||
end;
|
||||
TProtoEnt = protoent;
|
||||
pprotoent=^protoent;
|
||||
|
||||
// Constants and structures defined by the internet system,
|
||||
@ -222,6 +246,8 @@ type
|
||||
2:(s_un_w:record s_w1,s_w2: Word; end;);
|
||||
3:(s_addr: Cardinal);
|
||||
end;
|
||||
TInAddr = in_addr;
|
||||
PInAddr = ^TInAddr;
|
||||
|
||||
{$define s_addr:=in_addr.S_addr} // can be used for most tcp & ip code
|
||||
{$define s_host:=in_addr.S_un_b.s_b2} // host on imp
|
||||
@ -230,7 +256,6 @@ type
|
||||
{$define s_impno:=in_addr.S_un_b.s_b4} // imp #
|
||||
{$define s_lh:=in_addr.S_un_b.s_b3} // logical host
|
||||
|
||||
|
||||
// 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.
|
||||
@ -260,18 +285,28 @@ const
|
||||
// Socket address, internet style.
|
||||
|
||||
Type
|
||||
sockaddr_in=Record
|
||||
sin_family:Integer;
|
||||
sin_port:Word;
|
||||
sin_addr:in_addr;
|
||||
sin_zero:Array[0..7] of Char;
|
||||
End;
|
||||
sockaddr_in=Record
|
||||
case integer of
|
||||
0 : ( (* equals to sockaddr_in, size is 16 byte *)
|
||||
sin_family : SmallInt; (* 2 byte *)
|
||||
sin_port : Word; (* 2 byte *)
|
||||
sin_addr : TInAddr; (* 4 byte *)
|
||||
sin_zero : array[0..8-1] of char; (* 8 byte *)
|
||||
);
|
||||
1 : ((* equals to sockaddr, size is 16 byte *)
|
||||
sa_family : Smallint; (* 2 byte *)
|
||||
sa_data : array[0..14-1] of char; (* 14 byte *)
|
||||
);
|
||||
end;
|
||||
TSockAddrIn = sockaddr_in;
|
||||
PSockAddrIn = ^TSockAddrIn;
|
||||
TSockAddr = sockaddr_in;
|
||||
PSockAddr = ^TSockAddr;
|
||||
|
||||
const
|
||||
WSADESCRIPTION_LEN =256;
|
||||
WSASYS_STATUS_LEN =128;
|
||||
|
||||
//#pragma pack(4)
|
||||
Type
|
||||
WSAData=Record
|
||||
wVersion:Word;
|
||||
@ -280,19 +315,34 @@ Type
|
||||
szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
|
||||
iMaxSockets:Word;
|
||||
iMaxUdpDg:Word;
|
||||
// in OS/2 no such entry
|
||||
// pad1 : SmallInt; { 2 byte, ofs 394 } { ensure right packaging }
|
||||
lpVendorInfo:PChar;
|
||||
End;
|
||||
PWSADATA=^WSAData;
|
||||
LPWSADATA=^WSAData;
|
||||
|
||||
//#pragma pack()
|
||||
|
||||
TWSAData = WSADATA;
|
||||
|
||||
// Options for use with [gs]etsockopt at the IP level.
|
||||
|
||||
Const
|
||||
IP_OPTIONS =1; // set/get IP per-packet options
|
||||
|
||||
IP_MULTICAST_IF = 2;
|
||||
IP_MULTICAST_TTL = 3;
|
||||
IP_MULTICAST_LOOP = 4;
|
||||
IP_ADD_MEMBERSHIP = 5;
|
||||
IP_DROP_MEMBERSHIP = 6;
|
||||
IP_DEFAULT_MULTICAST_TTL = 1;
|
||||
IP_DEFAULT_MULTICAST_LOOP = 1;
|
||||
IP_MAX_MEMBERSHIPS = 20;
|
||||
|
||||
type
|
||||
ip_mreq = record
|
||||
imr_multiaddr : in_addr;
|
||||
imr_interface : in_addr;
|
||||
end;
|
||||
|
||||
// Definitions related to sockets: types, address families, options,
|
||||
// taken from the BSD file sys/socket.h.
|
||||
|
||||
@ -336,10 +386,39 @@ Const
|
||||
SO_ERROR =$1007; // get error status and clear
|
||||
SO_TYPE =$1008; // get socket type
|
||||
|
||||
{
|
||||
Options for connect and disconnect data and options. Used only by
|
||||
non-TCP/IP transports such as DECNet, OSI TP4, etc.
|
||||
}
|
||||
SO_CONNDATA = $7000;
|
||||
SO_CONNOPT = $7001;
|
||||
SO_DISCDATA = $7002;
|
||||
SO_DISCOPT = $7003;
|
||||
SO_CONNDATALEN = $7004;
|
||||
SO_CONNOPTLEN = $7005;
|
||||
SO_DISCDATALEN = $7006;
|
||||
SO_DISCOPTLEN = $7007;
|
||||
|
||||
{
|
||||
Option for opening sockets for synchronous access.
|
||||
}
|
||||
SO_OPENTYPE = $7008;
|
||||
SO_SYNCHRONOUS_ALERT = $10;
|
||||
SO_SYNCHRONOUS_NONALERT = $20;
|
||||
|
||||
{
|
||||
Other NT-specific options.
|
||||
}
|
||||
SO_MAXDG = $7009;
|
||||
SO_MAXPATHDG = $700A;
|
||||
SO_UPDATE_ACCEPT_CONTEXT = $700B;
|
||||
SO_CONNECT_TIME = $700C;
|
||||
|
||||
// TCP options.
|
||||
|
||||
Const
|
||||
TCP_NODELAY =$0001;
|
||||
TCP_NODELAY = $0001;
|
||||
TCP_BSDURGENT = $7000;
|
||||
|
||||
// Address families.
|
||||
|
||||
@ -364,7 +443,15 @@ Const
|
||||
AF_APPLETALK =16; // AppleTalk
|
||||
AF_NETBIOS =17; // NetBios-style addresses
|
||||
|
||||
AF_MAX =18;
|
||||
|
||||
{ FireFox }
|
||||
AF_FIREFOX = 19;
|
||||
{ Somebody is using this! }
|
||||
AF_UNKNOWN1 = 20;
|
||||
{ Banyan }
|
||||
AF_BAN = 21;
|
||||
|
||||
AF_MAX =22;
|
||||
|
||||
// Structure used by kernel to store most
|
||||
// addresses.
|
||||
@ -383,6 +470,9 @@ Type
|
||||
sp_protocol:Word; // protocol
|
||||
End;
|
||||
|
||||
TSockProto = sockproto;
|
||||
PSockProto = ^TSockProto;
|
||||
|
||||
|
||||
// Protocol families, same as address families for now.
|
||||
|
||||
@ -406,15 +496,21 @@ Const
|
||||
PF_HYLINK =AF_HYLINK;
|
||||
PF_APPLETALK =AF_APPLETALK;
|
||||
|
||||
PF_MAX =AF_MAX;
|
||||
PF_FIREFOX = AF_FIREFOX;
|
||||
PF_UNKNOWN1 = AF_UNKNOWN1;
|
||||
PF_BAN = AF_BAN;
|
||||
PF_MAX = AF_MAX;
|
||||
|
||||
|
||||
// Structure used for manipulating linger option.
|
||||
|
||||
Type
|
||||
linger=Record
|
||||
l_onoff:LongInt; // option on/off
|
||||
l_linger:LongInt; // linger time
|
||||
End;
|
||||
linger=Record
|
||||
l_onoff:LongInt; // option on/off
|
||||
l_linger:LongInt; // linger time
|
||||
End;
|
||||
TLinger = linger;
|
||||
PLinger = ^TLinger;
|
||||
|
||||
// Level number for (get/set)sockopt() to apply to socket itself.
|
||||
|
||||
@ -433,6 +529,7 @@ Const
|
||||
// Define constant based on rfc883, used by gethostbyxxxx() calls.
|
||||
|
||||
MAXGETHOSTSTRUCT =1024;
|
||||
MAXHOSTNAMELEN = MAXGETHOSTSTRUCT;
|
||||
|
||||
// Define flags to be used with the WSAAsyncSelect() call.
|
||||
|
||||
@ -497,6 +594,7 @@ Const
|
||||
WSAEDQUOT =(WSABASEERR+69);
|
||||
WSAESTALE =(WSABASEERR+70);
|
||||
WSAEREMOTE =(WSABASEERR+71);
|
||||
WSAEDISCON = WSABASEERR + 101;
|
||||
|
||||
// Extended Windows Sockets error constant definitions
|
||||
|
||||
@ -581,22 +679,56 @@ Const
|
||||
ESTALE =WSAESTALE;
|
||||
EREMOTE =WSAEREMOTE;
|
||||
|
||||
TF_DISCONNECT = $01;
|
||||
TF_REUSE_SOCKET = $02;
|
||||
TF_WRITE_BEHIND = $04;
|
||||
|
||||
{
|
||||
Options for use with [gs]etsockopt at the IP level.
|
||||
}
|
||||
IP_TTL = 7;
|
||||
IP_TOS = 8;
|
||||
IP_DONTFRAGMENT = 9;
|
||||
|
||||
type
|
||||
_TRANSMIT_FILE_BUFFERS = record
|
||||
Head : Pointer;
|
||||
HeadLength : Cardinal;
|
||||
Tail : Pointer;
|
||||
TailLength : Cardinal;
|
||||
end;
|
||||
TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
|
||||
TTransmitFileBuffers = _TRANSMIT_FILE_BUFFERS;
|
||||
PTransmitFileBuffers = ^TTransmitFileBuffers;
|
||||
|
||||
// Socket function prototypes
|
||||
|
||||
Function accept(s: TSocket; Var addr; Var addrlen: LongInt): TSocket; cdecl;
|
||||
external 'PMWSock' name 'accept';
|
||||
Function accept(s:TSocket; addr: PSockAddr; addrlen : PLongint) : TSocket; cdecl;
|
||||
external 'PMWSock' name 'accept';
|
||||
Function accept(s:TSocket; addr: PSockAddr; var addrlen : Longint) : TSocket; cdecl;
|
||||
external 'PMWSock' name 'accept';
|
||||
|
||||
Function bind(s: TSocket; Const addr; namelen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'bind';
|
||||
Function bind(s:TSocket; addr: PSockaddr;namelen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'bind';
|
||||
|
||||
Function closesocket(s: TSocket): LongInt; cdecl;
|
||||
external 'PMWSock' name 'closesocket';
|
||||
|
||||
Function connect(s: TSocket; Const name: sockaddr; namelen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'connect';
|
||||
Function connect(s:TSocket; addr:PSockAddr; namelen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'connect';
|
||||
|
||||
Function ioctlsocket(s: TSocket; cmd: LongInt; Var argp: Cardinal): LongInt; cdecl;
|
||||
external 'PMWSock' name 'ioctlsocket';
|
||||
Function ioctlsocket(s: TSocket; cmd: longint; var arg:longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'ioctlsocket';
|
||||
Function ioctlsocket(s: TSocket; cmd: longint; argp: PCardinal): Longint; cdecl;
|
||||
external 'PMWSock' name 'ioctlsocket';
|
||||
|
||||
Function getpeername(s: TSocket; Var name: sockaddr; Var nameLen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'getpeername';
|
||||
@ -606,6 +738,8 @@ Function getsockname(s: TSocket;Var name: sockaddr; Var namelen: LongInt): LongI
|
||||
|
||||
Function getsockopt(s: TSocket; level, optname: LongInt;Var optval; Var optlen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'getsockopt';
|
||||
Function getsockopt(s: TSocket; level: Longint; optname: Longint; optval:pchar;var optlen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'getsockopt';
|
||||
|
||||
Function htonl(hostlong: Cardinal): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'htonl';
|
||||
@ -613,11 +747,13 @@ Function htonl(hostlong: Cardinal): Cardinal; cdecl;
|
||||
Function htons(hostshort: Word): Word; cdecl;
|
||||
external 'PMWSock' name 'htons';
|
||||
|
||||
Function inet_addr(Const cp: PChar): Cardinal; cdecl;
|
||||
Function inet_addr(cp: pchar): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'inet_addr';
|
||||
|
||||
Function inet_ntoa(Var _in: in_addr): PChar; cdecl;
|
||||
external 'PMWSock' name 'inet_ntoa';
|
||||
Function inet_ntoa(i: PInAddr): pchar; cdecl;
|
||||
external 'PMWSock' name 'inet_ntoa';
|
||||
|
||||
Function listen(s: TSocket; backlog: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'listen';
|
||||
@ -630,14 +766,25 @@ Function ntohs(netshort: Word): Word; cdecl;
|
||||
|
||||
Function recv(s: TSocket;Var Buf; len, flags: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'recv';
|
||||
Function recv(s: TSocket; buf:pchar; len: Longint; flags: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'recv';
|
||||
|
||||
Function recvfrom(s: TSocket; Var Buf: PChar; len, flags:LongInt;
|
||||
Var from: sockaddr; Var fromLen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'recvfrom';
|
||||
Function recvfrom(s: TSocket; buf:pchar; len: Longint; flags: Longint;
|
||||
from: PSockAddr; fromlen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'recvfrom';
|
||||
Function recvfrom(s: TSocket; var buf; len: Longint; flags: Longint;
|
||||
Const from: TSockAddr; var fromlen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'recvfrom';
|
||||
|
||||
Function select(nfds: LongInt; Var readfds, writefds, exceptfds: fd_set;
|
||||
Function select(nfds: LongInt; Var readfds, writefds, exceptfds: fdset;
|
||||
Const timeout: timeval): LongInt; cdecl;
|
||||
external 'PMWSock' name 'select';
|
||||
Function select(nfds: Longint; readfds, writefds, exceptfds : PFDSet;
|
||||
timeout: PTimeVal): Longint; cdecl;
|
||||
external 'PMWSock' name 'select';
|
||||
|
||||
Function send(s: TSocket; Const Buf: PChar; len, flags: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'send';
|
||||
@ -645,9 +792,12 @@ Function send(s: TSocket; Const Buf: PChar; len, flags: LongInt): LongInt; cdecl
|
||||
Function sendto(s: TSocket; Const Buf: PChar; len, flags: LongInt;
|
||||
Const _to: sockaddr; tolen: LongInt): LongInt; cdecl;
|
||||
external 'PMWSock' name 'sendto';
|
||||
Function sendto(s: TSocket; buf: pchar; len: Longint; flags: Longint;
|
||||
toaddr: PSockAddr; tolen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'sendto';
|
||||
|
||||
Function setsockopt(s: TSocket; level, optname: LongInt;
|
||||
Const optval: PChar; optlen: LongInt): LongInt; cdecl;
|
||||
Function setsockopt(s: TSocket; level: Longint; optname: Longint;
|
||||
optval: pchar; optlen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'setsockopt';
|
||||
|
||||
Function shutdown(s: TSocket; how: LongInt): LongInt; cdecl;
|
||||
@ -658,25 +808,25 @@ Function socket(af, typ, protocol: LongInt): TSocket; cdecl;
|
||||
|
||||
// Database function prototypes
|
||||
|
||||
Function gethostbyaddr(Var addr: PChar; len, typ: LongInt): phostent; cdecl;
|
||||
Function gethostbyaddr(addr: pchar; len: Longint; t: Longint): PHostEnt; cdecl;
|
||||
external 'PMWSock' name 'gethostbyaddr';
|
||||
|
||||
Function gethostbyname(Const name: PChar): phostent; cdecl;
|
||||
Function gethostbyname(name: pchar): PHostEnt;stdcall; cdecl;
|
||||
external 'PMWSock' name 'gethostbyname';
|
||||
|
||||
Function gethostname(Const name: PChar; namelen: LongInt): LongInt; cdecl;
|
||||
Function gethostname(name: pchar; namelen: Longint): Longint; cdecl;
|
||||
external 'PMWSock' name 'gethostname';
|
||||
|
||||
Function getservbyport(port: LongInt;Const proto: PChar): pservent; cdecl;
|
||||
Function getservbyport(port: Longint; proto: pchar): PServEnt; cdecl;
|
||||
external 'PMWSock' name 'getservbyport';
|
||||
|
||||
Function getservbyname(Const name, proto: PChar): pservent; cdecl;
|
||||
Function getservbyname(name: pchar; proto: pchar): PServEnt; cdecl;
|
||||
external 'PMWSock' name 'getservbyname';
|
||||
|
||||
Function getprotobynumber(proto: LongInt): pprotoent; cdecl;
|
||||
external 'PMWSock' name 'getprotobynumber';
|
||||
|
||||
Function getprotobyname(Const name: PChar): pprotoent; cdecl;
|
||||
Function getprotobyname(name: pchar): PProtoEnt; cdecl;
|
||||
external 'PMWSock' name 'getprotobyname';
|
||||
|
||||
// Microsoft Windows Extension function prototypes
|
||||
@ -705,39 +855,37 @@ Function WSASetBlockingHook(lpBlockFunc: Pointer): Pointer; cdecl;
|
||||
Function WSACancelBlockingCall: LongInt; cdecl;
|
||||
external 'PMWSock' name 'WSACancelBlockingCall';
|
||||
|
||||
Function WSAAsyncGetServByName(ahWnd: HWND; wMsg: Cardinal;
|
||||
Const name, proto: PChar;
|
||||
Var Buf: PChar;
|
||||
buflen: LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetServByName(hWnd: HWND; wMsg: Cardinal;
|
||||
name: pchar; proto: pchar;
|
||||
buf: pchar;
|
||||
buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetServByName';
|
||||
|
||||
Function WSAAsyncGetServByPort(ahWnd: HWND; wMsg: Cardinal;
|
||||
port: LongInt;
|
||||
Const proto: PChar;
|
||||
Var Buf: PChar;
|
||||
buflen: LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetServByPort(hWnd: HWND; wMsg: Cardinal;
|
||||
port: Longint;
|
||||
proto: pchar; buf: pchar;
|
||||
buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetServByPort';
|
||||
|
||||
Function WSAAsyncGetProtoByName(ahWnd: HWND; wMsg: Cardinal;
|
||||
Const name: PChar;
|
||||
Var Buf: PChar;
|
||||
buflen: LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetProtoByName(hWnd: HWND; wMsg: Cardinal;
|
||||
name: pchar; buf: pchar;
|
||||
buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetProtoByName';
|
||||
|
||||
Function WSAAsyncGetProtoByNumber(ahWnd: HWND; wMsg: Cardinal;
|
||||
number:LongInt;
|
||||
Var Buf: PChar;
|
||||
buflen: LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetProtoByNumber(hWnd: HWND; wMsg: Cardinal;
|
||||
number: Longint;
|
||||
buf: pchar;
|
||||
buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetProtoByNumber';
|
||||
|
||||
Function WSAAsyncGetHostByName(ahWnd: HWND; wMsg: Cardinal;
|
||||
Const name: PChar;
|
||||
Var Buf: PChar; buflen: LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetHostByName(hWnd: HWND; wMsg: Cardinal;
|
||||
name: pchar; buf: pchar;
|
||||
buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetHostByName';
|
||||
|
||||
Function WSAAsyncGetHostByAddr(ahWnd: HWND; wMsg: Cardinal;
|
||||
Const addr: PChar; len, typ: LongInt;
|
||||
Var Buf: PChar; buflen:LongInt): Cardinal; cdecl;
|
||||
Function WSAAsyncGetHostByAddr(hWnd: HWND; wMsg: Cardinal;
|
||||
addr: pchar; len: Longint; t: Longint;
|
||||
buf: pchar; buflen: Longint): Cardinal; cdecl;
|
||||
external 'PMWSock' name 'WSAAsyncGetHostByAddr';
|
||||
|
||||
Function WSACancelAsyncRequest(hAsyncTaskHandle: Cardinal): LongInt; cdecl;
|
||||
@ -752,44 +900,67 @@ Function WSAAsyncSelect(s: TSocket; ahWnd: HWND; wMsg: Cardinal; lEvent: LongInt
|
||||
// WSAMAKEASYNCREPLY is intended for use by the Windows Sockets implementation
|
||||
// when constructing the response to a WSAAsyncGetXByY() routine.
|
||||
|
||||
(*
|
||||
#define WSAMAKEASYNCREPLY(buflen,error) MAKELONG(buflen,error)
|
||||
/*
|
||||
* WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
|
||||
* when constructing the response to WSAAsyncSelect().
|
||||
*/
|
||||
#define WSAMAKESELECTREPLY(event,error) MAKELONG(event,error)
|
||||
/*
|
||||
* WSAGETASYNCBUFLEN is intended for use by the Windows Sockets application
|
||||
* to extract the buffer length from the lParam in the response
|
||||
* to a WSAGetXByY().
|
||||
*/
|
||||
#define WSAGETASYNCBUFLEN(lParam) LOUSHORT(lParam)
|
||||
/*
|
||||
* WSAGETASYNCERROR is intended for use by the Windows Sockets application
|
||||
* to extract the error code from the lParam in the response
|
||||
* to a WSAGetXByY().
|
||||
*/
|
||||
#define WSAGETASYNCERROR(lParam) HIUSHORT(lParam)
|
||||
/*
|
||||
* WSAGETSELECTEVENT is intended for use by the Windows Sockets application
|
||||
* to extract the event code from the lParam in the response
|
||||
* to a WSAAsyncSelect().
|
||||
*/
|
||||
#define WSAGETSELECTEVENT(lParam) LOUSHORT(lParam)
|
||||
/*
|
||||
* WSAGETSELECTERROR is intended for use by the Windows Sockets application
|
||||
* to extract the error code from the lParam in the response
|
||||
* to a WSAAsyncSelect().
|
||||
*/
|
||||
#define WSAGETSELECTERROR(lParam) HIUSHORT(lParam)
|
||||
*)
|
||||
Function WSAMakeAsyncReply(Buflen,Error:Word):dword;
|
||||
// Seems to be error in rtl\win32\winsock.pp
|
||||
Function WSAMakeSyncReply(Buflen,Error:Word):dword;
|
||||
|
||||
Procedure FD_ZERO(var aset: fd_set);
|
||||
// WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
|
||||
// when constructing the response to WSAAsyncSelect().
|
||||
|
||||
Function WSAMakeSelectReply(Event,Error:Word):dword;
|
||||
|
||||
// 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(Param:dword):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(Param:dword):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(Param:dword):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(Param:dword):Word;
|
||||
|
||||
Procedure FD_ZERO(var aset: fdset);
|
||||
|
||||
// Following functions not found in PMWSock
|
||||
{
|
||||
function WSARecvEx(s:TSocket;var buf; len:tOS_INT; flags:ptOS_INT):tOS_INT;stdcall;
|
||||
external winsockdll name 'WSARecvEx';
|
||||
function TransmitFile(hSocket:TSocket; hFile:THandle; nNumberOfBytesToWrite:dword;
|
||||
nNumberOfBytesPerSend:DWORD; lpOverlapped:POverlapped;
|
||||
lpTransmitBuffers:PTransmitFileBuffers; dwReserved:dword):Bool;stdcall;
|
||||
external winsockdll name 'TransmitFile';
|
||||
|
||||
function AcceptEx(sListenSocket,sAcceptSocket:TSocket;
|
||||
lpOutputBuffer:Pointer; dwReceiveDataLength,dwLocalAddressLength,
|
||||
dwRemoteAddressLength:dword; var lpdwBytesReceived:dword;
|
||||
lpOverlapped:POverlapped):Bool;stdcall;
|
||||
external winsockdll name 'AcceptEx';
|
||||
|
||||
procedure GetAcceptExSockaddrs(lpOutputBuffer:Pointer;
|
||||
dwReceiveDataLength,dwLocalAddressLength,dwRemoteAddressLength:dword;
|
||||
var LocalSockaddr:TSockAddr; var LocalSockaddrLength:tOS_INT;
|
||||
var RemoteSockaddr:TSockAddr; var RemoteSockaddrLength:tOS_INT);stdcall;
|
||||
external winsockdll name 'GetAcceptExSockaddrs';
|
||||
}
|
||||
|
||||
Implementation
|
||||
|
||||
Procedure FD_CLR(ASocket: TSocket; var aset: fd_set);
|
||||
Procedure FD_CLR(ASocket: TSocket; var aset: fdset);
|
||||
var
|
||||
I: Cardinal;
|
||||
begin
|
||||
@ -808,20 +979,60 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure FD_ZERO(var aset: fd_set);
|
||||
Procedure FD_ZERO(var aset: fdset);
|
||||
Begin
|
||||
aset.fd_count:=0;
|
||||
End;
|
||||
|
||||
procedure FDSET(ASocket: TSocket; var FDSet: fd_set);
|
||||
procedure FD_SET(Socket: TSocket; var FDSet: tfdset);
|
||||
begin
|
||||
if FDSet.fd_count < FD_SETSIZE then
|
||||
begin
|
||||
FDSet.fd_array[FDSet.fd_count] := ASocket;
|
||||
FDSet.fd_array[FDSet.fd_count] := Socket;
|
||||
Inc(FDSet.fd_count);
|
||||
end;
|
||||
end;
|
||||
|
||||
Function MAKELONG(a,b : longint) : LONGINT;
|
||||
begin
|
||||
MAKELONG:=LONGINT((WORD(a)) or ((CARDINAL(WORD(b))) shl 16));
|
||||
end;
|
||||
|
||||
Function WSAMakeAsyncReply(Buflen,Error:Word):dword;
|
||||
begin
|
||||
WSAMakeAsyncReply:=MakeLong(Buflen, Error);
|
||||
end;
|
||||
|
||||
Function WSAMakeSyncReply(Buflen,Error:Word):dword;
|
||||
begin
|
||||
WSAMakeSyncReply:=WSAMakeAsyncReply(Buflen,Error);
|
||||
end;
|
||||
|
||||
Function WSAMakeSelectReply(Event,Error:Word):dword;
|
||||
begin
|
||||
WSAMakeSelectReply:=MakeLong(Event,Error);
|
||||
end;
|
||||
|
||||
Function WSAGetAsyncBuflen(Param:dword):Word;
|
||||
begin
|
||||
WSAGetAsyncBuflen:=lo(Param);
|
||||
end;
|
||||
|
||||
Function WSAGetAsyncError(Param:dword):Word;
|
||||
begin
|
||||
WSAGetAsyncError:=hi(Param);
|
||||
end;
|
||||
|
||||
Function WSAGetSelectEvent(Param:dword):Word;
|
||||
begin
|
||||
WSAGetSelectEvent:=lo(Param);
|
||||
end;
|
||||
|
||||
Function WSAGetSelectError(Param:dword):Word;
|
||||
begin
|
||||
WSAGetSelectError:=hi(Param);
|
||||
end;
|
||||
|
||||
Function timerisset(tvp: timeval): Boolean;
|
||||
Begin
|
||||
TimerIsSet:=Boolean(tvp.tv_sec or tvp.tv_usec);
|
||||
@ -845,7 +1056,11 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 2003-04-04 12:02:21 yuri
|
||||
Revision 1.2 2003-08-15 10:53:43 yuri
|
||||
+ Winsock unit added
|
||||
* PMWSock unit updated (to be less or more compitilbe with win32 winsock)
|
||||
|
||||
Revision 1.1 2003/04/04 12:02:21 yuri
|
||||
+ Initial import
|
||||
|
||||
}
|
||||
|
29
rtl/os2/winsock.pas
Normal file
29
rtl/os2/winsock.pas
Normal file
@ -0,0 +1,29 @@
|
||||
{****************************************************************************
|
||||
|
||||
$Id$
|
||||
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyrigth (c) 2003 by Yuri Prokushev (prokushev@freemail.ru)
|
||||
|
||||
This file corresponds to version 1.1 of the Windows Sockets
|
||||
specification.
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
****************************************************************************}
|
||||
unit winsock;
|
||||
{$define winsock}
|
||||
{$i pmwsock.pas}
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 2003-08-15 10:53:43 yuri
|
||||
+ Winsock unit added
|
||||
* PMWSock unit updated (to be less or more compitilbe with win32 winsock)
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user