123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 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): Boolean;
- begin
- DoConnect:=Connect(Sock,Addr,SizeOF(TInetSockAddr));
- end;
- Function Connect(Sock:longint;const addr: TInetSockAddr;var SockIn,SockOut:text):Boolean;
- begin
- Connect:=DoConnect(Sock,addr);
- If Connect then
- Sock2Text(Sock,SockIn,SockOut);
- end;
- Function Connect(Sock:longint;const addr:TInetSockAddr;var SockIn,SockOut:file):Boolean;
- begin
- Connect:=DoConnect(Sock,addr);
- If Connect then
- Sock2File(Sock,SockIn,SockOut);
- 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.4 2000-01-07 16:41:36 daniel
- * copyright 2000
- Revision 1.3 2000/01/07 16:32:25 daniel
- * copyright 2000 added
- Revision 1.2 1999/07/03 15:16:45 michael
- + Fixed Connect call
- Revision 1.1 1999/06/21 12:26:27 florian
- + files created by splitting the linux sockets unit
- }
|