Browse Source

* new files sockets changes

marco 21 years ago
parent
commit
bdb8404de0
2 changed files with 343 additions and 0 deletions
  1. 224 0
      rtl/inc/sockovl.inc
  2. 119 0
      rtl/inc/stdsock.inc

+ 224 - 0
rtl/inc/sockovl.inc

@@ -0,0 +1,224 @@
+{  
+   $Id$
+   This file is part of the Free Pascal run time library.
+   (c) 2000-2003 by Marco van de Voort
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+   
+   socket call implementations for FreeBSD
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+
+{******************************************************************************
+                          Basic Socket Functions
+******************************************************************************}
+
+Function socket(Domain,SocketType,Protocol:Longint):Longint;
+begin
+  Socket:=fpsocket(domain,sockettype,protocol);
+end;
+
+
+Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
+begin
+  Send:=fpsend(sock,@buf,buflen,flags);
+end;
+
+Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
+begin
+  Sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
+end;
+
+Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
+begin
+  Recv:=fprecv(sock,@buf,buflen,flags);
+end;
+
+Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; var AddrLen :longint) : longint;
+
+begin
+  RecvFrom:=fprecvfrom(Sock,@buf,buflen,flags,@Addr,@AddrLen);
+end;
+
+Function 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 Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
+
+begin
+  Connect:=fpConnect(sock,@addr,addrlen)=0;
+end;
+
+Function Shutdown(Sock:Longint;How:Longint):Longint;
+begin
+  ShutDown:=fpshutdown(sock,how);
+end;
+
+Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+  GetSocketName:=fpgetsockname(sock,@addr,@addrlen);
+end;
+
+Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+  GetPeerName:=fpgetPeerName(sock,@addr,@addrlen);
+end;
+
+Function SetSocketOptions(Sock,Level,OptName:Longint;const OptVal;optlen:longint):Longint;
+begin
+  SetSocketOptions:=fpsetsockopt(Sock,Level,OptName,pointer(@OptVal),optlen);
+end;
+
+Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+begin
+  GetSocketOptions:=fpgetsockopt(Sock,Level,OptName,@OptVal,@OptLen);
+end;
+
+Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+begin
+  SocketPair:=fpsocketpair(domain,sockettype,protocol,@pair);
+end;
+
+{******************************************************************************
+                               UnixSock
+******************************************************************************}
+
+Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
+begin
+  Move(Addr[1],t.Path,length(Addr));
+  t.Family:=AF_UNIX;
+  t.Path[length(Addr)]:=#0;
+  Len:=Length(Addr)+3;
+end;
+
+
+Function Bind(Sock:longint;const addr:string):boolean;
+var
+  UnixAddr : TUnixSockAddr;
+  AddrLen  : longint;
+begin
+  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
+  Bind(Sock,UnixAddr,AddrLen);
+  Bind:=(SocketError=0);
+end;
+
+
+
+Function DoAccept(Sock:longint;var addr:string):longint;
+var
+  UnixAddr : TUnixSockAddr;
+  AddrLen  : longint;
+begin
+  AddrLen:=length(addr)+3;
+  DoAccept:=Accept(Sock,UnixAddr,AddrLen);
+  Move(UnixAddr.Path,Addr[1],AddrLen);
+  SetLength(Addr,AddrLen);
+end;
+
+
+
+Function DoConnect(Sock:longint;const addr:string):Boolean;
+var
+  UnixAddr : TUnixSockAddr;
+  AddrLen  : longint;
+begin
+  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
+  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
+end;
+
+Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
+var
+  s : longint;
+begin
+  S:=DoAccept(Sock,addr);
+  if S>0 then
+   begin
+     Sock2Text(S,SockIn,SockOut);
+     Accept:=true;
+   end
+  else
+   Accept:=false;
+end;
+
+
+
+Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
+var
+  s : longint;
+begin
+  S:=DoAccept(Sock,addr);
+  if S>0 then
+   begin
+     Sock2File(S,SockIn,SockOut);
+     Accept:=true;
+   end
+  else
+   Accept:=false;
+end;
+
+
+
+Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
+begin
+  Connect:=DoConnect(Sock,addr);
+  If Connect then
+     Sock2Text(Sock,SockIn,SockOut);
+end;
+
+
+
+Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
+begin
+  Connect:=DoConnect(Sock,addr);
+  if Connect then
+     Sock2File(Sock,SockIn,SockOut);
+end;
+
+
+Function CloseSocket (Sock:Longint):Longint;
+begin
+  if fpclose(Sock)=0 then
+    CloseSocket := 0 else
+    CloseSocket := -1;
+end;
+
+
+{
+ $Log$
+ Revision 1.1  2004-03-16 18:04:27  marco
+  * new files sockets changes
+
+ Revision 1.9  2004/01/03 12:18:29  marco
+  * a lot of copyright notices and CVS logs added and fixed
+
+ Revision 1.8  2003/09/15 07:09:58  marco
+  * small fixes, round 1
+
+ Revision 1.7  2003/03/23 17:47:15  armin
+ * CloseSocket added
+
+ Revision 1.6  2002/09/07 16:01:18  peter
+   * old logs removed and tabs fixed
+
+ Revision 1.5  2002/02/05 07:54:34  marco
+  * Fixed typo
+
+}

+ 119 - 0
rtl/inc/stdsock.inc

@@ -0,0 +1,119 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2004 by the Free Pascal development team
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+
+{$define uselibc:=cdecl; external;}
+
+function cfpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; uselibc
+function cfpbind 	(s:cint; addrx : psockaddr; addrlen : tsocklen):cint;  uselibc
+function cfpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;  uselibc
+function cfpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; uselibc
+function cfpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; uselibc
+function cfpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; uselibc
+function cfplisten      (s:cint; backlog : cint):cint;                          uselibc
+function cfprecv 	(s:cint; buf: pointer; len: size_t; flags: cint):ssize_t; uselibc
+function cfprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; uselibc
+//function cfprecvmsg     (s:cint; msg: pmsghdr; flags:cint):ssize_t; uselibc
+function cfpsend 	(s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; uselibc
+function cfpsendto 	(s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; uselibc
+//function cfpsendmsg 	(s:cint; hdr: pmsghdr; flags:cint):ssize; uselibc
+function cfpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint; uselibc
+function cfpshutdown 	(s:cint; how:cint):cint; uselibc
+function cfpsocket 	(domain:cint; xtype:cint; protocol: cint):cint; uselibc
+function cfpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; uselibc
+
+
+function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
+
+begin
+ fpaccept:=cfpaccept(s,addrx,addrlen);
+end;
+
+function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;  
+begin
+  fpbind:=cfpbind (s,addrx,addrlen);
+end;
+
+function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;  
+begin
+  fpconnect:=cfpconnect (s,name,namelen);
+end;
+
+function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
+begin
+  fpgetpeername:=cfpgetpeername (s,name,namelen);
+end;
+
+function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
+begin
+  fpgetsockname:=cfpgetsockname(s,name,namelen);
+end;
+
+function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; 
+begin
+  fpgetsockopt:=cfpgetsockopt(s,level,optname,optval,optlen);
+end;
+
+function fplisten      (s:cint; backlog : cint):cint;                          
+begin
+  fplisten:=cfplisten(s,backlog);
+end;
+
+function fprecv 	(s:cint; buf: pointer; len: size_t; flags:cint):ssize_t; 
+begin
+  fprecv:= cfprecv 	(s,buf,len,flags);
+end;
+
+function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; 
+begin
+  fprecvfrom:= cfprecvfrom (s,buf,len,flags,from,fromlen);
+end;
+
+function fpsend 	(s:cint; msg:pointer; len:size_t; flags:cint):ssize_t; 
+begin
+  fpsend:=cfpsend (s,msg,len,flags);
+end;
+
+function fpsendto 	(s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t; 
+begin
+  fpsendto:=cfpsendto (s,msg,len,flags,tox,tolen);
+end;
+
+function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint; 
+begin
+  fpsetsockopt:=cfpsetsockopt(s,level,optname,optval,optlen);
+end;
+
+function fpshutdown 	(s:cint; how:cint):cint; 
+begin
+  fpshutdown:=cfpshutdown(s,how);
+end;
+
+function fpsocket 	(domain:cint; xtype:cint; protocol: cint):cint; 
+begin
+  fpsocket:=cfpsocket(domain,xtype,protocol);
+end;
+
+function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; 
+begin
+  fpsocketpair:=cfpsocketpair(d,xtype,protocol,sv);
+end;
+
+{
+  $Log$
+  Revision 1.1  2004-03-16 18:04:27  marco
+   * new files sockets changes
+
+
+}