mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-07 09:50:38 +02:00
* Only "difficult" functions + execvp + termios + rewinddir left to do
This commit is contained in:
parent
ef03d83a76
commit
21fb7bbb50
@ -16,9 +16,10 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$i syscallh.inc}
|
||||
{$i sysnr.inc}
|
||||
{$i bsdsysch.inc}
|
||||
{$i syscallh.inc} // do_syscall declarations themselves
|
||||
{$i sysnr.inc} // syscall numbers.
|
||||
{$i bsdsysch.inc} // external interface to syscalls in system unit.
|
||||
{$i posixunx.inc} // generic calls. (like getenv)
|
||||
|
||||
Function sys_Kill(Pid:pid_t;Sig:cint):cint;
|
||||
{
|
||||
@ -455,16 +456,65 @@ begin
|
||||
sys_fcntl:=do_syscall(syscall_nr_fcntl,fildes,cmd);
|
||||
end;
|
||||
|
||||
function sys_execve(path:pchar;argv:ppchar;envp:ppchar):cint
|
||||
function sys_execve(path:pchar;argv:ppchar;envp:ppchar):cint;
|
||||
|
||||
Begin
|
||||
sys_execve:=do_syscall(syscall_nr_Execve,longint(path),longint(argv),longint(envp));
|
||||
sys_execve:=do_syscall(syscall_nr_Execve,longint(path),longint(argv),longint(envp));
|
||||
End;
|
||||
|
||||
function sys_execv(path:pchar;argv:ppchar):cint;
|
||||
|
||||
Begin
|
||||
sys_execv:=do_syscall(syscall_nr_Execve,longint(path),longint(argv),longint(envp));
|
||||
End;
|
||||
|
||||
CONST RUSAGE_SELF = 0;
|
||||
RUSAGE_CHILDREN = -1;
|
||||
|
||||
function sys_getrusage(who:cint;var ru : rusage):cint;
|
||||
|
||||
begin
|
||||
sys_getrusage:=do_syscall(syscall_nr_getrusage,longint(who),longint(@ru));
|
||||
end;
|
||||
|
||||
function sys_times(var buffer : tms):clock_t;
|
||||
|
||||
var ru : rusage;
|
||||
t : timeval;
|
||||
|
||||
CONST CLK_TCK=128;
|
||||
|
||||
function CONVTCK(r:timeval):clock_t;
|
||||
{
|
||||
* Convert usec to clock ticks; could do (usec * CLK_TCK) / 1000000,
|
||||
* but this would overflow if we switch to nanosec.
|
||||
}
|
||||
begin
|
||||
CONVTCK:=(r.tv_sec * CLK_TCK + r.tv_usec DIV (1000000 DIV CLK_TCK));
|
||||
end;
|
||||
|
||||
begin
|
||||
|
||||
if (sys_getrusage(RUSAGE_SELF, ru) < 0) Then
|
||||
exit(clock_t(-1));
|
||||
buffer.tms_utime := CONVTCK(ru.ru_utime);
|
||||
buffer.tms_stime := CONVTCK(ru.ru_stime);
|
||||
if (sys_getrusage(RUSAGE_CHILDREN, ru) < 0) Then
|
||||
exit(clock_t(-1));
|
||||
buffer.tms_cutime := CONVTCK(ru.ru_utime);
|
||||
buffer.tms_cstime := CONVTCK(ru.ru_stime);
|
||||
if do_syscall(syscall_nr_gettimeofday,longint(@t),0)<>0 Then
|
||||
exit(clock_t(-1));
|
||||
sys_times:=clock_t(CONVTCK(t));
|
||||
end;
|
||||
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.7 2002-10-27 11:58:29 marco
|
||||
Revision 1.8 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.7 2002/10/27 11:58:29 marco
|
||||
* Modifications from Saturday.
|
||||
|
||||
Revision 1.6 2002/10/26 18:27:51 marco
|
||||
|
@ -369,18 +369,19 @@ Begin
|
||||
do_syscall(syscall_nr_Execve,longint(@path[1]),longint(Argv),longint(envp));
|
||||
End;
|
||||
}
|
||||
|
||||
{
|
||||
function sys_execve(const path : pchar; const argv : ppchar; const envp: ppchar): cint; [public, alias : 'FPC_SYSC_EXECVE'];
|
||||
}
|
||||
{
|
||||
Replaces the current program by the program specified in path,
|
||||
arguments in args are passed to Execve.
|
||||
environment specified in ep is passed on.
|
||||
}
|
||||
|
||||
{
|
||||
Begin
|
||||
do_syscall(syscall_nr_Execve,longint(path),longint(Argv),longint(envp));
|
||||
End;
|
||||
|
||||
}
|
||||
function sys_waitpid(pid : pid_t; var stat_loc : cint; options: cint): pid_t; [public, alias : 'FPC_SYSC_WAITPID'];
|
||||
{
|
||||
Waits until a child with PID Pid exits, or returns if it is exited already.
|
||||
@ -573,7 +574,10 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.7 2002-10-27 11:58:29 marco
|
||||
Revision 1.8 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.7 2002/10/27 11:58:29 marco
|
||||
* Modifications from Saturday.
|
||||
|
||||
Revision 1.6 2002/10/26 18:27:51 marco
|
||||
|
@ -40,9 +40,33 @@ Type
|
||||
ptimezone =^timezone;
|
||||
TTimeZone = timezone;
|
||||
|
||||
rusage = packed record
|
||||
ru_utime : timeval; { user time used }
|
||||
ru_stime : timeval; { system time used }
|
||||
ru_maxrss : clong; { max resident set size }
|
||||
ru_ixrss : clong; { integral shared memory size }
|
||||
ru_idrss : clong; { integral unshared data " }
|
||||
ru_isrss : clong; { integral unshared stack " }
|
||||
ru_minflt : clong; { page reclaims }
|
||||
ru_majflt : clong; { page faults }
|
||||
ru_nswap : clong; { swaps }
|
||||
ru_inblock : clong; { block input operations }
|
||||
ru_oublock : clong; { block output operations }
|
||||
ru_msgsnd : clong; { messages sent }
|
||||
ru_msgrcv : clong; { messages received }
|
||||
ru_nsignals : clong; { signals received }
|
||||
ru_nvcsw : clong; { voluntary context switches }
|
||||
ru_nivcsw : clong; { involuntary " }
|
||||
end;
|
||||
// #define ru_last ru_nivcsw
|
||||
// #define ru_first ru_ixrss
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 2002-10-27 11:58:30 marco
|
||||
Revision 1.4 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.3 2002/10/27 11:58:30 marco
|
||||
* Modifications from Saturday.
|
||||
|
||||
Revision 1.2 2002/09/07 16:01:17 peter
|
||||
|
@ -51,7 +51,7 @@ Uses Sysctl;
|
||||
function sys_rename(const old : pchar; const newpath: pchar): cint; cdecl;external name 'rename';
|
||||
function sys_fstat(fd : cint; var sb : stat): cint; cdecl; external name 'fstat';
|
||||
function sys_fork : pid_t; cdecl; external name 'fork';
|
||||
function sys_execve(const path : pchar; const argv : ppchar; const envp: ppchar): cint; cdecl; external name 'execve';
|
||||
function sys_execve(path : pchar; argv : ppchar; envp: ppchar): cint; cdecl; external name 'execve';
|
||||
function sys_waitpid(pid : pid_t; var stat_loc : cint; options: cint): pid_t; cdecl; external name 'waitpid';
|
||||
function sys_access(const pathname : pchar; amode : cint): cint; cdecl; external name 'access';
|
||||
function sys_uname(var name: utsname): cint; cdecl; external name 'uname';
|
||||
@ -82,7 +82,7 @@ function sys_sigaction(sig: cint; var act : sigactionrec; var oact : sigactionre
|
||||
function sys_ftruncate(fd : cint; flength : off_t): cint; external name 'FPC_SYSC_FTRUNCATE';
|
||||
function sys_fstat(fd : cint; var sb : stat): cint; external name 'FPC_SYSC_FSTAT';
|
||||
function sys_fork : pid_t; external name 'FPC_SYSC_FORK';
|
||||
function sys_execve(const path : pchar; const argv : ppchar; const envp: ppchar): cint; external name 'FPC_SYSC_EXECVE';
|
||||
// function sys_execve(path : pchar; argv : ppchar;envp: ppchar): cint; external name 'FPC_SYSC_EXECVE';
|
||||
function sys_waitpid(pid : pid_t; var stat_loc : cint; options: cint): pid_t; external name 'FPC_SYSC_WAITPID';
|
||||
function sys_access(const pathname : pchar; amode : cint): cint;external name 'FPC_SYSC_ACCESS';
|
||||
function sys_Dup(fildes:cint):cint; external name 'FPC_SYSC_DUP';
|
||||
@ -96,7 +96,10 @@ procedure seterrno (i:cint); external name 'FPC_SYS_SETERRNO';
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.7 2002-10-27 11:58:30 marco
|
||||
Revision 1.8 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.7 2002/10/27 11:58:30 marco
|
||||
* Modifications from Saturday.
|
||||
|
||||
Revision 1.6 2002/10/26 18:27:51 marco
|
||||
|
@ -101,6 +101,15 @@ TYPE
|
||||
l_whence: cshort; { type of l_start }
|
||||
end;
|
||||
|
||||
|
||||
tms = packed record
|
||||
tms_utime : clock_t; { User CPU time }
|
||||
tms_stime : clock_t; { System CPU time }
|
||||
tms_cutime : clock_t; { User CPU time of terminated child procs }
|
||||
tms_cstime : clock_t; { System CPU time of terminated child procs }
|
||||
end;
|
||||
|
||||
|
||||
{***********************************************************************}
|
||||
{ POSIX CONSTANT ROUTINE DEFINITIONS }
|
||||
{***********************************************************************}
|
||||
@ -155,7 +164,10 @@ CONST
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.5 2002-10-27 11:58:30 marco
|
||||
Revision 1.6 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.5 2002/10/27 11:58:30 marco
|
||||
* Modifications from Saturday.
|
||||
|
||||
Revision 1.4 2002/09/07 16:01:17 peter
|
||||
|
@ -39,6 +39,8 @@ type
|
||||
cuint = Cardinal; { minimum range is : 32-bit }
|
||||
clong = longint;
|
||||
culong = Cardinal;
|
||||
cshort = integer;
|
||||
cushort= word;
|
||||
|
||||
dev_t = cuint32; { used for device numbers }
|
||||
gid_t = cuint32; { used for group IDs }
|
||||
@ -50,6 +52,7 @@ type
|
||||
size_t = cuint32; { as definied in the C standard}
|
||||
ssize_t = cint32; { used by function for returning number of bytes }
|
||||
uid_t = cuint32; { used for user ID type }
|
||||
clock_t = culong;
|
||||
|
||||
time_t = clong; { used for returning the time }
|
||||
socklen_t= cuint32;
|
||||
|
@ -89,7 +89,6 @@ const
|
||||
syscall_nr_getpriority =100;
|
||||
syscall_nr_setsockopt =105;
|
||||
syscall_nr_gettimeofday =116;
|
||||
syscall_nr_getrusage =117;
|
||||
syscall_nr_readv =120;
|
||||
syscall_nr_writev =121;
|
||||
syscall_nr_settimeofday =122;
|
||||
@ -99,7 +98,6 @@ const
|
||||
syscall_nr_setregid =127;
|
||||
syscall_nr_rename =128;
|
||||
syscall_nr_flock =131;
|
||||
syscall_nr_mkfifo =132;
|
||||
syscall_nr_mkdir =136;
|
||||
syscall_nr_rmdir =137;
|
||||
syscall_nr_utimes =138;
|
||||
@ -235,6 +233,7 @@ syscall_nr_getdirentries =196;
|
||||
}
|
||||
|
||||
{More or less checked BSD syscalls}
|
||||
syscall_nr_mkfifo =132;
|
||||
syscall_nr___getcwd =326;
|
||||
syscall_nr_getitimer = 86;
|
||||
syscall_nr_setitimer = 83;
|
||||
@ -314,11 +313,15 @@ syscall_nr_getdirentries =196;
|
||||
syscall_nr_getsockopt = 118;
|
||||
syscall_nr_rfork = 251;
|
||||
syscall_nr_nanosleep = 240;
|
||||
syscall_nr_getrusage =117;
|
||||
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.8 2002-10-26 18:27:52 marco
|
||||
Revision 1.9 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.8 2002/10/26 18:27:52 marco
|
||||
* First series POSIX calls commits. Including getcwd.
|
||||
|
||||
Revision 1.7 2002/09/07 16:01:18 peter
|
||||
|
@ -434,7 +434,7 @@ Begin
|
||||
InOutRes:=3;
|
||||
End;
|
||||
|
||||
{$define usegetcwd}
|
||||
{ // $define usegetcwd}
|
||||
|
||||
procedure getdir(drivenr : byte;var dir : shortstring);
|
||||
var
|
||||
@ -657,7 +657,10 @@ End.
|
||||
*)
|
||||
{
|
||||
$Log$
|
||||
Revision 1.5 2002-10-26 18:27:52 marco
|
||||
Revision 1.6 2002-10-27 17:21:29 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.5 2002/10/26 18:27:52 marco
|
||||
* First series POSIX calls commits. Including getcwd.
|
||||
|
||||
Revision 1.4 2002/09/07 16:01:26 peter
|
||||
|
@ -15,6 +15,53 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
function InternalCreateShellArgV(cmd:pChar; len:longint):ppchar;
|
||||
{
|
||||
Create an argv which executes a command in a shell using /bin/sh -c
|
||||
}
|
||||
const Shell = '/bin/sh'#0'-c'#0;
|
||||
var
|
||||
pp,p : ppchar;
|
||||
// temp : string; !! Never pass a local var back!!
|
||||
begin
|
||||
getmem(pp,4*4);
|
||||
p:=pp;
|
||||
p^:=@Shell[1];
|
||||
inc(p);
|
||||
p^:=@Shell[9];
|
||||
inc(p);
|
||||
getmem(p^,len+1);
|
||||
move(cmd^,p^^,len);
|
||||
pchar(p^)[len]:=#0;
|
||||
inc(p);
|
||||
p^:=Nil;
|
||||
InternalCreateShellArgV:=pp;
|
||||
end;
|
||||
|
||||
function CreateShellArgV(const prog:string):ppchar;
|
||||
begin
|
||||
CreateShellArgV:=InternalCreateShellArgV(@prog[1],length(prog));
|
||||
end;
|
||||
|
||||
function CreateShellArgV(const prog:Ansistring):ppchar;
|
||||
{
|
||||
Create an argv which executes a command in a shell using /bin/sh -c
|
||||
using a AnsiString;
|
||||
}
|
||||
begin
|
||||
CreateShellArgV:=InternalCreateShellArgV(@prog[1],length(prog)); // if ppc works like delphi this also work when @prog[1] is invalid (len=0)
|
||||
end;
|
||||
|
||||
|
||||
procedure FreeShellArgV(p:ppchar);
|
||||
begin
|
||||
if (p<>nil) then begin
|
||||
freemem(p[2]);
|
||||
freemem(p);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Function sys_getenv(const name:pchar):pchar;
|
||||
|
||||
var
|
||||
@ -66,7 +113,10 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 2002-10-27 13:16:54 marco
|
||||
Revision 1.2 2002-10-27 17:21:30 marco
|
||||
* Only "difficult" functions + execvp + termios + rewinddir left to do
|
||||
|
||||
Revision 1.1 2002/10/27 13:16:54 marco
|
||||
* Routines that certainly will be shared between Linux and *BSD
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user