diff --git a/rtl/unix/unix.pp b/rtl/unix/unix.pp index 402a940c4e..7525a449ff 100644 --- a/rtl/unix/unix.pp +++ b/rtl/unix/unix.pp @@ -142,19 +142,20 @@ function CreateShellArgV(const prog:Ansistring):ppchar; //Procedure Execve(Path: pathstr;args:ppchar;ep:ppchar); //Procedure Execve(Path: AnsiString;args:ppchar;ep:ppchar); //Procedure Execve(path: pchar;args:ppchar;ep:ppchar); -Procedure Execv(const path:pathstr;args:ppchar); -Procedure Execv(const path: AnsiString;args:ppchar); -Procedure Execvp(Path: Pathstr;Args:ppchar;Ep:ppchar); -Procedure Execvp(Path: AnsiString; Args:ppchar;Ep:ppchar); -Procedure Execl(const Todo: String); -Procedure Execl(const Todo: Ansistring); -Procedure Execle(Todo: String;Ep:ppchar); -Procedure Execle(Todo: AnsiString;Ep:ppchar); -Procedure Execlp(Todo: string;Ep:ppchar); -Procedure Execlp(Todo: Ansistring;Ep:ppchar); +Function Execv(const path:pathstr;args:ppchar):cint; +Function Execv(const path: AnsiString;args:ppchar):cint; +Function Execvp(Path: Pathstr;Args:ppchar;Ep:ppchar):cint; +Function Execvp(Path: AnsiString; Args:ppchar;Ep:ppchar):cint; +Function Execl(const Todo: String):cint; +Function Execl(const Todo: Ansistring):cint; +Function Execle(Todo: String;Ep:ppchar):cint; +Function Execle(Todo: AnsiString;Ep:ppchar):cint; +Function Execlp(Todo: string;Ep:ppchar):cint; +Function Execlp(Todo: Ansistring;Ep:ppchar):cint; Function Shell(const Command:String):Longint; 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} @@ -366,15 +367,15 @@ begin end; end; -Procedure Execv(const path: AnsiString;args:ppchar); +Function Execv(const path: AnsiString;args:ppchar):cint; { Overloaded ansistring version. } begin - fpExecVe(Path,Args,envp) + Execv:=fpExecVe(Path,Args,envp); end; -Procedure Execvp(Path: AnsiString; Args:ppchar;Ep:ppchar); +Function Execvp(Path: AnsiString; Args:ppchar;Ep:ppchar):cint; { Overloaded ansistring version } @@ -391,22 +392,25 @@ begin else Path:=''; if Path='' then - linuxerror:=ESysEnoent + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end else - fpExecve(Path,args,ep);{On error linuxerror will get set there} + Execvp:=fpExecve(Path,args,ep); end; -Procedure Execv(const path:pathstr;args:ppchar); +Function Execv(const path:pathstr;args:ppchar):cint; { Replaces the current program by the program specified in path, arguments in args are passed to Execve. the current environment is passed on. } begin - fpExecve(path,args,envp); {On error linuxerror will get set there} + Execv:=fpExecve(path,args,envp); end; -Procedure Execvp(Path:Pathstr;Args:ppchar;Ep:ppchar); +Function Execvp(Path:Pathstr;Args:ppchar;Ep:ppchar):cint; { This does the same as Execve, only it searches the PATH environment for the place of the Executable, except when Path starts with a slash. @@ -425,12 +429,15 @@ begin else Path:=''; if Path='' then - linuxerror:=ESysEnoent + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end else - fpExecve(Path,args,ep);{On error linuxerror will get set there} + execvp:=fpExecve(Path,args,ep); end; -Procedure Execle(Todo:string;Ep:ppchar); +Function Execle(Todo:string;Ep:ppchar):cint; { This procedure takes the string 'Todo', parses it for command and command options, and Executes the command with the given options. @@ -444,11 +451,15 @@ var begin p:=StringToPPChar(ToDo); if (p=nil) or (p^=nil) then - exit; - fpExecVE(p^,p,EP); + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end + else + execle:=fpExecVE(p^,p,EP); end; -Procedure Execle(Todo:AnsiString;Ep:ppchar); +function Execle(Todo:AnsiString;Ep:ppchar):cint; { This procedure takes the string 'Todo', parses it for command and command options, and Executes the command with the given options. @@ -462,11 +473,14 @@ var begin p:=StringToPPChar(ToDo); if (p=nil) or (p^=nil) then - exit; - fpExecVE(p^,p,EP); + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end; + ExecLe:=fpExecVE(p^,p,EP); end; -Procedure Execl(const Todo:string); +Function Execl(const Todo:string):cint; { This procedure takes the string 'Todo', parses it for command and command options, and Executes the command with the given options. @@ -476,10 +490,10 @@ Procedure Execl(const Todo:string); The current environment is passed on to command } begin - ExecLE(ToDo,EnvP); + Execl:=ExecLE(ToDo,EnvP); end; -Procedure Execlp(Todo:string;Ep:ppchar); +Function Execlp(Todo:string;Ep:ppchar):cint; { This procedure takes the string 'Todo', parses it for command and command options, and Executes the command with the given options. @@ -493,11 +507,14 @@ var begin p:=StringToPPchar(todo); if (p=nil) or (p^=nil) then - exit; - ExecVP(StrPas(p^),p,EP); + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end; + Execlp:=ExecVP(StrPas(p^),p,EP); end; -Procedure Execlp(Todo: Ansistring;Ep:ppchar); +Function Execlp(Todo: Ansistring;Ep:ppchar):cint; { Overloaded ansistring version. } @@ -506,11 +523,14 @@ var begin p:=StringToPPchar(todo); if (p=nil) or (p^=nil) then - exit; - ExecVP(StrPas(p^),p,EP); + Begin + fpsetErrno(ESysEnoEnt); + Exit(-1); + end; + execlp:=ExecVP(StrPas(p^),p,EP); end; -Function Shell(const Command:String):Longint; +Function Shell(const Command:String):cint; { Executes the shell, and passes it the string Command. (Through /bin/sh -c) The current environment is passed to the shell. @@ -537,13 +557,13 @@ begin fpExit(127); // was Exit(127) end else if (pid<>-1) then // Successfull started - Shell:=WaitProcess(pid) {Linuxerror is set there} + Shell:=WaitProcess(pid) else // no success Shell:=-1; // indicate an error FreeShellArgV(p); end; -Function Shell(const Command:AnsiString):Longint; +Function Shell(const Command:AnsiString):cint; { AnsiString version of Shell } @@ -559,7 +579,7 @@ begin { Changes as above } fpExit(127); // was exit(127)!! We must exit the Process, not the function end else if (pid<>-1) then // Successfull started - Shell:=WaitProcess(pid) {Linuxerror is set there} + Shell:=WaitProcess(pid) else // no success Shell:=-1; FreeShellArgV(p); @@ -652,9 +672,7 @@ End; {$ifdef linux} Function stime (t : longint) : Boolean; begin - do_SysCall(Syscall_nr_stime,longint(@t)); - linuxerror:=fpgeterrno;; - stime:=linuxerror=0; + stime:=do_SysCall(Syscall_nr_stime,longint(@t))=0; end; {$endif} {$endif} @@ -694,14 +712,14 @@ end; FileSystem calls ******************************************************************************} -Procedure Execl(const Todo:Ansistring); +Function Execl(const Todo:Ansistring):cint; { Overloaded AnsiString Version of ExecL. } begin - ExecLE(ToDo,EnvP); + Execl:=ExecLE(ToDo,EnvP); end; Function Flock (var T : text;mode : longint) : boolean; @@ -721,7 +739,7 @@ Var begin if textrec(t).mode=fmclosed then begin - LinuxError:=ESysEBADF; + fpseterrno(ESysEBADF); exit(-1); end; FpFD_ZERO(f); @@ -800,33 +818,37 @@ begin end; end; -Procedure IOPipe(var F:text); +Function IOPipe(var F:text):cint; begin + IOPipe:=0; case textrec(f).mode of fmoutput : begin { first check if we need something to write, else we may get a SigPipe when Close() is called (PFV) } if textrec(f).bufpos>0 then - fpwrite(textrec(f).handle,pchar(textrec(f).bufptr),textrec(f).bufpos); + IOPipe:=fpwrite(textrec(f).handle,pchar(textrec(f).bufptr),textrec(f).bufpos); end; - fminput : - textrec(f).bufend:=fpread(textrec(f).handle,pchar(textrec(f).bufptr),textrec(f).bufsize); + fminput : Begin + textrec(f).bufend:=fpread(textrec(f).handle,pchar(textrec(f).bufptr),textrec(f).bufsize); + IOPipe:=textrec(f).bufend; + End; end; textrec(f).bufpos:=0; end; -Procedure FlushPipe(var F:Text); +Function FlushPipe(var F:Text):cint; begin + FlushPipe:=0; if (textrec(f).mode=fmoutput) and (textrec(f).bufpos<>0) then - IOPipe(f); + FlushPipe:=IOPipe(f); textrec(f).bufpos:=0; end; -Procedure ClosePipe(var F:text); +Function ClosePipe(var F:text):cint; begin textrec(f).mode:=fmclosed; - fpclose(textrec(f).handle); + ClosePipe:=fpclose(textrec(f).handle); end; Function AssignPipe(var pipe_in,pipe_out:text):boolean; @@ -868,7 +890,7 @@ Function AssignPipe(var pipe_in,pipe_out:file):boolean; { 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. - If the operation was unsuccesful, linuxerror is set. + If the operation was unsuccesful, } var f_in,f_out : longint; @@ -1715,7 +1737,10 @@ End. { $Log$ - Revision 1.43 2003-11-03 09:42:28 marco + Revision 1.44 2003-11-12 22:19:45 marco + * more linuxeror fixes + + Revision 1.43 2003/11/03 09:42:28 marco * Peter's Cardinal<->Longint fixes patch Revision 1.42 2003/10/30 16:42:58 marco