浏览代码

* 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.
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 }
 }
 
 
-
 {******************************************************************************
 {******************************************************************************
                           Basic Socket Functions
                           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
 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;
 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
 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;
 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
 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;
 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
 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;
 end;
 
 
-
-
-Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; 
 begin
 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;
 end;
 
 
-
-
-Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+function  fplisten (s:cint; backlog : cint):cint;                          
 begin
 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;
 end;
 
 
-{******************************************************************************
-                               UnixSock
-******************************************************************************}
-
-Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
 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;
 end;
 
 
-
-Function Bind(Sock:longint;const addr:string):boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint; 
 begin
 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;
 end;
 
 
-
-
-Function DoAccept(Sock:longint;var addr:string):longint;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpshutdown (s:cint; how:cint):cint; 
 begin
 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;
 end;
 
 
-
-
-Function DoConnect(Sock:longint;const addr:string):Boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
+  fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
+  socketerror:=fpgeterrno;
 end;
 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
 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;
 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
 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;
 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
 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;
 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
 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;
 end;
 
 
 {
 {
  $Log$
  $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
   * a lot of copyright notices and CVS logs added and fixed
 
 
  Revision 1.8  2003/09/15 07:09:58  marco
  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;
   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$
    $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
     * header for sockets unit
 
 
 }
 }

+ 64 - 108
rtl/inc/socketsh.inc

@@ -11,6 +11,18 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     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
 Const
   { Socket types }
   { Socket types }
   SOCK_STREAM     = 1;               { stream (connection) socket   }
   SOCK_STREAM     = 1;               { stream (connection) socket   }
@@ -52,111 +64,35 @@ Const
   MSG_NOSIGNAL = $4000;              { Do not generate SIGPIPE }
   MSG_NOSIGNAL = $4000;              { Do not generate SIGPIPE }
   MSG_MORE     = $8000;              { Sender will send more }
   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
 const
   { Two constants to determine whether part of soket is for in or output }
   { Two constants to determine whether part of soket is for in or output }
   S_IN = 0;
   S_IN = 0;
   S_OUT = 1;
   S_OUT = 1;
 
 
 Type
 Type
+  in_addr = packed record
+	     s_addr  : cuint32;		// inaddr_t=cuint32
+            end; 
+
   TSockAddr = packed Record
   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;
     end;
+  pSockAddr = ^TSockAddr;
 
 
   TInetSockAddr = packed Record
   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;
   end;
+  pInetSockAddr = ^TInetSockAddr;
 
 
   Tin6_addr = packed record
   Tin6_addr = packed record
   case byte of
   case byte of
@@ -168,26 +104,43 @@ Type
     5: (s6_addr16 : array[0..7] of smallint);
     5: (s6_addr16 : array[0..7] of smallint);
     6: (s6_addr32 : array[0..3] of LongInt);
     6: (s6_addr32 : array[0..3] of LongInt);
   end;
   end;
+  pIn6_Addr=^TIn6_addr;
 
 
   TInetSockAddr6 = packed Record
   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_addr     : Tin6_addr;
-    sin6_scope_id : LongInt;
+    sin6_scope_id : cuint32;
   end;
   end;
+
   sockaddr_in6 = TInetSockAddr6;
   sockaddr_in6 = TInetSockAddr6;
   psockaddr_in6 = ^sockaddr_in6;
   psockaddr_in6 = ^sockaddr_in6;
 
 
-  TSockArray = Array[1..2] of Longint;
+  TSockPairArray = Array[0..1] of Longint;
+  TSockArray     = Array[1..2] of Longint; 		//legacy
 
 
 Var
 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}
 {Basic Socket Functions}
 Function Socket(Domain,SocketType,Protocol:Longint):Longint;
 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 Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : 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 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 Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 Function Listen (Sock,MaxConnect:Longint):Boolean;
 Function Listen (Sock,MaxConnect:Longint):Boolean;
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 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 Shutdown(Sock:Longint;How:Longint):Longint;
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function GetPeerName(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 GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):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$
   $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
   + Added IPV6 patch from Johannes Berg
 
 
   Revision 1.11  2003/11/22 16:28:56  michael
   Revision 1.11  2003/11/22 16:28:56  michael

+ 55 - 179
rtl/linux/unixsock.inc

@@ -1,17 +1,22 @@
-{
+{  
    $Id$
    $Id$
    This file is part of the Free Pascal run time library.
    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,
    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.
    for details about the copyright.
+   
+   socket call implementations for Linux
 
 
    This program is distributed in the hope that it will be useful,
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY;without even the implied warranty of
    but WITHOUT ANY WARRANTY;without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
 
 
-**********************************************************************}
+{******************************************************************************
+                          Basic Socket Functions
+******************************************************************************}
 
 
 Const
 Const
   {
   {
@@ -42,7 +47,6 @@ Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
 var
 var
   Args:array[1..6] of longint;
   Args:array[1..6] of longint;
 begin
 begin
-{$IFNDEF BSD}
   args[1]:=a1;
   args[1]:=a1;
   args[2]:=a2;
   args[2]:=a2;
   args[3]:=a3;
   args[3]:=a3;
@@ -54,9 +58,6 @@ begin
    SocketError:=fpgetErrno
    SocketError:=fpgetErrno
   else
   else
    SocketError:=0;
    SocketError:=0;
- {$ELSE}
-  SocketError:=-1;
- {$ENDIF}
 end;
 end;
 
 
 
 
@@ -65,225 +66,100 @@ begin
   SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
   SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
 end;
 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
 begin
-  ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
+  fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
 end;
 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
 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;
 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
 begin
-  GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
+  fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
 end;
 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
 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;
 end;
 
 
-
-
-Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint; 
 begin
 begin
-  GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
+  fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
 end;
 end;
 
 
-
-
-Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+function  fplisten (s:cint; backlog : cint):cint;                          
 begin
 begin
-  SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
+  fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
 end;
 end;
 
 
-{******************************************************************************
-                               UnixSock
-******************************************************************************}
-
-Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
 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;
 end;
 
 
-
-Function Bind(Sock:longint;const addr:string):boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint; 
 begin
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  Bind(Sock,UnixAddr,AddrLen);
-  Bind:=(SocketError=0);
+  fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
 end;
 end;
 
 
-
-
-Function DoAccept(Sock:longint;var addr:string):longint;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpshutdown (s:cint; how:cint):cint; 
 begin
 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;
 end;
 
 
-
-
-Function DoConnect(Sock:longint;const addr:string):Boolean;
-var
-  UnixAddr : TUnixSockAddr;
-  AddrLen  : longint;
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
 begin
-  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
+  fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
 end;
 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
 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;
 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
 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;
 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
 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;
 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
 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;
 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_NETGRAPH     =AF_NETGRAPH;
   PF_MAX          =AF_MAX;
   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$
    $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
     * header for sockets unit
 
 
 }
 }

+ 34 - 108
rtl/unix/sockets.pp

@@ -14,115 +14,30 @@
 unit Sockets;
 unit Sockets;
 Interface
 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
 type
   TUnixSockAddr = packed Record
   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 }
 { unix socket specific functions }
 Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
 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:text):Boolean;
 Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):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
 Implementation
 
 
-Uses BaseUnix,SysCall;
+Uses BaseUnix,{$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
 
 
 { Include filerec and textrec structures }
 { Include filerec and textrec structures }
 {$i filerec.inc}
 {$i filerec.inc}
@@ -143,15 +62,22 @@ Uses BaseUnix,SysCall;
                           Kernel Socket Callings
                           Kernel Socket Callings
 ******************************************************************************}
 ******************************************************************************}
 
 
-{$I unixsock.inc}
-
+{$ifndef FPC_USE_LIBC}
+{$i unixsock.inc} 
+{$else}
+{$i stdsock.inc}
+{$endif}
+{$i sockovl.inc}
 {$i sockets.inc}
 {$i sockets.inc}
 
 
 end.
 end.
 
 
 {
 {
   $Log$
   $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
    * somebody added fields to socketsh.inc that were already under ifdef bsd
 
 
   Revision 1.7  2003/09/14 20:15:01  marco
   Revision 1.7  2003/09/14 20:15:01  marco

+ 172 - 81
rtl/win32/sockets.pp

@@ -16,9 +16,24 @@ unit Sockets;
 
 
 Interface
 Interface
 
 
+{$macro on}
+{$define maybelibc:=}
+
   Uses
   Uses
      windows,winsock;
      windows,winsock;
 
 
+Type
+  cushort=word;
+  cuint16=word;
+  cuint32=cardinal;
+  size_t =cuint32;
+  ssize_t=cuint16;
+  cint   =longint;
+  pcint  =^cint;
+  tsocklen=cint;
+  psocklen=^tsocklen;
+
+
   Const
   Const
      AF_MAX          = WinSock.AF_MAX;
      AF_MAX          = WinSock.AF_MAX;
      PF_MAX          = AF_MAX;
      PF_MAX          = AF_MAX;
@@ -35,174 +50,247 @@ Implementation
                           Basic Socket Functions
                           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
 begin
-  Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
-  if Socket<0 then
+  fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
+  if fpSocket<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function CloseSocket(Sock:Longint):Longint;
-var i : longint;
+function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; 
 begin
 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;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
   else
-    begin
        SocketError:=0;
        SocketError:=0;
-       Bind:=true;
-    end;
 end;
 end;
 
 
-Function Listen(Sock,MaxConnect:Longint):Boolean;
-
-  var
-     l : longint;
+function fplisten      (s:cint; backlog : cint):cint;                          
 
 
 begin
 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
   else
-    begin
        SocketError:=0;
        SocketError:=0;
-       Listen:=true;
-    end;
 end;
 end;
 
 
-Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
 begin
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
+function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 
 
 begin
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function Shutdown(Sock:Longint;How:Longint):Longint;
+function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
 begin
 begin
-  ShutDown:=WinSock.ShutDown(Sock,How);
-  if ShutDown<0 then
+  fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
+  if fpGetPeerName<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 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
 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
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
+function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; 
 begin
 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;
 end;
 
 
 Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
 Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
 begin
 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;
 end;
 
 
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
 begin
 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;
 end;
 
 
 
 
@@ -301,7 +389,10 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $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
     * stdcall patch
 
 
   Revision 1.11  2003/03/23 17:47:15  armin
   Revision 1.11  2003/03/23 17:47:15  armin