Browse Source

* merged sockets patches

git-svn-id: branches/fixes_2_2@7391 -
marco 18 years ago
parent
commit
af65f83afb

+ 24 - 14
rtl/darwin/unxsockh.inc

@@ -125,6 +125,9 @@ Const
         SO_OOBINLINE     =$0100;        { leave received OOB data in line }
         SO_OOBINLINE     =$0100;        { leave received OOB data in line }
         SO_REUSEPORT     =$0200;        { allow local address & port reuse }
         SO_REUSEPORT     =$0200;        { allow local address & port reuse }
         SO_TIMESTAMP     =$0400;        { timestamp received dgram traffic }
         SO_TIMESTAMP     =$0400;        { timestamp received dgram traffic }
+        SO_ACCEPTFILTER  =$1000;        { there is an accept filter }
+        SO_DONTTRUNC     =$2000;        { APPLE: Retain unread data (ATOMIC proto) }
+        SO_WANTMORE      =$4000;        { APPLE: Want OOB in MSG_FLAG on receive }
 
 
 {
 {
  * Additional options, not kept in so_options.
  * Additional options, not kept in so_options.
@@ -138,6 +141,13 @@ Const
         SO_ERROR         =$1007;        { get error status and clear }
         SO_ERROR         =$1007;        { get error status and clear }
         SO_TYPE          =$1008;        { get socket type }
         SO_TYPE          =$1008;        { get socket type }
 
 
+        SO_NREAD         =$1020;        { APPLE: get 1st-packet byte count }
+        SO_NKE           =$1021;        { APPLE: Install socket-level NKE }
+        SO_NOSIGPIPE     =$1022;        { APPLE: No SIGPIPE on EPIPE }
+        SO_NOADDRERR     =$1023;        { APPLE: Returns EADDRNOTAVAIL when src is not available anymore }
+        SO_NWRITE        =$1024;        { APPLE: Get number of bytes currently in send socket buffer }
+        SO_LINGER_SEC    =$1080;        { linger on close if data present (in seconds) }
+
 
 
         SHUT_RD         =0;             { shut down the reading side }
         SHUT_RD         =0;             { shut down the reading side }
         SHUT_WR         =1;             { shut down the writing side }
         SHUT_WR         =1;             { shut down the writing side }
@@ -256,14 +266,14 @@ Const
 
 
       	IPPROTO_DONE		=257;
       	IPPROTO_DONE		=257;
 
 
-        IPV6_OPTIONS		= 1;  { buf/ip6_opts; set/get IP6 options }
-        IPV6_RECVOPTS		= 5;  { bool; receive all IP6 opts w/dgram }
-        IPV6_RECVRETOPTS	= 6;  { bool; receive IP6 opts for response }
-        IPV6_RECVDSTADDR	= 7;  { bool; receive IP6 dst addr w/dgram }
-        IPV6_RETOPTS		= 8;  { ip6_opts; set/get IP6 options }
-        IPV6_SOCKOPT_RESERVED1	= 3;  { reserved for future use }
-        IPV6_UNICAST_HOPS	= 4;  { int; IP6 hops }
-        IPV6_MULTICAST_IF	= 9;  { __uint8_t; set/get IP6 multicast i/f  }
+        IPV6_OPTIONS		= 1; { buf/ip6_opts; set/get IP6 options }
+        IPV6_RECVOPTS		= 5; { bool; receive all IP6 opts w/dgram }
+        IPV6_RECVRETOPTS	= 6; { bool; receive IP6 opts for response }
+        IPV6_RECVDSTADDR	= 7; { bool; receive IP6 dst addr w/dgram }
+        IPV6_RETOPTS		= 8; { ip6_opts; set/get IP6 options }
+        IPV6_SOCKOPT_RESERVED1	= 3; { reserved for future use }
+        IPV6_UNICAST_HOPS	= 4; { int; IP6 hops }
+        IPV6_MULTICAST_IF	= 9; { __uint8_t; set/get IP6 multicast i/f  }
         IPV6_MULTICAST_HOPS	=10; { __uint8_t; set/get IP6 multicast hops }
         IPV6_MULTICAST_HOPS	=10; { __uint8_t; set/get IP6 multicast hops }
         IPV6_MULTICAST_LOOP	=11; { __uint8_t; set/get IP6 mcast loopback }
         IPV6_MULTICAST_LOOP	=11; { __uint8_t; set/get IP6 mcast loopback }
         IPV6_JOIN_GROUP		=12; { ip6_mreq; join a group membership }
         IPV6_JOIN_GROUP		=12; { ip6_mreq; join a group membership }
@@ -290,10 +300,10 @@ Const
       	IP_RECVDSTADDR		=  7;    { bool; receive IP dst addr w/dgram }
       	IP_RECVDSTADDR		=  7;    { bool; receive IP dst addr w/dgram }
       	IP_RETOPTS		=  8;    { ip_opts; set/get IP options }
       	IP_RETOPTS		=  8;    { ip_opts; set/get IP options }
       	IP_MULTICAST_IF		=  9;    { u_char; set/get IP multicast i/f  }
       	IP_MULTICAST_IF		=  9;    { u_char; set/get IP multicast i/f  }
-      	IP_MULTICAST_TTL	= 10;   { u_char; set/get IP multicast ttl }
-      	IP_MULTICAST_LOOP	= 11;   { u_char; set/get IP multicast loopback }
-      	IP_ADD_MEMBERSHIP	= 12;   { ip_mreq; add an IP group membership }
-      	IP_DROP_MEMBERSHIP	= 13;   { ip_mreq; drop an IP group membership }
+      	IP_MULTICAST_TTL	= 10;    { u_char; set/get IP multicast ttl }
+      	IP_MULTICAST_LOOP	= 11;    { u_char; set/get IP multicast loopback }
+      	IP_ADD_MEMBERSHIP	= 12;    { ip_mreq; add an IP group membership }
+      	IP_DROP_MEMBERSHIP	= 13;    { ip_mreq; drop an IP group membership }
 
 
   { Flags for send, recv etc. }
   { Flags for send, recv etc. }
   MSG_OOB        = $0001;              { Process out-of-band data}
   MSG_OOB        = $0001;              { Process out-of-band data}
@@ -305,8 +315,8 @@ Const
   MSG_WAITALL    = $0040;              { Wait for a full request }
   MSG_WAITALL    = $0040;              { Wait for a full request }
   MSG_DONTWAIT   = $0080;              { Non-blocking I/O }
   MSG_DONTWAIT   = $0080;              { Non-blocking I/O }
   MSG_EOF        = $0100;
   MSG_EOF        = $0100;
-  MSG_WAITSTREAM = $0200;	             { wait up to full request.. may return partial }
-  MSG_FLUSH 	   = $0400;              { Start of 'hold' seq; dump so_temp }
+  MSG_WAITSTREAM = $0200;              { wait up to full request.. may return partial }
+  MSG_FLUSH 	 = $0400;              { Start of 'hold' seq; dump so_temp }
   MSG_HOLD       = $0800;              { Hold frag in so_temp }
   MSG_HOLD       = $0800;              { Hold frag in so_temp }
   MSG_SEND       = $1000;              { Send the packet in so_temp }
   MSG_SEND       = $1000;              { Send the packet in so_temp }
   MSG_HAVEMORE   = $2000;              { Data ready to be read }
   MSG_HAVEMORE   = $2000;              { Data ready to be read }

+ 15 - 15
rtl/freebsd/unixsock.inc

@@ -20,91 +20,91 @@
 function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
 function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
 Begin
 Begin
   fpSocket:=Do_Syscall(syscall_nr_socket,Domain,xtype,Protocol);
   fpSocket:=Do_Syscall(syscall_nr_socket,Domain,xtype,Protocol);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 End;
 End;
 
 
 function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 begin
 begin
   fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
   fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 begin
 begin
   fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
   fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 begin
 begin
   fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
   fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 begin
 begin
   fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
   fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 begin
 begin
   fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
   fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fplisten (s:cint; backlog : cint):cint;
 function  fplisten (s:cint; backlog : cint):cint;
 begin
 begin
   fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
   fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 begin
 begin
   fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
   fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 begin
 begin
   fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
   fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpshutdown (s:cint; how:cint):cint;
 function  fpshutdown (s:cint; how:cint):cint;
 begin
 begin
   fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
   fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
   fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
   fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
 function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
 begin
 begin
   fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
   fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 begin
 begin
   fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
   fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function  fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 
 
 begin
 begin
   fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
   fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 

+ 3 - 1
rtl/freebsd/unxsockh.inc

@@ -346,4 +346,6 @@ Const
   MSG_COMPAT    = $8000;
   MSG_COMPAT    = $8000;
   MSG_SOCALLBCK = $10000;
   MSG_SOCALLBCK = $10000;
   MSG_NOSIGNAL  = $20000;              { Do not generate SIGPIPE }
   MSG_NOSIGNAL  = $20000;              { Do not generate SIGPIPE }
-
+  
+  INVALID_SOCKET = -1;
+  SOCKET_ERROR = -1;

+ 3 - 3
rtl/inc/sockets.inc

@@ -48,7 +48,7 @@ begin
 {$else}
 {$else}
               r:=send(handle,bufptr^,bufpos,0);
               r:=send(handle,bufptr^,bufpos,0);
 {$endif}
 {$endif}
-            until (r<>-1) or (socketerror<>EsockEINTR);
+            until (r<>-1) or (SocketError <> EsockEINTR);
             bufend:=r;
             bufend:=r;
             def_error:=101; {File write error.}
             def_error:=101; {File write error.}
           end;
           end;
@@ -60,13 +60,13 @@ begin
 {$else}
 {$else}
               r:=recv(handle,bufptr^,bufsize,0);
               r:=recv(handle,bufptr^,bufsize,0);
 {$endif}
 {$endif}
-            until (r<>-1) or (socketerror<>EsockEINTR);
+            until (r<>-1) or (SocketError <> EsockEINTR);
             bufend:=r;
             bufend:=r;
             def_error:=100; {File read error.}
             def_error:=100; {File read error.}
           end;
           end;
       end;
       end;
       if r=-1 then
       if r=-1 then
-        case socketerror of
+        case SocketError of
           EsockEBADF:
           EsockEBADF:
 {          EsysENOTSOCK:}   {Why is this constant not defined? (DM)}
 {          EsysENOTSOCK:}   {Why is this constant not defined? (DM)}
             inoutres:=6;    {Invalid file handle.}
             inoutres:=6;    {Invalid file handle.}

+ 25 - 29
rtl/inc/socketsh.inc

@@ -36,9 +36,6 @@ const
   SOCK_SEQPACKET  = 5;               { sequential packet socket     }
   SOCK_SEQPACKET  = 5;               { sequential packet socket     }
 {$endif}
 {$endif}
 
 
-  INVALID_SOCKET = -1;				 { To ease porting from Kylix libc}
-  SOCKET_ERROR = -1;                 { unit to sockets unit.}
-
   INADDR_ANY   = CARDINAL(0);
   INADDR_ANY   = CARDINAL(0);
   INADDR_NONE  = CARDINAL($FFFFFFFF);
   INADDR_NONE  = CARDINAL($FFFFFFFF);
 
 
@@ -157,10 +154,10 @@ type
     sun_path      : array[0..107] of char;
     sun_path      : array[0..107] of char;
   end;
   end;
 
 
-  Tsocket=longint;  {To easy porting code from Kylix libc unit to sockets unit.}
+  Tsocket=longint;   {To easy porting code from Kylix libc unit to sockets unit.}
+
 
 
-Var
-  SocketError:cint;
+function socketerror : cint; 
 
 
 function  fpsocket      (domain:cint; xtype:cint; protocol: cint):cint;
 function  fpsocket      (domain:cint; xtype:cint; protocol: cint):cint;
 function  fprecv        (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 function  fprecv        (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
@@ -179,34 +176,33 @@ function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optle
 function  fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function  fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 
 
 {Basic Socket Functions}
 {Basic Socket Functions}
-Function Socket(Domain,SocketType,Protocol:Longint):Longint;
-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; 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;
-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 GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
-Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+Function Socket(Domain,SocketType,Protocol:Longint):Longint; deprecated;
+Function CloseSocket(Sock:Longint):Longint; // vote is still out on this one
+Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint; deprecated;
+Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint; deprecated;
+Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint; deprecated;
+Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;deprecated; 
+Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;deprecated;
+Function Listen (Sock,MaxConnect:Longint):Boolean;deprecated;
+Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;deprecated;
+Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):boolean;deprecated;
+Function Shutdown(Sock:Longint;How:Longint):Longint;deprecated;
+Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;deprecated;
+Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;deprecated;
+Function SetSocketOptions(Sock,Level,OptName:Longint;const OptVal;optlen:longint):Longint;deprecated;
+Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;deprecated;
+Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;deprecated;
 
 
 {Text Support}
 {Text Support}
-Procedure Sock2Text(Sock:Longint;Var SockIn,SockOut:Text);
+Procedure Sock2Text(Sock:Longint;Var SockIn,SockOut:Text);deprecated;
 
 
 {Untyped File Support}
 {Untyped File Support}
-Procedure Sock2File(Sock:Longint;Var SockIn,SockOut:File);
+Procedure Sock2File(Sock:Longint;Var SockIn,SockOut:File);deprecated;
 
 
-{Better Pascal Calling, Overloaded Functions!}
-Function Accept(Sock:longint;var addr:TInetSockAddr;var SockIn,SockOut:File):Boolean;
-Function Accept(Sock:longint;var addr:TInetSockAddr;var SockIn,SockOut:text):Boolean;
-Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:text):Boolean;
-Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:file):Boolean;
+Function Accept(Sock:longint;var addr:TInetSockAddr;var SockIn,SockOut:File):Boolean; deprecated;
+Function Accept(Sock:longint;var addr:TInetSockAddr;var SockIn,SockOut:text):Boolean;deprecated;
+Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:text):Boolean; deprecated;
+Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:file):Boolean;deprecated;
 
 
 
 
 { Utility routines}
 { Utility routines}

+ 1 - 2
rtl/inc/sockovl.inc

@@ -115,8 +115,7 @@ var
   AddrLen  : longint;
   AddrLen  : longint;
 begin
 begin
   Str2UnixSockAddr(addr,UnixAddr,AddrLen);
   Str2UnixSockAddr(addr,UnixAddr,AddrLen);
-  Bind(Sock,UnixAddr,AddrLen);
-  Bind:=(SocketError=0);
+  Bind := Bind(Sock, UnixAddr, AddrLen); // what the flying fuck were you thinking?
 end;
 end;
 
 
 
 

+ 15 - 15
rtl/inc/stdsock.inc

@@ -39,90 +39,90 @@ function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 
 
 begin
 begin
  fpaccept:=cfpaccept(s,addrx,addrlen);
  fpaccept:=cfpaccept(s,addrx,addrlen);
- socketerror:=fpgeterrno;
+ internal_socketerror:=fpgeterrno; 
 end;
 end;
 
 
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 begin
 begin
   fpbind:=cfpbind (s,addrx,addrlen);
   fpbind:=cfpbind (s,addrx,addrlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 begin
 begin
   fpconnect:=cfpconnect (s,name,namelen);
   fpconnect:=cfpconnect (s,name,namelen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpgetpeername:=cfpgetpeername (s,name,namelen);
   fpgetpeername:=cfpgetpeername (s,name,namelen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpgetsockname:=cfpgetsockname(s,name,namelen);
   fpgetsockname:=cfpgetsockname(s,name,namelen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 begin
 begin
   fpgetsockopt:=cfpgetsockopt(s,level,optname,optval,optlen);
   fpgetsockopt:=cfpgetsockopt(s,level,optname,optval,optlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fplisten      (s:cint; backlog : cint):cint;
 function fplisten      (s:cint; backlog : cint):cint;
 begin
 begin
   fplisten:=cfplisten(s,backlog);
   fplisten:=cfplisten(s,backlog);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fprecv         (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 function fprecv         (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
 begin
 begin
   fprecv:= cfprecv      (s,buf,len,flags);
   fprecv:= cfprecv      (s,buf,len,flags);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 begin
 begin
   fprecvfrom:= cfprecvfrom (s,buf,len,flags,from,fromlen);
   fprecvfrom:= cfprecvfrom (s,buf,len,flags,from,fromlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpsend         (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 function fpsend         (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 begin
 begin
   fpsend:=cfpsend (s,msg,len,flags);
   fpsend:=cfpsend (s,msg,len,flags);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpsendto       (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 function fpsendto       (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 begin
 begin
   fpsendto:=cfpsendto (s,msg,len,flags,tox,tolen);
   fpsendto:=cfpsendto (s,msg,len,flags,tox,tolen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 begin
 begin
   fpsetsockopt:=cfpsetsockopt(s,level,optname,optval,optlen);
   fpsetsockopt:=cfpsetsockopt(s,level,optname,optval,optlen);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpshutdown     (s:cint; how:cint):cint;
 function fpshutdown     (s:cint; how:cint):cint;
 begin
 begin
   fpshutdown:=cfpshutdown(s,how);
   fpshutdown:=cfpshutdown(s,how);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 begin
 begin
   fpsocket:=cfpsocket(domain,xtype,protocol);
   fpsocket:=cfpsocket(domain,xtype,protocol);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 begin
 begin
   fpsocketpair:=cfpsocketpair(d,xtype,protocol,sv);
   fpsocketpair:=cfpsocketpair(d,xtype,protocol,sv);
-  socketerror:=fpgeterrno;
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 

+ 2 - 5
rtl/linux/unixsock.inc

@@ -48,7 +48,7 @@ Const
   Socket_Sys_RECVMSG     = 17;
   Socket_Sys_RECVMSG     = 17;
 
 
 
 
-Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):longint;
+Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):longint; inline;
 var
 var
   Args:array[1..6] of TSysParam;
   Args:array[1..6] of TSysParam;
 begin
 begin
@@ -59,16 +59,13 @@ begin
   args[5]:=a5;
   args[5]:=a5;
   args[6]:=a6;
   args[6]:=a6;
   SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
   SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
-  If SocketCall<0 then
-   SocketError:=fpgetErrno
-  else
-   SocketError:=0;
 end;
 end;
 
 
 
 
 function SocketCall(SockCallNr,a1,a2,a3:TSysParam):longint;
 function SocketCall(SockCallNr,a1,a2,a3:TSysParam):longint;
 begin
 begin
   SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
   SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
+  internal_socketerror:=fpgeterrno;
 end;
 end;
 
 
 function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
 function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;

+ 4 - 0
rtl/netware/netwsockh.inc

@@ -52,3 +52,7 @@ const
        PF_ATM = AF_ATM;
        PF_ATM = AF_ATM;
        PF_INET6 = AF_INET6;
        PF_INET6 = AF_INET6;
        PF_MAX = AF_MAX;
        PF_MAX = AF_MAX;
+       
+  INVALID_SOCKET = -1;
+  SOCKET_ERROR = -1;
+

+ 44 - 145
rtl/netware/sockets.pp

@@ -71,70 +71,45 @@ Implementation
 //function fpsocket     (domain:cint; xtype:cint; protocol: cint):cint;
 //function fpsocket     (domain:cint; xtype:cint; protocol: cint):cint;
 
 
 
 
+function SocketError: cint;
+begin
+ SocketError := WSAGetLastError;
+end;
+
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 begin
 begin
   fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
   fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
-  if fpSocket<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 begin
 begin
   fpSend:=WinSock.Send(S,msg,len,flags);
   fpSend:=WinSock.Send(S,msg,len,flags);
-  if fpSend<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 begin
 begin
   // Dubious construct, this should be checked. (IPV6 fails ?)
   // Dubious construct, this should be checked. (IPV6 fails ?)
   fpSendTo:=WinSock.SendTo(S,msg,Len,Flags,Winsock.TSockAddr(tox^),toLen);
   fpSendTo:=WinSock.SendTo(S,msg,Len,Flags,Winsock.TSockAddr(tox^),toLen);
-  if fpSendTo<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 begin
 begin
   fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
   fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
-  if fpRecv<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
-
 begin
 begin
-fpRecvFrom:=WinSock.RecvFrom(S,Buf,Len,Flags,Winsock.TSockAddr(from^),FromLen^);
-  if fpRecvFrom<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
+  fpRecvFrom:=WinSock.RecvFrom(S,Buf,Len,Flags,Winsock.TSockAddr(from^),FromLen^);
 end;
 end;
 
 
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
-
 begin
 begin
   fpConnect:=WinSock.Connect(S,WinSock.TSockAddr(name^),nameLen);
   fpConnect:=WinSock.Connect(S,WinSock.TSockAddr(name^),nameLen);
-  if fpConnect<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpshutdown     (s:cint; how:cint):cint;
 function fpshutdown     (s:cint; how:cint):cint;
 begin
 begin
   fpShutDown:=WinSock.ShutDown(S,How);
   fpShutDown:=WinSock.ShutDown(S,How);
-  if fpShutDown<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
@@ -143,13 +118,11 @@ begin
 end;
 end;
 
 
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
-
 begin
 begin
   send:=fpsend(sock,@buf,buflen,flags);
   send:=fpsend(sock,@buf,buflen,flags);
 end;
 end;
 
 
 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;
-
 begin
 begin
   sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
   sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
 end;
 end;
@@ -165,70 +138,38 @@ begin
 end;
 end;
 
 
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
-
 begin
 begin
   fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
   fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
-  if fpbind<0 then
-       SocketError:=WSAGetLastError
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fplisten      (s:cint; backlog : cint):cint;
 function fplisten      (s:cint; backlog : cint):cint;
-
 begin
 begin
   fplisten:=WinSock.Listen(S,backlog);
   fplisten:=WinSock.Listen(S,backlog);
-  if fplisten<0 then
-       SocketError:=WSAGetLastError
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 begin
 begin
   fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(AddrLen));
   fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(AddrLen));
-  if fpAccept<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
-
 begin
 begin
   fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
   fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
-  if fpGetSockName<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
   fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
-  if fpGetPeerName<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 begin
 begin
   fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
   fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
-  if fpGetSockOpt<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
-
 begin
 begin
   fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
   fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
-  if fpSetSockOpt<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
@@ -237,48 +178,33 @@ begin
 end;
 end;
 
 
 Function CloseSocket(Sock:Longint):Longint;
 Function CloseSocket(Sock:Longint):Longint;
-var i : longint;
 begin
 begin
-  i := Winsock.CloseSocket (Sock);
-  if i <> 0 then
-  begin
-    SocketError:=WSAGetLastError;
-    CloseSocket := i;
-  end else
-  begin
-    CloseSocket := 0;
-    SocketError := 0;
-  end;
+  CloseSocket := Winsock.CloseSocket (Sock);
 end;
 end;
 
 
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
-
 begin
 begin
-  bind:=fpBind(Sock,@Addr,AddrLen)=0;
+  Bind:=fpBind(Sock,@Addr,AddrLen)=0;
 end;
 end;
 
 
 Function Listen(Sock,MaxConnect:Longint):Boolean;
 Function Listen(Sock,MaxConnect:Longint):Boolean;
-
 begin
 begin
   Listen:=fplisten(Sock,MaxConnect)=0;
   Listen:=fplisten(Sock,MaxConnect)=0;
 end;
 end;
 
 
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
-
 begin
 begin
   Accept:=FPAccept(sock,@addr,@addrlen);
   Accept:=FPAccept(sock,@addr,@addrlen);
 end;
 end;
 
 
 Function Shutdown(Sock:Longint;How:Longint):Longint;
 Function Shutdown(Sock:Longint;How:Longint):Longint;
-
 begin
 begin
- shutdown:=fpshutdown(sock,how);
+ Shutdown:=fpshutdown(sock,how);
 end;
 end;
 
 
 Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
 Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
-
 begin
 begin
- connect:=fpconnect(sock,@addr,addrlen)=0;
+ Connect:=fpconnect(sock,@addr,addrlen)=0;
 end;
 end;
 
 
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
@@ -297,7 +223,6 @@ begin
 end;
 end;
 
 
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
-
 begin
 begin
  SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
  SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
 end;
 end;
@@ -315,80 +240,54 @@ function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
 begin
 begin
   fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
   fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
   if fpWrite = dword(SOCKET_ERROR) then
   if fpWrite = dword(SOCKET_ERROR) then
-  begin
-    SocketError := WSAGetLastError;
     fpWrite := 0;
     fpWrite := 0;
-  end
-  else
-    SocketError := 0;
 end;
 end;
 
 
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
-  var
-     d : dword;
-
-  begin
-     if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
-       begin
-         SocketError:=WSAGetLastError;
-         fpRead:=0;
-         exit;
-       end;
-     if d>0 then
-       begin
-         if size>d then
-           size:=d;
-         fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
-         if fpRead = dword(SOCKET_ERROR) then
-         begin
-           SocketError:= WSAGetLastError;
-           fpRead := 0;
-         end else
-           SocketError:=0;
-       end
-     else
-       SocketError:=0;
-  end;
+var
+  d : dword;
+begin
+  if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
+    begin
+      fpRead:=0;
+      exit;
+    end;
+  if d>0 then
+    begin
+      if size>d then
+        size:=d;
+      fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
+      if fpRead = dword(SOCKET_ERROR) then
+        fpRead := 0;
+    end;
+end;
 {$else}
 {$else}
 { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
 { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
 function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
 function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
 begin
 begin
   fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
   fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
   if fpWrite = dword(SOCKET_ERROR) then
   if fpWrite = dword(SOCKET_ERROR) then
-  begin
-    SocketError := WSAGetLastError;
     fpWrite := 0;
     fpWrite := 0;
-  end
-  else
-    SocketError := 0;
 end;
 end;
 
 
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
-  var
-     d : dword;
-
-  begin
-     if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
-       begin
-         SocketError:=WSAGetLastError;
-         fpRead:=0;
-         exit;
-       end;
-     if d>0 then
-       begin
-         if size>d then
-           size:=d;
-         fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
-         if fpRead = dword(SOCKET_ERROR) then
-         begin
-           SocketError:= WSAGetLastError;
-           fpRead := 0;
-         end else
-           SocketError:=0;
-       end
-     else
-       SocketError:=0;
-  end;
+var
+  d : dword;
+begin
+  if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
+    begin
+      fpRead:=0;
+      exit;
+    end;
+  if d>0 then
+    begin
+      if size>d then
+        size:=d;
+      fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
+      if fpRead = dword(SOCKET_ERROR) then
+        fpRead := 0;
+    end;
+end;
 {$endif}
 {$endif}
 
 
 {$i sockets.inc}
 {$i sockets.inc}

+ 3 - 0
rtl/netwlibc/netwsockh.inc

@@ -52,3 +52,6 @@ const
        PF_ATM = AF_ATM;
        PF_ATM = AF_ATM;
        PF_INET6 = AF_INET6;
        PF_INET6 = AF_INET6;
        PF_MAX = AF_MAX;
        PF_MAX = AF_MAX;
+       
+  INVALID_SOCKET = -1;
+  SOCKET_ERROR = -1;

+ 14 - 124
rtl/os2/sockets.pas

@@ -124,6 +124,9 @@ Type
 // OS/2 stack based on BSD stack
 // OS/2 stack based on BSD stack
 {$DEFINE BSD}
 {$DEFINE BSD}
 {$I socketsh.inc}
 {$I socketsh.inc}
+  INVALID_SOCKET = TSocket(not(0));
+  SOCKET_ERROR = -1;
+
 
 
 Implementation
 Implementation
 
 
@@ -135,13 +138,14 @@ Implementation
                           Basic Socket Functions
                           Basic Socket Functions
 ******************************************************************************}
 ******************************************************************************}
 
 
+function SocketError: cint;
+begin
+  SocketError := so32dll.Sock_ErrNo;
+end;
+
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
 begin
 begin
   Socket:=so32dll.Socket(Domain,SocketType,ProtoCol);
   Socket:=so32dll.Socket(Domain,SocketType,ProtoCol);
-  if Socket<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
@@ -157,19 +161,11 @@ end;
 Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
 Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
 begin
 begin
   Recv:=so32dll.Recv(Sock,Buf,BufLen,Flags);
   Recv:=so32dll.Recv(Sock,Buf,BufLen,Flags);
-  if Recv<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
 Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
 begin
 begin
   RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
   RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
-  if RecvFrom<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
@@ -178,28 +174,13 @@ begin
 end;
 end;
 
 
 Function Listen(Sock,MaxConnect:Longint):Boolean;
 Function Listen(Sock,MaxConnect:Longint):Boolean;
-var
-  l : longint;
 begin
 begin
-  l:=so32dll.Listen(Sock,MaxConnect);
-  if l<0 then
-  begin
-    SocketError:=so32dll.sock_errno;
-    Listen:=false;
-  end else
-  begin
-    SocketError:=0;
-    Listen:=true;
-  end;
+  Listen := so32dll.Listen(Sock,MaxConnect) = 0;
 end;
 end;
 
 
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 begin
 begin
   Accept:=so32dll.Accept(Sock,so32dll.SockAddr(Addr), AddrLen);
   Accept:=so32dll.Accept(Sock,so32dll.SockAddr(Addr), AddrLen);
-  if Accept<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
 Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
@@ -210,28 +191,16 @@ end;
 Function Shutdown(Sock:Longint;How:Longint):Longint;
 Function Shutdown(Sock:Longint;How:Longint):Longint;
 begin
 begin
   ShutDown:=so32dll.ShutDown(Sock,How);
   ShutDown:=so32dll.ShutDown(Sock,How);
-  if ShutDown<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 begin
 begin
   GetSocketName:=so32dll.GetSockName(Sock, so32dll.SockAddr(Addr),AddrLen);
   GetSocketName:=so32dll.GetSockName(Sock, so32dll.SockAddr(Addr),AddrLen);
-  if GetSocketName<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 begin
 begin
   GetPeerName:=so32dll.GetPeerName(Sock,so32dll.SockAddr(Addr),AddrLen);
   GetPeerName:=so32dll.GetPeerName(Sock,so32dll.SockAddr(Addr),AddrLen);
-  if GetPeerName<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
@@ -242,10 +211,6 @@ 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:=so32dll.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
   GetSocketOptions:=so32dll.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
-  if GetSocketOptions<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
@@ -261,12 +226,7 @@ function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
 begin
 begin
   fpWrite := dword(fpsend(handle, @bufptr, size, 0));
   fpWrite := dword(fpsend(handle, @bufptr, size, 0));
   if fpWrite = dword(-1) then
   if fpWrite = dword(-1) then
-  begin
-    SocketError := so32dll.sock_errno;
     fpWrite := 0;
     fpWrite := 0;
-  end
-  else
-    SocketError := 0;
 end;
 end;
 
 
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
@@ -275,21 +235,15 @@ var
 begin
 begin
   d:=dword(so32dll.os2_ioctl(handle,FIONREAD,d,SizeOf(d)));
   d:=dword(so32dll.os2_ioctl(handle,FIONREAD,d,SizeOf(d)));
   if d=dword(-1) then
   if d=dword(-1) then
-  begin
-    SocketError:=so32dll.sock_errno;
-    fpRead:=0;
-  end else
-  begin
+   fpRead:=0
+  else
+   begin
     if size>d then
     if size>d then
       size:=d;
       size:=d;
     fpRead := dword(so32dll.recv(handle, bufptr, size, 0));
     fpRead := dword(so32dll.recv(handle, bufptr, size, 0));
     if fpRead = dword(-1) then
     if fpRead = dword(-1) then
-    begin
-      SocketError:= so32dll.sock_errno;
-      fpRead := 0;
-    end else
-      SocketError:=0;
-  end;
+     fpRead := 0
+   end;
 end;
 end;
 
 
 {$i sockets.inc}
 {$i sockets.inc}
@@ -297,128 +251,72 @@ end;
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 begin
 begin
   fpSocket:=so32dll.Socket(Domain,xtype,ProtoCol);
   fpSocket:=so32dll.Socket(Domain,xtype,ProtoCol);
-  if fpSocket<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 begin
 begin
   fpSend:=so32dll.Send(S,msg^,len,flags);
   fpSend:=so32dll.Send(S,msg^,len,flags);
-  if fpSend<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 begin
 begin
   // Dubious construct, this should be checked. (IPV6 fails ?)
   // Dubious construct, this should be checked. (IPV6 fails ?)
   fpSendTo:=so32dll.SendTo(S,msg^,Len,Flags,so32dll.SockAddr(tox^),toLen);
   fpSendTo:=so32dll.SendTo(S,msg^,Len,Flags,so32dll.SockAddr(tox^),toLen);
-  if fpSendTo<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 begin
 begin
   fpRecv:=so32dll.Recv(S,Buf,Len,Flags);
   fpRecv:=so32dll.Recv(S,Buf,Len,Flags);
-  if fpRecv<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 begin
 begin
   fpRecvFrom:=so32dll.RecvFrom(S,Buf,Len,Flags,so32dll.SockAddr(from^),FromLen^);
   fpRecvFrom:=so32dll.RecvFrom(S,Buf,Len,Flags,so32dll.SockAddr(from^),FromLen^);
-  if fpRecvFrom<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 begin
 begin
   fpConnect:=so32dll.Connect(S,so32dll.SockAddr(name^),nameLen);
   fpConnect:=so32dll.Connect(S,so32dll.SockAddr(name^),nameLen);
-  if fpConnect<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpshutdown     (s:cint; how:cint):cint;
 function fpshutdown     (s:cint; how:cint):cint;
 begin
 begin
   fpShutDown:=so32dll.ShutDown(S,How);
   fpShutDown:=so32dll.ShutDown(S,How);
-  if fpShutDown<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 begin
 begin
   fpbind:=so32dll.Bind(S,so32dll.SockAddr(Addrx^),AddrLen);
   fpbind:=so32dll.Bind(S,so32dll.SockAddr(Addrx^),AddrLen);
-  if fpbind<0 then
-       SocketError:=so32dll.sock_errno
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fplisten      (s:cint; backlog : cint):cint;
 function fplisten      (s:cint; backlog : cint):cint;
 begin
 begin
   fplisten:=so32dll.Listen(S,backlog);
   fplisten:=so32dll.Listen(S,backlog);
-  if fplisten<0 then
-       SocketError:=so32dll.sock_errno
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 begin
 begin
   fpAccept:=so32dll.Accept(S,so32dll.SockAddr(Addrx^),longint(@AddrLen));
   fpAccept:=so32dll.Accept(S,so32dll.SockAddr(Addrx^),longint(@AddrLen));
-  if fpAccept<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetSockName:=so32dll.GetSockName(S,so32dll.SockAddr(name^),nameLen^);
   fpGetSockName:=so32dll.GetSockName(S,so32dll.SockAddr(name^),nameLen^);
-  if fpGetSockName<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetPeerName:=so32dll.GetPeerName(S,so32dll.SockAddr(name^),NameLen^);
   fpGetPeerName:=so32dll.GetPeerName(S,so32dll.SockAddr(name^),NameLen^);
-  if fpGetPeerName<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 begin
 begin
   fpGetSockOpt:=so32dll.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
   fpGetSockOpt:=so32dll.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
-  if fpGetSockOpt<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 begin
 begin
   fpSetSockOpt:=so32dll.SetSockOpt(S,Level,OptName,OptVal,OptLen);
   fpSetSockOpt:=so32dll.SetSockOpt(S,Level,OptName,OptVal,OptLen);
-  if fpSetSockOpt<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
@@ -429,14 +327,6 @@ end;
 Function CloseSocket(Sock:Longint):Longint;
 Function CloseSocket(Sock:Longint):Longint;
 begin
 begin
   CloseSocket:=so32dll.soclose (Sock);
   CloseSocket:=so32dll.soclose (Sock);
-  if CloseSocket<>0 then
-  begin
-    SocketError:=so32dll.sock_errno;
-  end else
-  begin
-    CloseSocket := 0;
-    SocketError := 0;
-  end;
 end;
 end;
 
 
 
 

+ 3 - 3
rtl/unix/genfunch.inc

@@ -14,8 +14,8 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
-function CreateShellArgV(const prog:string):ppchar;
+function CreateShellArgV(const prog:string):ppchar; deprecated;
 
 
-function CreateShellArgV(const prog:Ansistring):ppchar;
+function CreateShellArgV(const prog:Ansistring):ppchar; deprecated;
 
 
-procedure FreeShellArgV(p:ppchar);
+procedure FreeShellArgV(p:ppchar); deprecated;

+ 23 - 16
rtl/unix/sockets.pp

@@ -38,27 +38,27 @@ type
                   end;
                   end;
 
 
 const
 const
-  EsockEINTR            = EsysEINTR;
+  EsockEINTR            = EsysEINTR;   
   EsockEBADF            = EsysEBADF;
   EsockEBADF            = EsysEBADF;
   EsockEFAULT           = EsysEFAULT;
   EsockEFAULT           = EsysEFAULT;
   EsockEINVAL           = EsysEINVAL;
   EsockEINVAL           = EsysEINVAL;
-  EsockEACCESS         = ESysEAcces;
-  EsockEMFILE          = ESysEmfile;
-  EsockEMSGSIZE        = ESysEMsgSize;
-  EsockENOBUFS         = ESysENoBufs;
-  EsockENOTCONN        = ESysENotConn;
-  EsockENOTSOCK        = ESysENotSock;
-  EsockEPROTONOSUPPORT = ESysEProtoNoSupport;
-  EsockEWOULDBLOCK     = ESysEWouldBlock;
+  EsockEACCESS          = ESysEAcces;
+  EsockEMFILE           = ESysEmfile;
+  EsockEMSGSIZE         = ESysEMsgSize;
+  EsockENOBUFS          = ESysENoBufs;
+  EsockENOTCONN         = ESysENotConn;
+  EsockENOTSOCK         = ESysENotSock;
+  EsockEPROTONOSUPPORT  = ESysEProtoNoSupport;
+  EsockEWOULDBLOCK      = ESysEWouldBlock;
 
 
 
 
 { unix socket specific functions }
 { unix socket specific functions }
-Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
-Function Bind(Sock:longint;const addr:string):boolean;
-Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
-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;
+Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint); deprecated;
+Function Bind(Sock:longint;const addr:string):boolean; deprecated;
+Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean; deprecated;
+Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean; deprecated;
+Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;    deprecated;
+Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;    deprecated;
 
 
 //function  fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; maybelibc
 //function  fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; maybelibc
 //function  fpbind      (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;  maybelibc
 //function  fpbind      (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;  maybelibc
@@ -68,6 +68,8 @@ Implementation
 
 
 Uses {$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
 Uses {$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
 
 
+threadvar internal_socketerror : cint;
+
 { Include filerec and textrec structures }
 { Include filerec and textrec structures }
 {$i filerec.inc}
 {$i filerec.inc}
 {$i textrec.inc}
 {$i textrec.inc}
@@ -75,6 +77,12 @@ Uses {$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
                           Kernel Socket Callings
                           Kernel Socket Callings
 ******************************************************************************}
 ******************************************************************************}
 
 
+function socketerror:cint;
+
+begin
+  socketerror:=internal_socketerror;
+end;
+
 {$ifndef FPC_USE_LIBC}
 {$ifndef FPC_USE_LIBC}
 {$i unixsock.inc}
 {$i unixsock.inc}
 {$else}
 {$else}
@@ -82,5 +90,4 @@ Uses {$ifndef FPC_USE_LIBC}SysCall{$else}initc{$endif};
 {$endif}
 {$endif}
 {$i sockovl.inc}
 {$i sockovl.inc}
 {$i sockets.inc}
 {$i sockets.inc}
-
 end.
 end.

+ 7 - 7
rtl/unix/unix.pp

@@ -88,12 +88,13 @@ function FpExecV(Const PathName:AnsiString;args:ppchar):cint;
 function FpExecVP(Const PathName:AnsiString;args:ppchar):cint;
 function FpExecVP(Const PathName:AnsiString;args:ppchar):cint;
 function FpExecVPE(Const PathName:AnsiString;args,env:ppchar):cint;
 function FpExecVPE(Const PathName:AnsiString;args,env:ppchar):cint;
 
 
-Function Shell   (const Command:String):cint;
-Function Shell   (const Command:AnsiString):cint;
+Function Shell   (const Command:String):cint;     deprecated;
+Function Shell   (const Command:AnsiString):cint; deprecated;
 Function fpSystem(const Command:string):cint;
 Function fpSystem(const Command:string):cint;
 Function fpSystem(const Command:AnsiString):cint;
 Function fpSystem(const Command:AnsiString):cint;
 
 
-Function WaitProcess (Pid:cint):cint; { like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
+Function WaitProcess (Pid:cint):cint; 
+{ like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
 
 
 Function WIFSTOPPED (Status: Integer): Boolean;
 Function WIFSTOPPED (Status: Integer): Boolean;
 Function W_EXITCODE (ReturnCode, Signal: Integer): Integer;
 Function W_EXITCODE (ReturnCode, Signal: Integer): Integer;
@@ -113,9 +114,8 @@ Function  StatFS  (Path:pchar;Var Info:tstatfs):cint;
 Function  fpFlock   (var T : text;mode : cint) : cint;
 Function  fpFlock   (var T : text;mode : cint) : cint;
 Function  fpFlock   (var F : File;mode : cint) : cint;
 Function  fpFlock   (var F : File;mode : cint) : cint;
 
 
-
-Function  SelectText (var T:Text;TimeOut :PTimeVal):cint;
-Function  SelectText (var T:Text;TimeOut :cint):cint;
+Function  SelectText (var T:Text;TimeOut :PTimeVal):cint; deprecated;
+Function  SelectText (var T:Text;TimeOut :cint):cint; deprecated;
 
 
 {**************************
 {**************************
    Directory Handling
    Directory Handling
@@ -394,7 +394,7 @@ End;
 {$if defined(FPC_USE_FPEXEC) and not defined(USE_VFORK)}
 {$if defined(FPC_USE_FPEXEC) and not defined(USE_VFORK)}
 {$define SHELL_USE_FPEXEC}
 {$define SHELL_USE_FPEXEC}
 {$endif}
 {$endif}
-Function Shell(const Command:String):cint;
+Function Shell(const Command:String):cint; deprecated;
 {
 {
   Executes the shell, and passes it the string Command. (Through /bin/sh -c)
   Executes the shell, and passes it the string Command. (Through /bin/sh -c)
   The current environment is passed to the shell.
   The current environment is passed to the shell.

+ 4 - 0
rtl/win/fpwinsockh.inc

@@ -201,3 +201,7 @@ const
 
 
   { options for socket level  }
   { options for socket level  }
   SOL_SOCKET = $ffff;
   SOL_SOCKET = $ffff;
+  
+  INVALID_SOCKET = winsock2.INVALID_SOCKET;
+  SOCKET_ERROR = winsock2.SOCKET_ERROR;
+

+ 7 - 85
rtl/win/sockets.pp

@@ -59,71 +59,47 @@ Implementation
 
 
 //function fpsocket     (domain:cint; xtype:cint; protocol: cint):cint;
 //function fpsocket     (domain:cint; xtype:cint; protocol: cint):cint;
 
 
+function socketerror:cint;
+begin
+ result:=wsagetlasterror;
+end;
 
 
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
 begin
 begin
   fpSocket:=WinSock2.Socket(Domain,xtype,ProtoCol);
   fpSocket:=WinSock2.Socket(Domain,xtype,ProtoCol);
-  if fpSocket<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
 begin
 begin
   fpSend:=WinSock2.Send(S,msg,len,flags);
   fpSend:=WinSock2.Send(S,msg,len,flags);
-  if fpSend<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
 begin
 begin
   // Dubious construct, this should be checked. (IPV6 fails ?)
   // Dubious construct, this should be checked. (IPV6 fails ?)
   fpSendTo:=WinSock2.SendTo(S,msg,Len,Flags,Winsock2.PSockAddr(tox),toLen);
   fpSendTo:=WinSock2.SendTo(S,msg,Len,Flags,Winsock2.PSockAddr(tox),toLen);
-  if fpSendTo<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
 begin
 begin
   fpRecv:=WinSock2.Recv(S,Buf,Len,Flags);
   fpRecv:=WinSock2.Recv(S,Buf,Len,Flags);
-  if fpRecv<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 
 
 begin
 begin
   fpRecvFrom:=WinSock2.RecvFrom(S,Buf,Len,Flags,WinSock2.PSockAddr(From),FromLen);
   fpRecvFrom:=WinSock2.RecvFrom(S,Buf,Len,Flags,WinSock2.PSockAddr(From),FromLen);
-  if fpRecvFrom<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
 
 
 begin
 begin
   fpConnect:=Winsock2.Connect(S,WinSock2.PSockAddr(name),nameLen);
   fpConnect:=Winsock2.Connect(S,WinSock2.PSockAddr(name),nameLen);
-  if fpConnect<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpshutdown     (s:cint; how:cint):cint;
 function fpshutdown     (s:cint; how:cint):cint;
 begin
 begin
   fpShutDown:=Winsock2.ShutDown(S,How);
   fpShutDown:=Winsock2.ShutDown(S,How);
-  if fpShutDown<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
 Function socket(Domain,SocketType,Protocol:Longint):Longint;
@@ -154,91 +130,49 @@ begin
 end;
 end;
 
 
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
-
 begin
 begin
   fpbind:=Winsock2.Bind(S,Winsock2.PSockAddr(Addrx),AddrLen);
   fpbind:=Winsock2.Bind(S,Winsock2.PSockAddr(Addrx),AddrLen);
-  if fpbind<0 then
-       SocketError:=WSAGetLastError
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fplisten      (s:cint; backlog : cint):cint;
 function fplisten      (s:cint; backlog : cint):cint;
-
 begin
 begin
   fplisten:=Winsock2.Listen(S,backlog);
   fplisten:=Winsock2.Listen(S,backlog);
-  if fplisten<0 then
-       SocketError:=WSAGetLastError
-  else
-       SocketError:=0;
 end;
 end;
 
 
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
 begin
 begin
   fpAccept:=Winsock2.Accept(S,Winsock2.PSockAddr(Addrx), AddrLen);
   fpAccept:=Winsock2.Accept(S,Winsock2.PSockAddr(Addrx), AddrLen);
-  if fpAccept<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
-
 begin
 begin
   fpGetSockName:=Winsock2.GetSockName(S,Winsock2.TSockAddr(name^),nameLen^);
   fpGetSockName:=Winsock2.GetSockName(S,Winsock2.TSockAddr(name^),nameLen^);
-  if fpGetSockName<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
 begin
 begin
   fpGetPeerName:=Winsock2.GetPeerName(S,Winsock2.TSockAddr(name^),NameLen^);
   fpGetPeerName:=Winsock2.GetPeerName(S,Winsock2.TSockAddr(name^),NameLen^);
-  if fpGetPeerName<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
 begin
 begin
   fpGetSockOpt:=Winsock2.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
   fpGetSockOpt:=Winsock2.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
-  if fpGetSockOpt<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
 function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
-
 begin
 begin
   fpSetSockOpt:=Winsock2.SetSockOpt(S,Level,OptName,OptVal,OptLen);
   fpSetSockOpt:=Winsock2.SetSockOpt(S,Level,OptName,OptVal,OptLen);
-  if fpSetSockOpt<0 then
-    SocketError:=WSAGetLastError
-  else
-    SocketError:=0;
 end;
 end;
 
 
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
 begin
 begin
   fpsocketpair:=-1;
   fpsocketpair:=-1;
-  SocketError:=EOPNOTSUPP;
+  WSASetLastError(EOPNOTSUPP); // so that wsagetlasterror retrieves it
 end;
 end;
 
 
 Function CloseSocket(Sock:Longint):Longint;
 Function CloseSocket(Sock:Longint):Longint;
-var i : longint;
 begin
 begin
-  i := Winsock2.CloseSocket (Sock);
-  if i <> 0 then
-  begin
-    SocketError:=WSAGetLastError;
-    CloseSocket := i;
-  end else
-  begin
-    CloseSocket := 0;
-    SocketError := 0;
-  end;
+  result := Winsock2.CloseSocket (Sock);
 end;
 end;
 
 
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
@@ -301,12 +235,7 @@ function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
 begin
 begin
   fpWrite := dword(Winsock2.send(handle, bufptr, size, 0));
   fpWrite := dword(Winsock2.send(handle, bufptr, size, 0));
   if fpWrite = dword(winsock2.SOCKET_ERROR) then
   if fpWrite = dword(winsock2.SOCKET_ERROR) then
-  begin
-    SocketError := WSAGetLastError;
     fpWrite := 0;
     fpWrite := 0;
-  end
-  else
-    SocketError := 0;
 end;
 end;
 
 
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
 function fpRead(handle : longint;var bufptr;size : dword) : dword;
@@ -316,7 +245,6 @@ function fpRead(handle : longint;var bufptr;size : dword) : dword;
   begin
   begin
      if ioctlsocket(handle,FIONREAD,@d) = winsock2.SOCKET_ERROR then
      if ioctlsocket(handle,FIONREAD,@d) = winsock2.SOCKET_ERROR then
        begin
        begin
-         SocketError:=WSAGetLastError;
          fpRead:=0;
          fpRead:=0;
          exit;
          exit;
        end;
        end;
@@ -326,14 +254,8 @@ function fpRead(handle : longint;var bufptr;size : dword) : dword;
            size:=d;
            size:=d;
          fpRead := dword(Winsock2.recv(handle, bufptr, size, 0));
          fpRead := dword(Winsock2.recv(handle, bufptr, size, 0));
          if fpRead = dword(winsock2.SOCKET_ERROR) then
          if fpRead = dword(winsock2.SOCKET_ERROR) then
-         begin
-           SocketError:= WSAGetLastError;
            fpRead := 0;
            fpRead := 0;
-         end else
-           SocketError:=0;
-       end
-     else
-       SocketError:=0;
+       end;
   end;
   end;
 
 
 {$i sockets.inc}
 {$i sockets.inc}