* small fi

This commit is contained in:
marco 2003-11-13 18:44:06 +00:00
parent 5526f18914
commit 11715d3922

View File

@ -158,7 +158,7 @@ Function Shell(const Command:AnsiString):Longint;
{Clone for FreeBSD is copied from the LinuxThread port, and rfork based}
function Clone(func:TCloneFunc;sp:pointer;flags:longint;args:pointer):longint;
Function WaitProcess(Pid:longint):Longint; { like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
Function WaitProcess(Pid:longint):cint; { like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
Function WIFSTOPPED(Status: Integer): Boolean;
Function W_EXITCODE(ReturnCode, Signal: Integer): Integer;
@ -191,13 +191,13 @@ function TellDir(p:pdir):longint;
Pipe/Fifo/Stream
***************************}
Function AssignPipe(var pipe_in,pipe_out:longint):boolean;
Function AssignPipe(var pipe_in,pipe_out:text):boolean;
Function AssignPipe(var pipe_in,pipe_out:file):boolean;
Function PClose(Var F:text) : longint;
Function PClose(Var F:file) : longint;
Procedure POpen(var F:text;const Prog:String;rw:char);
Procedure POpen(var F:file;const Prog:String;rw:char);
Function AssignPipe(var pipe_in,pipe_out:longint):cint;
Function AssignPipe(var pipe_in,pipe_out:text):cint;
Function AssignPipe(var pipe_in,pipe_out:file):cint;
Function PClose(Var F:text) : cint;
Function PClose(Var F:file) : cint;
Function POpen(var F:text;const Prog:String;rw:char):cint;
Function POpen(var F:file;const Prog:String;rw:char):cint;
function AssignStream(Var StreamIn,Streamout:text;Const Prog:String) : longint;
function AssignStream(var StreamIn, StreamOut, StreamErr: Text; const prog: String): LongInt;
@ -297,7 +297,7 @@ Function getenv(name:string):Pchar; external name 'FPC_SYSC_FPGETENV';
******************************************************************************}
{ Most calls of WaitPID do not handle the result correctly, this funktion treats errors more correctly }
Function WaitProcess(Pid:longint):Longint; { like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
Function WaitProcess(Pid:longint):cint; { like WaitPid(PID,@result,0) Handling of Signal interrupts (errno=EINTR), returning the Exitcode of Process (>=0) or -Status if terminated}
var r,s : LongInt;
begin
repeat
@ -305,7 +305,7 @@ begin
r:=fpWaitPid(Pid,@s,0);
until (r<>-1) or (LinuxError<>ESysEINTR);
if (r=-1) or (r=0) then // 0 is not a valid return and should never occur (it means status invalid when using WNOHANG)
WaitProcess:=-1 // return -1 to indicate an error
WaitProcess:=-1 // return -1 to indicate an error. fpwaitpid updated it.
else
begin
{$ifndef Solaris}
@ -851,7 +851,7 @@ begin
ClosePipe:=fpclose(textrec(f).handle);
end;
Function AssignPipe(var pipe_in,pipe_out:text):boolean;
Function AssignPipe(var pipe_in,pipe_out:text):cint;
{
Sets up a pair of file variables, which act as a pipe. The first one can
be read from, the second one can be written to.
@ -860,11 +860,8 @@ Function AssignPipe(var pipe_in,pipe_out:text):boolean;
var
f_in,f_out : longint;
begin
if not AssignPipe(f_in,f_out) then
begin
AssignPipe:=false;
exit;
end;
if AssignPipe(f_in,f_out)=-1 then
exit(-1);
{ Set up input }
Assign(Pipe_in,'');
Textrec(Pipe_in).Handle:=f_in;
@ -883,10 +880,10 @@ begin
TextRec(Pipe_out).InOutFunc:=@IOPipe;
TextRec(Pipe_out).FlushFunc:=@FlushPipe;
TextRec(Pipe_out).CloseFunc:=@ClosePipe;
AssignPipe:=true;
AssignPipe:=0;
end;
Function AssignPipe(var pipe_in,pipe_out:file):boolean;
Function AssignPipe(var pipe_in,pipe_out:file):cint;
{
Sets up a pair of file variables, which act as a pipe. The first one can
be read from, the second one can be written to.
@ -895,11 +892,8 @@ Function AssignPipe(var pipe_in,pipe_out:file):boolean;
var
f_in,f_out : longint;
begin
if not AssignPipe(f_in,f_out) then
begin
AssignPipe:=false;
exit;
end;
if AssignPipe(f_in,f_out)=-1 then
exit(-1);
{ Set up input }
Assign(Pipe_in,'');
Filerec(Pipe_in).Handle:=f_in;
@ -912,18 +906,20 @@ begin
Filerec(Pipe_out).Mode:=fmoutput;
Filerec(Pipe_out).recsize:=1;
Filerec(Pipe_out).userdata[1]:=P_OUT;
AssignPipe:=true;
AssignPipe:=0;
end;
Procedure PCloseText(Var F:text);
Function PCloseText(Var F:text):cint;
{
May not use @PClose due overloading
}
begin
PClose(f);
PCloseText:=PClose(f);
end;
Procedure POpen(var F:text;const Prog:String;rw:char);
function POpen(var F:text;const Prog:String;rw:char):cint;
{
Starts the program in 'Prog' and makes it's input or out put the
other end of a pipe. If rw is 'w' or 'W', then whatever is written to
@ -934,26 +930,25 @@ Procedure POpen(var F:text;const Prog:String;rw:char);
var
pipi,
pipo : text;
pid : longint;
pl : ^longint;
pid : pid_t;
pl : ^cint;
pp : ppchar;
ret : cint;
begin
LinuxError:=0;
rw:=upcase(rw);
if not (rw in ['R','W']) then
begin
LinuxError:=ESysEnoent;
exit;
FpSetErrno(ESysEnoent);
exit(-1);
end;
AssignPipe(pipi,pipo);
if Linuxerror<>0 then
exit;
if AssignPipe(pipi,pipo)=-1 Then
Exit(-1);
pid:=fpfork;
if linuxerror<>0 then
if pid=-1 then
begin
close(pipi);
close(pipo);
exit;
exit(-1);
end;
if pid=0 then
begin
@ -961,17 +956,17 @@ begin
if rw='W' then
begin
close(pipo);
fpdup2(pipi,input);
ret:=fpdup2(pipi,input);
close(pipi);
if linuxerror<>0 then
if ret=-1 then
halt(127);
end
else
begin
close(pipi);
fpdup2(pipo,output);
ret:=fpdup2(pipo,output);
close(pipo);
if linuxerror<>0 then
if ret=-1 then
halt(127);
end;
pp:=createshellargv(prog);
@ -998,9 +993,10 @@ begin
pl^:=pid;
textrec(f).closefunc:=@PCloseText;
end;
ret:=0;
end;
Procedure POpen(var F:file;const Prog:String;rw:char);
Function POpen(var F:file;const Prog:String;rw:char):cint;
{
Starts the program in 'Prog' and makes it's input or out put the
other end of a pipe. If rw is 'w' or 'W', then whatever is written to
@ -1015,23 +1011,24 @@ var
pl : ^longint;
p,pp : ppchar;
temp : string[255];
ret : cint;
begin
LinuxError:=0;
rw:=upcase(rw);
if not (rw in ['R','W']) then
begin
LinuxError:=ESysEnoent;
exit;
FpSetErrno(ESysEnoent);
exit(-1);
end;
AssignPipe(pipi,pipo);
if Linuxerror<>0 then
exit;
ret:=AssignPipe(pipi,pipo);
if ret=-1 then
exit(-1);
pid:=fpfork;
if linuxerror<>0 then
if pid=-1 then
begin
close(pipi);
close(pipo);
exit;
exit(-1);
end;
if pid=0 then
begin
@ -1039,17 +1036,17 @@ begin
if rw='W' then
begin
close(pipo);
fpdup2(filerec(pipi).handle,stdinputhandle);
ret:=fpdup2(filerec(pipi).handle,stdinputhandle);
close(pipi);
if linuxerror<>0 then
if ret=-1 then
halt(127);
end
else
begin
close(pipi);
fpdup2(filerec(pipo).handle,stdoutputhandle);
ret:=fpdup2(filerec(pipo).handle,stdoutputhandle);
close(pipo);
if linuxerror<>0 then
if ret=1 then
halt(127);
end;
getmem(pp,sizeof(pchar)*4);
@ -1082,6 +1079,7 @@ begin
pl:=@(filerec(f).userdata[2]);
pl^:=pid;
end;
POpen:=0;
end;
Function AssignStream(Var StreamIn,Streamout:text;Const Prog:String) : longint;
@ -1261,9 +1259,9 @@ Function GetDomainName:String; { linux only!}
Var
Sysn : utsname;
begin
fpUname(Sysn);
linuxerror:=fpgeterrno;;
If linuxerror<>0 then
// fpUname(Sysn);
// linuxerror:=fpgeterrno;;
If fpUname(sysn)<>0 then
getdomainname:=''
else
getdomainname:=strpas(@Sysn.domain[0]);
@ -1481,8 +1479,8 @@ var
while (d<>nil) do
begin
name:=n+'/'+strpas(@(d^.d_name));
fpstat(name,st);
if linuxerror=0 then
// fpstat(name,st);
if fpstat(name,st)=0 then
begin
if (fpS_ISDIR(st.st_mode)) and { if it is a directory }
(strpas(@(d^.d_name))<>'.') and { but not ., .. and fd subdirs }
@ -1737,7 +1735,10 @@ End.
{
$Log$
Revision 1.44 2003-11-12 22:19:45 marco
Revision 1.45 2003-11-13 18:44:06 marco
* small fi
Revision 1.44 2003/11/12 22:19:45 marco
* more linuxeror fixes
Revision 1.43 2003/11/03 09:42:28 marco