mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 00:08:12 +02:00
* first changes sockets units
This commit is contained in:
parent
f80bea52e9
commit
a45e1cd3f1
@ -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
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user