mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-03 10:38:45 +02:00
+ files created by splitting the linux sockets unit
This commit is contained in:
parent
aae9265b5c
commit
46b98b77f1
185
rtl/inc/sockets.inc
Normal file
185
rtl/inc/sockets.inc
Normal file
@ -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
rtl/inc/socketsh.inc
Normal file
86
rtl/inc/socketsh.inc
Normal file
@ -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
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user