* Only "difficult" functions + execvp + termios + rewinddir left to do

This commit is contained in:
marco 2002-10-27 17:21:29 +00:00
parent ef03d83a76
commit 21fb7bbb50
9 changed files with 173 additions and 21 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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