From 46b98b77f1ad82439837ea88bba899d7c1bf2bcf Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 21 Jun 1999 12:26:27 +0000 Subject: [PATCH] + files created by splitting the linux sockets unit --- rtl/inc/sockets.inc | 185 +++++++++++++++++++++++++++++++++++++++++++ rtl/inc/socketsh.inc | 86 ++++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 rtl/inc/sockets.inc create mode 100644 rtl/inc/socketsh.inc diff --git a/rtl/inc/sockets.inc b/rtl/inc/sockets.inc new file mode 100644 index 0000000000..0d54e30011 --- /dev/null +++ b/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 + +} diff --git a/rtl/inc/socketsh.inc b/rtl/inc/socketsh.inc new file mode 100644 index 0000000000..b803cbe2bd --- /dev/null +++ b/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 + +}