Pārlūkot izejas kodu

* more linuxeror fixes

marco 22 gadi atpakaļ
vecāks
revīzija
170190dc43
1 mainītis faili ar 79 papildinājumiem un 54 dzēšanām
  1. 79 54
      rtl/unix/unix.pp

+ 79 - 54
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