瀏覽代碼

* first changes sockets units

marco 21 年之前
父節點
當前提交
a45e1cd3f1
共有 7 個文件被更改,包括 461 次插入627 次删除
  1. 51 149
      rtl/freebsd/unixsock.inc
  2. 35 1
      rtl/freebsd/unxsockh.inc
  3. 64 108
      rtl/inc/socketsh.inc
  4. 55 179
      rtl/linux/unixsock.inc
  5. 50 1
      rtl/linux/unxsockh.inc
  6. 34 108
      rtl/unix/sockets.pp
  7. 172 81
      rtl/win32/sockets.pp

+ 51 - 149
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;
-begin
-  Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
-end;
-
-Function CloseSocket (Sock:Longint):Longint;
-begin
-  if fpclose(Sock)=0 then
-    CloseSocket := 0 else
-    CloseSocket := -1;
-end;
-
-Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
-begin
-  Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
-end;
-
-Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
-begin
-  Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
-end;
-
-Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
-begin
-  Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
-end;
-
-Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
-
-begin
-  RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
-end;
-
-Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
-begin
-  Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
-end;
-
-Function Listen(Sock,MaxConnect:Longint):Boolean;
-begin
-  Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
-end;
-
-Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
-begin
-  Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
-  If Accept<0 Then
-    Accept:=-1;
-end;
-
-Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
+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
-  Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
+  fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
+  socketerror:=fpgeterrno;
 end;
 
-
-Function Shutdown(Sock:Longint;How:Longint):Longint;
+function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; 
 begin
-  ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
+  fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
+  socketerror:=fpgeterrno;
 end;
 
-
-Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
-begin
-  GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
-end;
-
-
-
-Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 begin
-  GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
+  fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
+function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; 
 begin
-  SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
+  fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; 
 begin
-  GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
+  fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+function  fplisten (s:cint; backlog : cint):cint;                          
 begin
-  SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
+  fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
+  socketerror:=fpgeterrno;
 end;
 
-{******************************************************************************
-                               UnixSock
-******************************************************************************}
-
-Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
-  Move(Addr[1],t.Path,length(Addr));
-  t.Family:=AF_UNIX;
-  t.Path[length(Addr)]:=#0;
-  Len:=Length(Addr)+3;
+  fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
+  socketerror:=fpgeterrno;
 end;
 
-
-Function Bind(Sock:longint;const addr:string):boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint; 
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  Bind(Sock,UnixAddr,AddrLen);
-  Bind:=(SocketError=0);
+  fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function DoAccept(Sock:longint;var addr:string):longint;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpshutdown (s:cint; how:cint):cint; 
 begin
-  AddrLen:=length(addr)+3;
-  DoAccept:=Accept(Sock,UnixAddr,AddrLen);
-  Move(UnixAddr.Path,Addr[1],AddrLen);
-  SetLength(Addr,AddrLen);
+  fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function DoConnect(Sock:longint;const addr:string):Boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
+  fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
+  socketerror:=fpgeterrno;
 end;
 
-Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
-var
-  s : longint;
+function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
-  S:=DoAccept(Sock,addr);
-  if S>0 then
-   begin
-     Sock2Text(S,SockIn,SockOut);
-     Accept:=true;
-   end
-  else
-   Accept:=false;
+  fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
-var
-  s : longint;
+function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
 begin
-  S:=DoAccept(Sock,addr);
-  if S>0 then
-   begin
-     Sock2File(S,SockIn,SockOut);
-     Accept:=true;
-   end
-  else
-   Accept:=false;
+  fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,optname,TSysParam(optval),optlen);
+  socketerror:=fpgeterrno;
 end;
 
-
-
-Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
+function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; 
 begin
-  Connect:=DoConnect(Sock,addr);
-  If Connect then
-     Sock2Text(Sock,SockIn,SockOut);
+  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 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

+ 35 - 1
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
 
 }

+ 64 - 108
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

+ 55 - 179
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;
-begin
-  Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
-end;
-
-Function CloseSocket (Sock:Longint):Longint;
-begin
-  if fpClose(Sock)=0 then
-    CloseSocket := 0 else
-    CloseSocket := -1;
-end;
-
-Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
-begin
-  Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Buf),BufLen,Flags,0,0);
-end;
-
-
-Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
-begin
-  Sendto:=SocketCall(Socket_Sys_SendTo,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
-end;
-
-Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
-begin
-  Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Buf),BufLen,Flags,0,0);
-end;
-
-Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
-
-begin
-  RecvFrom:=SocketCall(Socket_Sys_Recv,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
-end;
-
-Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
-begin
-  Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
-end;
-
-
-
-Function Listen(Sock,MaxConnect:Longint):Boolean;
-begin
-  Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
-end;
-
-
-
-Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
-begin
-  Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
-  If Accept<0 Then
-    Accept:=-1;
-end;
-
-
-
-Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
-begin
-  Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
-end;
-
-
-
-Function Shutdown(Sock:Longint;How:Longint):Longint;
+function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; 
 begin
-  ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
+  fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
 end;
 
-
-
-Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; 
 begin
-  GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
+  fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
 end;
 
-
-
-Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 begin
-  GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
+  fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
 end;
 
-
-
-Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
+function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; 
 begin
-  SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
+  fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
 end;
 
-
-
-Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; 
 begin
-  GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
+  fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
 end;
 
-
-
-Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+function  fplisten (s:cint; backlog : cint):cint;                          
 begin
-  SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
+  fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
 end;
 
-{******************************************************************************
-                               UnixSock
-******************************************************************************}
-
-Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
-  Move(Addr[1],t.Path,length(Addr));
-  t.Family:=AF_UNIX;
-  t.Path[length(Addr)]:=#0;
-  Len:=Length(Addr)+3;
+  fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
 end;
 
-
-Function Bind(Sock:longint;const addr:string):boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint; 
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  Bind(Sock,UnixAddr,AddrLen);
-  Bind:=(SocketError=0);
+  fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
 end;
 
-
-
-Function DoAccept(Sock:longint;var addr:string):longint;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpshutdown (s:cint; how:cint):cint; 
 begin
-  AddrLen:=length(addr)+3;
-  DoAccept:=Accept(Sock,UnixAddr,AddrLen);
-  Move(UnixAddr.Path,Addr[1],AddrLen);
-  SetLength(Addr,AddrLen);
+  fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
 end;
 
-
-
-Function DoConnect(Sock:longint;const addr:string):Boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
+  fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
 end;
 
-Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
-var
-  s : longint;
+function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
-  S:=DoAccept(Sock,addr);
-  if S>0 then
-   begin
-     Sock2Text(S,SockIn,SockOut);
-     Accept:=true;
-   end
-  else
-   Accept:=false;
+  fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
 end;
 
-
-
-Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
-var
-  s : longint;
+function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
 begin
-  S:=DoAccept(Sock,addr);
-  if S>0 then
-   begin
-     Sock2File(S,SockIn,SockOut);
-     Accept:=true;
-   end
-  else
-   Accept:=false;
+  fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,optname,TSysParam(optval),optlen,0,0);
 end;
 
-
-
-Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
+function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; 
 begin
-  Connect:=DoConnect(Sock,addr);
-  If Connect then
-     Sock2Text(Sock,SockIn,SockOut);
+  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 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.9  2004/01/03 12:18:29  marco
+  * a lot of copyright notices and CVS logs added and fixed
 
-  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.8  2003/09/15 07:09:58  marco
+  * small fixes, round 1
 
-  Revision 1.7  2003/03/23 17:47:15  armin
-  * CloseSocket added
+ Revision 1.7  2003/03/23 17:47:15  armin
+ * CloseSocket added
 
-  Revision 1.6  2002/09/07 16:01:20  peter
-    * old logs removed and tabs fixed
+ Revision 1.6  2002/09/07 16:01:18  peter
+   * old logs removed and tabs fixed
 
-  Revision 1.5  2002/02/04 21:29:34  michael
-  + merged missing sendto/rcvfrom functions
+ Revision 1.5  2002/02/05 07:54:34  marco
+  * Fixed typo
 
 }

+ 50 - 1
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
 
 }

+ 34 - 108
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;
-
-  SOCK_PACKET     = 10;
-
-  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;
-
-  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 }
+{$ifdef Unix}
+Uses UnixType;
+{$endif}
 
-{
-* 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}
+{$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
+
+{$define maybelibc:=}
+
+{$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

+ 172 - 81
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,174 +50,247 @@ 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 CloseSocket(Sock:Longint):Longint;
-var i : longint;
+function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; 
 begin
-  i := Winsock.CloseSocket (Sock);
-  if i <> 0 then
-  begin
-    SocketError:=WSAGetLastError;
-    CloseSocket := i;
-  end else
-  begin
-    CloseSocket := 0;
-    SocketError := 0;
-  end;
+  fpSend:=WinSock.Send(S,msg,len,flags);
+  if fpSend<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
 end;
 
-Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
+function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; 
 begin
-  Send:=WinSock.Send(Sock,Buf,BufLen,Flags);
-  if Send<0 then
+  // 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 SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
+function fprecv 	(s:cint; buf: pointer; len: size_t; flags: cint):ssize_t; 
 begin
-  // Dubious construct, this should be checked.
-  SendTo:=WinSock.SendTo(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
-  if SendTo<0 then
+  fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
+  if fpRecv<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
+function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; 
+
 begin
-  Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
-  if Recv<0 then
+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;  
 
-Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
+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
-  RecvFrom:=WinSock.RecvFrom(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
-  if RecvFrom<0 then
+  fpShutDown:=WinSock.ShutDown(S,How);
+  if fpShutDown<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
+Function socket(Domain,SocketType,Protocol:Longint):Longint;
+begin
+  socket:=fpsocket(Domain,sockettype,protocol);
+end;
 
-  var
-     l : longint;
+Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 
 begin
-  l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
-  if l<0 then
-    begin
-       SocketError:=WSAGetLastError;
-       Bind:=false;
-    end
+  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
-    begin
        SocketError:=0;
-       Bind:=true;
-    end;
 end;
 
-Function Listen(Sock,MaxConnect:Longint):Boolean;
-
-  var
-     l : longint;
+function fplisten      (s:cint; backlog : cint):cint;                          
 
 begin
-  l:=WinSock.Listen(Sock,MaxConnect);
-  if l<0 then
-    begin
-       SocketError:=WSAGetLastError;
-       Listen:=false;
-    end
+  fplisten:=WinSock.Listen(S,backlog);
+  if fplisten<0 then
+       SocketError:=WSAGetLastError
   else
-    begin
        SocketError:=0;
-       Listen:=true;
-    end;
 end;
 
-Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
-  Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
-  if Accept<0 then
+  fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(@AddrLen));
+  if fpAccept<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
+function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 
 begin
-  Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
-  if not Connect then
+  fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
+  if fpGetSockName<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function Shutdown(Sock:Longint;How:Longint):Longint;
+function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
-  ShutDown:=WinSock.ShutDown(Sock,How);
-  if ShutDown<0 then
+  fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
+  if fpGetPeerName<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; 
 begin
-  GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
-  if GetSocketName<0 then
+  fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
+  if fpGetSockOpt<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint; 
+
 begin
-  GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
-  if GetPeerName<0 then
+  fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
+  if fpSetSockOpt<0 then
     SocketError:=WSAGetLastError
   else
     SocketError:=0;
 end;
 
-Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
+function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; 
 begin
-  SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
-  if SetSocketOptions<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
+end;
+
+Function CloseSocket(Sock:Longint):Longint;
+var i : longint;
+begin
+  i := Winsock.CloseSocket (Sock);
+  if i <> 0 then
+  begin
+    SocketError:=WSAGetLastError;
+    CloseSocket := i;
+  end else
+  begin
+    CloseSocket := 0;
+    SocketError := 0;	
+  end;
+end;
+
+Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
+
+begin
+  bind:=fpBind(Sock,@Addr,AddrLen)=0;
+end;
+
+Function Listen(Sock,MaxConnect:Longint):Boolean;
+
+begin
+  Listen:=fplisten(Sock,MaxConnect)=0;
+end;
+
+Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+
+begin
+  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:=fpconnect(sock,@addr,addrlen)=0;
+end;
+
+Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+ GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
+end;
+
+Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+ 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