From a45e1cd3f15fb5336c361bd183ce71a09f702e82 Mon Sep 17 00:00:00 2001 From: marco Date: Tue, 16 Mar 2004 18:03:37 +0000 Subject: [PATCH] * first changes sockets units --- rtl/freebsd/unixsock.inc | 202 +++++++----------------- rtl/freebsd/unxsockh.inc | 36 ++++- rtl/inc/socketsh.inc | 172 ++++++++------------- rtl/linux/unixsock.inc | 234 +++++++--------------------- rtl/linux/unxsockh.inc | 51 ++++++- rtl/unix/sockets.pp | 138 ++++------------- rtl/win32/sockets.pp | 323 +++++++++++++++++++++++++-------------- 7 files changed, 495 insertions(+), 661 deletions(-) diff --git a/rtl/freebsd/unixsock.inc b/rtl/freebsd/unixsock.inc index 177fd2112d..50fb08fbce 100644 --- a/rtl/freebsd/unixsock.inc +++ b/rtl/freebsd/unixsock.inc @@ -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 diff --git a/rtl/freebsd/unxsockh.inc b/rtl/freebsd/unxsockh.inc index 27653bd9a2..b08a8645b2 100644 --- a/rtl/freebsd/unxsockh.inc +++ b/rtl/freebsd/unxsockh.inc @@ -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 } diff --git a/rtl/inc/socketsh.inc b/rtl/inc/socketsh.inc index 3a060ee996..249d53ef12 100644 --- a/rtl/inc/socketsh.inc +++ b/rtl/inc/socketsh.inc @@ -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 diff --git a/rtl/linux/unixsock.inc b/rtl/linux/unixsock.inc index 0a02e64f0e..23556630ef 100644 --- a/rtl/linux/unixsock.inc +++ b/rtl/linux/unixsock.inc @@ -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 } diff --git a/rtl/linux/unxsockh.inc b/rtl/linux/unxsockh.inc index ef1685903c..b89dc9b08b 100644 --- a/rtl/linux/unxsockh.inc +++ b/rtl/linux/unxsockh.inc @@ -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 } \ No newline at end of file diff --git a/rtl/unix/sockets.pp b/rtl/unix/sockets.pp index 1bc2877d86..1420a6a44f 100644 --- a/rtl/unix/sockets.pp +++ b/rtl/unix/sockets.pp @@ -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 diff --git a/rtl/win32/sockets.pp b/rtl/win32/sockets.pp index 085a722860..9c77c4f427 100644 --- a/rtl/win32/sockets.pp +++ b/rtl/win32/sockets.pp @@ -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