* first changes sockets units

This commit is contained in:
marco 2004-03-16 18:03:37 +00:00
parent f80bea52e9
commit a45e1cd3f1
7 changed files with 495 additions and 661 deletions

View File

@ -14,205 +14,107 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{******************************************************************************
Basic Socket Functions
******************************************************************************}
Function socket(Domain,SocketType,Protocol:Longint):Longint;
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
Begin
fpSocket:=Do_Syscall(syscall_nr_socket,Domain,xtype,Protocol);
socketerror:=fpgeterrno;
End;
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
begin
Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
socketerror:=fpgeterrno;
end;
Function CloseSocket (Sock:Longint):Longint;
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
begin
if fpclose(Sock)=0 then
CloseSocket := 0 else
CloseSocket := -1;
fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
socketerror:=fpgeterrno;
end;
Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
begin
Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
socketerror:=fpgeterrno;
end;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
begin
Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
socketerror:=fpgeterrno;
end;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
begin
Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
socketerror:=fpgeterrno;
end;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
function fplisten (s:cint; backlog : cint):cint;
begin
RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
socketerror:=fpgeterrno;
end;
Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
socketerror:=fpgeterrno;
end;
Function Listen(Sock,MaxConnect:Longint):Boolean;
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
begin
Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
socketerror:=fpgeterrno;
end;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpshutdown (s:cint; how:cint):cint;
begin
Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
If Accept<0 Then
Accept:=-1;
fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
socketerror:=fpgeterrno;
end;
Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
socketerror:=fpgeterrno;
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
socketerror:=fpgeterrno;
end;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
begin
GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,optname,TSysParam(optval),optlen);
socketerror:=fpgeterrno;
end;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
begin
GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
socketerror:=fpgeterrno;
end;
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
end;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
begin
GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
end;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
begin
SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
end;
{******************************************************************************
UnixSock
******************************************************************************}
Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
begin
Move(Addr[1],t.Path,length(Addr));
t.Family:=AF_UNIX;
t.Path[length(Addr)]:=#0;
Len:=Length(Addr)+3;
end;
Function Bind(Sock:longint;const addr:string):boolean;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
Str2UnixSockAddr(addr,UnixAddr,AddrLen);
Bind(Sock,UnixAddr,AddrLen);
Bind:=(SocketError=0);
end;
Function DoAccept(Sock:longint;var addr:string):longint;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
AddrLen:=length(addr)+3;
DoAccept:=Accept(Sock,UnixAddr,AddrLen);
Move(UnixAddr.Path,Addr[1],AddrLen);
SetLength(Addr,AddrLen);
end;
Function DoConnect(Sock:longint;const addr:string):Boolean;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
Str2UnixSockAddr(addr,UnixAddr,AddrLen);
DoConnect:=Connect(Sock,UnixAddr,AddrLen);
end;
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
var
s : longint;
begin
S:=DoAccept(Sock,addr);
if S>0 then
begin
Sock2Text(S,SockIn,SockOut);
Accept:=true;
end
else
Accept:=false;
end;
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
var
s : longint;
begin
S:=DoAccept(Sock,addr);
if S>0 then
begin
Sock2File(S,SockIn,SockOut);
Accept:=true;
end
else
Accept:=false;
end;
Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
begin
Connect:=DoConnect(Sock,addr);
If Connect then
Sock2Text(Sock,SockIn,SockOut);
end;
Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
begin
Connect:=DoConnect(Sock,addr);
if Connect then
Sock2File(Sock,SockIn,SockOut);
fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
socketerror:=fpgeterrno;
end;
{
$Log$
Revision 1.9 2004-01-03 12:18:29 marco
Revision 1.10 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.9 2004/01/03 12:18:29 marco
* a lot of copyright notices and CVS logs added and fixed
Revision 1.8 2003/09/15 07:09:58 marco

View File

@ -38,9 +38,43 @@ Const
PF_MAX = AF_MAX;
SOL_SOCKET = $FFFF;
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_REUSEPORT =$0200; { allow local address & port reuse }
SO_TIMESTAMP =$0400; { timestamp received dgram traffic }
{
* 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 }
SHUT_RD =0; { shut down the reading side }
SHUT_WR =1; { shut down the writing side }
SHUT_RDWR =2; { shut down both sides }
{
$Log$
Revision 1.1 2004-03-09 19:40:52 marco
Revision 1.2 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.1 2004/03/09 19:40:52 marco
* header for sockets unit
}

View File

@ -11,6 +11,18 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$ifdef FreeBSD}
{$DEFINE SOCK_HAS_SINLEN} // BSD definition of scoketaddr
{$endif}
Type
{$ifdef SOCK_HAS_SINLEN}
sa_family_t=cuchar;
{$else}
sa_family_t=cushort;
{$endif}
Const
{ Socket types }
SOCK_STREAM = 1; { stream (connection) socket }
@ -52,111 +64,35 @@ Const
MSG_NOSIGNAL = $4000; { Do not generate SIGPIPE }
MSG_MORE = $8000; { Sender will send more }
{$Ifdef Unix}
{$ifndef BSD}
{ For setsockoptions(2) }
SOL_SOCKET = 1;
SO_DEBUG = 1;
SO_REUSEADDR= 2;
SO_TYPE = 3;
SO_ERROR = 4;
SO_DONTROUTE= 5;
SO_BROADCAST= 6;
SO_SNDBUF = 7;
SO_RCVBUF = 8;
SO_KEEPALIVE= 9;
SO_OOBINLINE= 10;
SO_NO_CHECK = 11;
SO_PRIORITY = 12;
SO_LINGER = 13;
SO_BSDCOMPAT= 14;
{ To add : SO_REUSEPORT 15 }
SO_PASSCRED= 16;
SO_PEERCRED= 17;
SO_RCVLOWAT= 18;
SO_SNDLOWAT= 19;
SO_RCVTIMEO= 20;
SO_SNDTIMEO= 21;
{ Security levels - as per NRL IPv6 - don't actually do anything }
SO_SECURITY_AUTHENTICATION = 22;
SO_SECURITY_ENCRYPTION_TRANSPORT= 23;
SO_SECURITY_ENCRYPTION_NETWORK = 24;
SO_BINDTODEVICE= 25;
{ Socket filtering }
SO_ATTACH_FILTER= 26;
SO_DETACH_FILTER= 27;
SO_PEERNAME = 28;
SO_TIMESTAMP = 29;
SCM_TIMESTAMP = SO_TIMESTAMP;
SO_ACCEPTCONN = 30;
SHUT_RD =0; { shut down the reading side }
SHUT_WR =1; { shut down the writing side }
SHUT_RDWR =2; { shut down both sides }
{$ELSE}
SOL_SOCKET = $FFFF;
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_REUSEPORT =$0200; { allow local address & port reuse }
SO_TIMESTAMP =$0400; { timestamp received dgram traffic }
{
* 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 }
SHUT_RD =0; { shut down the reading side }
SHUT_WR =1; { shut down the writing side }
SHUT_RDWR =2; { shut down both sides }
{$endif}
{$ENDIF}
const
{ Two constants to determine whether part of soket is for in or output }
S_IN = 0;
S_OUT = 1;
Type
in_addr = packed record
s_addr : cuint32; // inaddr_t=cuint32
end;
TSockAddr = packed Record
{$ifdef BSD}
len : byte;
family:byte;
{$ELSE}
family:word; { was byte, fixed }
{$ENDIF}
data :array [0..13] of char;
{$ifdef SOCK_HAS_SINLEN}
sa_len : cuchar;
{$endif}
sa_family : sa_family_t;
sa_data : array [0..13] of char;
end;
pSockAddr = ^TSockAddr;
TInetSockAddr = packed Record
family:Word;
port :Word;
addr :Cardinal;
pad :array [1..8] of byte; { to get to the size of sockaddr... }
{$ifdef SOCK_HAS_SINLEN}
sin_len : cuchar;
{$endif}
sin_family : sa_family_t;
sin_port : cushort;
sin_addr : in_addr;
pad : array [0..7] of char; { to get to the size of sockaddr... }
end;
pInetSockAddr = ^TInetSockAddr;
Tin6_addr = packed record
case byte of
@ -168,26 +104,43 @@ Type
5: (s6_addr16 : array[0..7] of smallint);
6: (s6_addr32 : array[0..3] of LongInt);
end;
pIn6_Addr=^TIn6_addr;
TInetSockAddr6 = packed Record
{$ifdef BSD} // as per RFC 2553
sin6_len : byte;
sin6_family: byte;
{$ELSE}
sin6_family: word;
{$ENDIF}
sin6_port : Word;
sin6_flowinfo : LongInt;
{$ifdef SOCKET_HAS_SINLEN} // as per RFC 2553
sin6_len : byte;
{$endif}
sin6_family : sa_family_t;
sin6_port : cuint16;
sin6_flowinfo : cuint32;
sin6_addr : Tin6_addr;
sin6_scope_id : LongInt;
sin6_scope_id : cuint32;
end;
sockaddr_in6 = TInetSockAddr6;
psockaddr_in6 = ^sockaddr_in6;
TSockArray = Array[1..2] of Longint;
TSockPairArray = Array[0..1] of Longint;
TSockArray = Array[1..2] of Longint; //legacy
Var
SocketError:Longint;
SocketError:cint;
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint; maybelibc
function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t; maybelibc
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; maybelibc
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; maybelibc
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; maybelibc
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; maybelibc
function fplisten (s:cint; backlog : cint):cint; maybelibc
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; maybelibc
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint; maybelibc
function fpshutdown (s:cint; how:cint):cint; maybelibc
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint; maybelibc
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint; maybelibc
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; maybelibc
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint; maybelibc
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; maybelibc
{Basic Socket Functions}
Function Socket(Domain,SocketType,Protocol:Longint):Longint;
@ -195,7 +148,7 @@ Function CloseSocket(Sock:Longint):Longint;
Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
Function Listen (Sock,MaxConnect:Longint):Boolean;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
@ -203,7 +156,7 @@ Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):boolean;
Function Shutdown(Sock:Longint;How:Longint):Longint;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
Function SetSocketOptions(Sock,Level,OptName:Longint;const OptVal;optlen:longint):Longint;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
@ -221,7 +174,10 @@ Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:file):
{
$Log$
Revision 1.12 2003-11-23 11:00:07 michael
Revision 1.13 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.12 2003/11/23 11:00:07 michael
+ Added IPV6 patch from Johannes Berg
Revision 1.11 2003/11/22 16:28:56 michael

View File

@ -1,17 +1,22 @@
{
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 2000 by Marco van de Voort
member of the Free Pascal development team.
(c) 2004 by Marco van de Voort
member of the Free Pascal development team.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
socket call implementations for Linux
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.
}
**********************************************************************}
{******************************************************************************
Basic Socket Functions
******************************************************************************}
Const
{
@ -42,7 +47,6 @@ Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
var
Args:array[1..6] of longint;
begin
{$IFNDEF BSD}
args[1]:=a1;
args[2]:=a2;
args[3]:=a3;
@ -54,9 +58,6 @@ begin
SocketError:=fpgetErrno
else
SocketError:=0;
{$ELSE}
SocketError:=-1;
{$ENDIF}
end;
@ -65,225 +66,100 @@ begin
SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
end;
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
Begin
fpSocket:=Do_Syscall(Socket_Sys_socket,Domain,xtype,Protocol);
End;
{******************************************************************************
Basic Socket Functions
******************************************************************************}
Function socket(Domain,SocketType,Protocol:Longint):Longint;
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
begin
Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
end;
Function CloseSocket (Sock:Longint):Longint;
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
begin
if fpClose(Sock)=0 then
CloseSocket := 0 else
CloseSocket := -1;
fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
end;
Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
begin
Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Buf),BufLen,Flags,0,0);
fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
end;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
begin
Sendto:=SocketCall(Socket_Sys_SendTo,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
end;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
begin
Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Buf),BufLen,Flags,0,0);
fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
end;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
function fplisten (s:cint; backlog : cint):cint;
begin
RecvFrom:=SocketCall(Socket_Sys_Recv,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
end;
Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
end;
Function Listen(Sock,MaxConnect:Longint):Boolean;
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
begin
Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
end;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpshutdown (s:cint; how:cint):cint;
begin
Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
If Accept<0 Then
Accept:=-1;
fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
end;
Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
end;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
begin
GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,optname,TSysParam(optval),optlen,0,0);
end;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
begin
GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
fpGetSockOpt:=SocketCall(Socket_Sys_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen),0);
end;
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
end;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
begin
GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
end;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
begin
SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
end;
{******************************************************************************
UnixSock
******************************************************************************}
Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
begin
Move(Addr[1],t.Path,length(Addr));
t.Family:=AF_UNIX;
t.Path[length(Addr)]:=#0;
Len:=Length(Addr)+3;
end;
Function Bind(Sock:longint;const addr:string):boolean;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
Str2UnixSockAddr(addr,UnixAddr,AddrLen);
Bind(Sock,UnixAddr,AddrLen);
Bind:=(SocketError=0);
end;
Function DoAccept(Sock:longint;var addr:string):longint;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
AddrLen:=length(addr)+3;
DoAccept:=Accept(Sock,UnixAddr,AddrLen);
Move(UnixAddr.Path,Addr[1],AddrLen);
SetLength(Addr,AddrLen);
end;
Function DoConnect(Sock:longint;const addr:string):Boolean;
var
UnixAddr : TUnixSockAddr;
AddrLen : longint;
begin
Str2UnixSockAddr(addr,UnixAddr,AddrLen);
DoConnect:=Connect(Sock,UnixAddr,AddrLen);
end;
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
var
s : longint;
begin
S:=DoAccept(Sock,addr);
if S>0 then
begin
Sock2Text(S,SockIn,SockOut);
Accept:=true;
end
else
Accept:=false;
end;
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
var
s : longint;
begin
S:=DoAccept(Sock,addr);
if S>0 then
begin
Sock2File(S,SockIn,SockOut);
Accept:=true;
end
else
Accept:=false;
end;
Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
begin
Connect:=DoConnect(Sock,addr);
If Connect then
Sock2Text(Sock,SockIn,SockOut);
end;
Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
begin
Connect:=DoConnect(Sock,addr);
if Connect then
Sock2File(Sock,SockIn,SockOut);
fpSocketPair:=SocketCall(Socket_Sys_SocketPair,d,xtype,protocol,TSysParam(sv),0,0);
end;
{
$Log$
Revision 1.9 2004-02-06 23:06:16 florian
- killed tsyscallregs
$Log$
Revision 1.10 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.8 2003/09/14 20:15:01 marco
* Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
Revision 1.9 2004/01/03 12:18:29 marco
* a lot of copyright notices and CVS logs added and fixed
Revision 1.7 2003/03/23 17:47:15 armin
* CloseSocket added
Revision 1.8 2003/09/15 07:09:58 marco
* small fixes, round 1
Revision 1.6 2002/09/07 16:01:20 peter
* old logs removed and tabs fixed
Revision 1.7 2003/03/23 17:47:15 armin
* CloseSocket added
Revision 1.5 2002/02/04 21:29:34 michael
+ merged missing sendto/rcvfrom functions
Revision 1.6 2002/09/07 16:01:18 peter
* old logs removed and tabs fixed
Revision 1.5 2002/02/05 07:54:34 marco
* Fixed typo
}

View File

@ -89,9 +89,58 @@ Const
PF_NETGRAPH =AF_NETGRAPH;
PF_MAX =AF_MAX;
{ For setsockoptions(2) }
SOL_SOCKET = 1;
SO_DEBUG = 1;
SO_REUSEADDR= 2;
SO_TYPE = 3;
SO_ERROR = 4;
SO_DONTROUTE= 5;
SO_BROADCAST= 6;
SO_SNDBUF = 7;
SO_RCVBUF = 8;
SO_KEEPALIVE= 9;
SO_OOBINLINE= 10;
SO_NO_CHECK = 11;
SO_PRIORITY = 12;
SO_LINGER = 13;
SO_BSDCOMPAT= 14;
{ To add : SO_REUSEPORT 15 }
SO_PASSCRED= 16;
SO_PEERCRED= 17;
SO_RCVLOWAT= 18;
SO_SNDLOWAT= 19;
SO_RCVTIMEO= 20;
SO_SNDTIMEO= 21;
{ Security levels - as per NRL IPv6 - don't actually do anything }
SO_SECURITY_AUTHENTICATION = 22;
SO_SECURITY_ENCRYPTION_TRANSPORT= 23;
SO_SECURITY_ENCRYPTION_NETWORK = 24;
SO_BINDTODEVICE= 25;
{ Socket filtering }
SO_ATTACH_FILTER= 26;
SO_DETACH_FILTER= 27;
SO_PEERNAME = 28;
SO_TIMESTAMP = 29;
SCM_TIMESTAMP = SO_TIMESTAMP;
SO_ACCEPTCONN = 30;
SHUT_RD =0; { shut down the reading side }
SHUT_WR =1; { shut down the writing side }
SHUT_RDWR =2; { shut down both sides }
{
$Log$
Revision 1.1 2004-03-09 19:41:31 marco
Revision 1.2 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.1 2004/03/09 19:41:31 marco
* header for sockets unit
}

View File

@ -14,115 +14,30 @@
unit Sockets;
Interface
const
{$Ifndef BSD}
{ Adress families, Linux specific }
AF_AX25 = 3; { Amateur Radio AX.25 }
AF_IPX = 4; { Novell IPX }
AF_APPLETALK = 5; { Appletalk DDP }
AF_NETROM = 6; { Amateur radio NetROM }
AF_BRIDGE = 7; { Multiprotocol bridge }
AF_AAL5 = 8; { Reserved for Werner's ATM }
AF_X25 = 9; { Reserved for X.25 project }
AF_INET6 = 10; { IP version 6 }
AF_MAX = 12;
{$ifdef Unix}
Uses UnixType;
{$endif}
SOCK_PACKET = 10;
{$macro on}
{$DEFINE FPC_NEW_SOCKETS_UNIT}
{$ifdef FPC_USE_LIBC}
{ define maybelibc:=cdecl;external;} // in future. Have to wrap now
{$endif} // because of !@$!@#% socketerror
PF_AX25 = AF_AX25;
PF_IPX = AF_IPX;
PF_APPLETALK = AF_APPLETALK;
PF_NETROM = AF_NETROM;
PF_BRIDGE = AF_BRIDGE;
PF_AAL5 = AF_AAL5;
PF_X25 = AF_X25;
PF_INET6 = AF_INET6;
{$define maybelibc:=}
PF_MAX = AF_MAX;
{$ELSE}
{BSD}
// AF_LOCAL =1; { local to host (pipes, portals) }
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_ISO =7; { ISO protocols }
AF_OSI =AF_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; { DEC Direct data link interface }
AF_LAT =14; { LAT }
AF_HYLINK =15; { NSC Hyperchannel }
AF_APPLETALK =16; { Apple Talk }
AF_ROUTE =17; { Internal Routing Protocol }
AF_LINK =18; { Link layer interface }
pseudo_AF_XTP =19; { eXpress Transfer Protocol (no AF) }
AF_COIP =20; { connection-oriented IP, aka ST II }
AF_CNT =21; { Computer Network Technology }
pseudo_AF_RTIP =22; { Help Identify RTIP packets }
AF_IPX =23; { Novell Internet Protocol }
AF_SIP =24; { Simple Internet Protocol }
pseudo_AF_PIP =25; { Help Identify PIP packets }
AF_ISDN =26; { Integrated Services Digital Network}
AF_E164 =AF_ISDN; { CCITT E.164 recommendation }
pseudo_AF_KEY =27; { Internal key-management function }
AF_INET6 =28; { IPv6 }
AF_NATM =29; { native ATM access }
AF_ATM =30; { ATM }
pseudo_AF_HDRCMPLT=31; { Used by BPF to not rewrite headers
in interface output routine}
AF_NETGRAPH =32; { Netgraph sockets }
AF_MAX =33;
SOCK_MAXADDRLEN =255; { longest possible addresses }
{
* Protocol families, same as address families for now.
}
// PF_LOCAL =AF_LOCAL;
PF_IMPLINK =AF_IMPLINK;
PF_PUP =AF_PUP;
PF_CHAOS =AF_CHAOS;
PF_NS =AF_NS;
PF_ISO =AF_ISO;
PF_OSI =AF_ISO;
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_ROUTE =AF_ROUTE;
PF_LINK =AF_LINK;
PF_XTP =pseudo_AF_XTP; { really just proto family, no AF }
PF_COIP =AF_COIP;
PF_CNT =AF_CNT;
PF_SIP =AF_SIP;
PF_IPX =AF_IPX; { same format as AF_NS }
PF_RTIP =pseudo_AF_RTIP; { same format as AF_INET }
PF_PIP =pseudo_AF_PIP;
PF_ISDN =AF_ISDN;
PF_KEY =pseudo_AF_KEY;
PF_INET6 =AF_INET6;
PF_NATM =AF_NATM;
PF_ATM =AF_ATM;
PF_NETGRAPH =AF_NETGRAPH;
PF_MAX =AF_MAX;
{$ENDIF}
{$i unxsockh.inc}
{$i socketsh.inc}
type
TUnixSockAddr = packed Record
family:word; { was byte, fixed }
path:array[0..107] of char;
end;
{$ifdef SOCK_HAS_SINLEN}
sa_len : cuchar;
{$endif}
family : sa_family_t;
path:array[0..107] of char; //104 total for freebsd.
end;
{$i socketsh.inc}
{ unix socket specific functions }
Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
@ -132,9 +47,13 @@ Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
//function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; maybelibc
//function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; maybelibc
//function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint; maybelibc
Implementation
Uses BaseUnix,SysCall;
Uses BaseUnix,{$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
{ Include filerec and textrec structures }
{$i filerec.inc}
@ -143,15 +62,22 @@ Uses BaseUnix,SysCall;
Kernel Socket Callings
******************************************************************************}
{$I unixsock.inc}
{$ifndef FPC_USE_LIBC}
{$i unixsock.inc}
{$else}
{$i stdsock.inc}
{$endif}
{$i sockovl.inc}
{$i sockets.inc}
end.
{
$Log$
Revision 1.8 2003-11-25 15:13:28 marco
Revision 1.9 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.8 2003/11/25 15:13:28 marco
* somebody added fields to socketsh.inc that were already under ifdef bsd
Revision 1.7 2003/09/14 20:15:01 marco

View File

@ -16,9 +16,24 @@ unit Sockets;
Interface
{$macro on}
{$define maybelibc:=}
Uses
windows,winsock;
Type
cushort=word;
cuint16=word;
cuint32=cardinal;
size_t =cuint32;
ssize_t=cuint16;
cint =longint;
pcint =^cint;
tsocklen=cint;
psocklen=^tsocklen;
Const
AF_MAX = WinSock.AF_MAX;
PF_MAX = AF_MAX;
@ -35,15 +50,178 @@ Implementation
Basic Socket Functions
******************************************************************************}
Function socket(Domain,SocketType,Protocol:Longint):Longint;
//function fprecvmsg (s:cint; msg: pmsghdr; flags:cint):ssize_t;
//function fpsendmsg (s:cint; hdr: pmsghdr; flags:cint):ssize;
//function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
begin
Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
if Socket<0 then
fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
if fpSocket<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
begin
fpSend:=WinSock.Send(S,msg,len,flags);
if fpSend<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
begin
// Dubious construct, this should be checked. (IPV6 fails ?)
fpSendTo:=WinSock.SendTo(S,msg,Len,Flags,Winsock.TSockAddr(tox^),toLen);
if fpSendTo<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
begin
fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
if fpRecv<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
begin
fpRecvFrom:=WinSock.RecvFrom(S,Buf,Len,Flags,Winsock.TSockAddr(from^),FromLen^);
if fpRecvFrom<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
begin
fpConnect:=WinSock.Connect(S,WinSock.TSockAddr(name^),nameLen);
if fpConnect<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpshutdown (s:cint; how:cint):cint;
begin
fpShutDown:=WinSock.ShutDown(S,How);
if fpShutDown<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function socket(Domain,SocketType,Protocol:Longint):Longint;
begin
socket:=fpsocket(Domain,sockettype,protocol);
end;
Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
begin
send:=fpsend(sock,@buf,buflen,flags);
end;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
begin
sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
end;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
begin
Recv:=fpRecv(Sock,@Buf,BufLen,Flags);
end;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longint) : longint;
begin
RecvFrom:=fpRecvFrom(Sock,@Buf,BufLen,Flags,@Addr,@AddrLen);
end;
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
begin
fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
if fpbind<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fplisten (s:cint; backlog : cint):cint;
begin
fplisten:=WinSock.Listen(S,backlog);
if fplisten<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(@AddrLen));
if fpAccept<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
if fpGetSockName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
if fpGetPeerName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
begin
fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
if fpGetSockOpt<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
begin
fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
if fpSetSockOpt<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
begin
end;
Function CloseSocket(Sock:Longint):Longint;
var i : longint;
begin
@ -55,154 +233,64 @@ begin
end else
begin
CloseSocket := 0;
SocketError := 0;
SocketError := 0;
end;
end;
Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
begin
Send:=WinSock.Send(Sock,Buf,BufLen,Flags);
if Send<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
begin
// Dubious construct, this should be checked.
SendTo:=WinSock.SendTo(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
if SendTo<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
begin
Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
if Recv<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
begin
RecvFrom:=WinSock.RecvFrom(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
if RecvFrom<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
if l<0 then
begin
SocketError:=WSAGetLastError;
Bind:=false;
end
else
begin
SocketError:=0;
Bind:=true;
end;
bind:=fpBind(Sock,@Addr,AddrLen)=0;
end;
Function Listen(Sock,MaxConnect:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Listen(Sock,MaxConnect);
if l<0 then
begin
SocketError:=WSAGetLastError;
Listen:=false;
end
else
begin
SocketError:=0;
Listen:=true;
end;
Listen:=fplisten(Sock,MaxConnect)=0;
end;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
if Accept<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
Accept:=FPAccept(sock,@addr,@addrlen);
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
begin
shutdown:=fpshutdown(sock,how);
end;
Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
begin
Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
if not Connect then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
begin
ShutDown:=WinSock.ShutDown(Sock,How);
if ShutDown<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
connect:=fpconnect(sock,@addr,addrlen)=0;
end;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetSocketName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
end;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetPeerName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
if SetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
GetPeerName:=fpGetPeerName(Sock,@addr,@addrlen);
end;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
begin
GetSocketOptions:=WinSock.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
if GetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
GetSocketOptions:=fpGetSockOpt(sock,level,optname,@optval,@optlen);
end;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
end;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
begin
// SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
// SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);a
end;
@ -301,7 +389,10 @@ finalization
end.
{
$Log$
Revision 1.12 2003-09-17 15:06:36 peter
Revision 1.13 2004-03-16 18:03:37 marco
* first changes sockets units
Revision 1.12 2003/09/17 15:06:36 peter
* stdcall patch
Revision 1.11 2003/03/23 17:47:15 armin