Przeglądaj źródła

+ files created by splitting the linux sockets unit

florian 26 lat temu
rodzic
commit
46b98b77f1
2 zmienionych plików z 271 dodań i 0 usunięć
  1. 185 0
      rtl/inc/sockets.inc
  2. 86 0
      rtl/inc/socketsh.inc

+ 185 - 0
rtl/inc/sockets.inc

@@ -0,0 +1,185 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1993,99 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.
+
+ **********************************************************************}
+
+{******************************************************************************
+                     Text File Writeln/ReadLn Support
+******************************************************************************}
+
+
+Procedure OpenSock(var F:Text);
+begin
+  if textrec(f).handle=UnusedHandle then
+   textrec(f).mode:=fmclosed
+  else
+   case textrec(f).userdata[1] of
+    S_OUT : textrec(f).mode:=fmoutput;
+     S_IN : textrec(f).mode:=fminput;
+   else
+    textrec(f).mode:=fmclosed;
+   end;
+end;
+
+
+
+Procedure IOSock(var F:text);
+begin
+  case textrec(f).mode of
+   fmoutput : fdWrite(textrec(f).handle,textrec(f).bufptr^,textrec(f).bufpos);
+    fminput : textrec(f).BufEnd:=fdRead(textrec(f).handle,textrec(f).bufptr^,textrec(f).bufsize);
+  end;
+  textrec(f).bufpos:=0;
+end;
+
+
+
+Procedure FlushSock(var F:Text);
+begin
+  if (textrec(f).mode=fmoutput) and (textrec(f).bufpos<>0) then
+   IOSock(f);
+  textrec(f).bufpos:=0;
+end;
+
+
+
+Procedure CloseSock(var F:text);
+begin
+  Close(f);
+end;
+
+
+
+Procedure Sock2Text(Sock:Longint;Var SockIn,SockOut:Text);
+{
+ Set up two Pascal Text file descriptors for reading and writing)
+}
+begin
+{ First the reading part.}
+  Assign(SockIn,'.');
+  Textrec(SockIn).Handle:=Sock;
+  Textrec(Sockin).userdata[1]:=S_IN;
+  TextRec(SockIn).OpenFunc:=@OpenSock;
+  TextRec(SockIn).InOutFunc:=@IOSock;
+  TextRec(SockIn).FlushFunc:=@FlushSock;
+  TextRec(SockIn).CloseFunc:=@CloseSock;
+{ Now the writing part. }
+  Assign(SockOut,'.');
+  Textrec(SockOut).Handle:=Sock;
+  Textrec(SockOut).userdata[1]:=S_OUT;
+  TextRec(SockOut).OpenFunc:=@OpenSock;
+  TextRec(SockOut).InOutFunc:=@IOSock;
+  TextRec(SockOut).FlushFunc:=@FlushSock;
+  TextRec(SockOut).CloseFunc:=@CloseSock;
+end;
+
+
+{******************************************************************************
+                                Untyped File
+******************************************************************************}
+
+Procedure Sock2File(Sock:Longint;Var SockIn,SockOut:File);
+begin
+{Input}
+  Assign(SockIn,'.');
+  FileRec(SockIn).Handle:=Sock;
+  FileRec(SockIn).RecSize:=1;
+  FileRec(Sockin).userdata[1]:=S_IN;
+{Output}
+  Assign(SockOut,'.');
+  FileRec(SockOut).Handle:=Sock;
+  FileRec(SockOut).RecSize:=1;
+  FileRec(SockOut).userdata[1]:=S_OUT;
+end;
+
+{******************************************************************************
+                               InetSock
+******************************************************************************}
+
+Function DoAccept(Sock:longint;Var addr:TInetSockAddr):longint;
+
+Var AddrLen : Longint;
+
+begin
+  AddrLEn:=SizeOf(Addr);
+  DoAccept:=Accept(Sock,Addr,AddrLen);
+end;
+
+Function DoConnect(Sock:longint;const addr: TInetSockAddr): Longint;
+
+begin
+  DoConnect:=Connect(Sock,Addr,SizeOF(TInetSockAddr));
+end;
+
+Function Connect(Sock:longint;const addr: TInetSockAddr;var SockIn,SockOut:text):Boolean;
+
+Var FD : Longint;
+
+begin
+  FD:=DoConnect(Sock,addr);
+  If Not(FD=-1) then
+   begin
+     Sock2Text(FD,SockIn,SockOut);
+     Connect:=true;
+   end
+  else
+   Connect:=false;
+end;
+
+Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:file):Boolean;
+
+Var FD : Longint;
+
+begin
+  FD:=DoConnect(Sock,addr);
+  If Not (FD=-1) then
+   begin
+     Sock2File(FD,SockIn,SockOut);
+     Connect:=true;
+   end
+  else
+   Connect:=false;
+end;
+
+Function Accept(Sock:longint;var addr:TInetSockAddr;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:TInetSockAddr;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;
+{
+  $Log$
+  Revision 1.1  1999-06-21 12:26:27  florian
+    + files created by splitting the linux sockets unit
+
+}

+ 86 - 0
rtl/inc/socketsh.inc

@@ -0,0 +1,86 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1993,99 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.
+
+ **********************************************************************}
+Const
+  { Socket Types }
+  SOCK_STREAM     = 1;               { stream (connection) socket   }
+  SOCK_DGRAM      = 2;               { datagram (conn.less) socket  }
+  SOCK_RAW        = 3;               { raw socket                   }
+  SOCK_RDM        = 4;               { reliably-delivered message   }
+  SOCK_SEQPACKET  = 5;               { sequential packet socket     }
+
+  AF_UNSPEC       = 0;
+  AF_UNIX         = 1;      { Unix domain sockets          }
+  AF_INET         = 2;      { Internet IP Protocol         }
+
+  {  Protocol Families }
+  PF_UNSPEC       = AF_UNSPEC;
+  PF_UNIX         = AF_UNIX;
+  PF_INET         = AF_INET;
+
+const
+  { Two constants to determine whether part of soket is for in or output }
+  S_IN = 0;
+  S_OUT = 1;
+
+Type
+  TSockAddr = packed Record
+    family:word;  { was byte, fixed }
+    data  :array [0..13] of char;
+    end;
+
+  TInetSockAddr = packed Record
+    family:Word;
+    port  :Word;
+    addr  :Cardinal;
+    pad   :array [1..8] of byte; { to get to the size of sockaddr... }
+    end;
+
+  TSockArray = Array[1..2] of Longint;
+
+Var
+  SocketError:Longint;
+
+{Basic Socket Functions}
+Function Socket(Domain,SocketType,Protocol:Longint):Longint;
+Function Send(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
+Function Recv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
+Function Bind(Sock:Longint;Var Addr;AddrLen:Longint):Boolean;
+Function Listen (Sock,MaxConnect:Longint):Boolean;
+Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+Function Connect(Sock:Longint;Var Addr;Addrlen:Longint):Longint;
+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;Var OptVal;optlen:longint):Longint;
+Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
+Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+
+{Text Support}
+Procedure Sock2Text(Sock:Longint;Var SockIn,SockOut:Text);
+
+{Untyped File Support}
+Procedure Sock2File(Sock:Longint;Var SockIn,SockOut:File);
+
+{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;
+
+{
+  $Log$
+  Revision 1.1  1999-06-21 12:26:27  florian
+    + files created by splitting the linux sockets unit
+
+}