* a few functions added.

This commit is contained in:
marco 2000-02-04 12:05:04 +00:00
parent 84ad19e224
commit aa8b9730a1

View File

@ -614,11 +614,13 @@ function AssignStream(var StreamIn, StreamOut, StreamErr: Text; const prog: Stri
General information
***************************}
{
Function GetDomainName:String;
Function GetHostName:String;
Function GetEnv(P:string):Pchar;
Function Sysinfo(var Info:TSysinfo):Boolean;
Function Uname(var unamerec:utsname):Boolean;
}
Function GetEnv(P:string):Pchar;
{**************************
Signal
@ -628,7 +630,7 @@ Procedure SigAction(Signum:Integer;Var Act,OldAct:PSigActionRec );
Procedure SigProcMask (How:Integer;SSet,OldSSet:PSigSet);
Function SigPending:SigSet;
Procedure SigSuspend(Mask:Sigset);
Function Signal(Signum:Integer;Handler:SignalHandler):SignalHandler;
//Function Signal(Signum:Integer;Handler:SignalHandler):SignalHandler;
Function Kill(Pid:longint;Sig:integer):integer;
Procedure SigRaise(Sig:integer);
Function Alarm(Sec : Longint) : longint;
@ -2125,7 +2127,7 @@ begin
Dup2:=Dup2(filerec(oldfile).handle,filerec(newfile).handle);
end;
{
Function Select(N:longint;readfds,writefds,exceptfds:PFDSet;TimeOut:PTimeVal):longint;
{
Select checks whether the file descriptor sets in readfs/writefs/exceptfs
@ -2165,7 +2167,7 @@ begin
end;
Select:=Select(N,Readfds,WriteFds,ExceptFds,p);
end;
}
Function SelectText(var T:Text;TimeOut :PTimeval):Longint;
@ -2295,18 +2297,24 @@ Function AssignPipe(var pipe_in,pipe_out:longint):boolean;
}
var
pip : tpipe;
regs : SysCallregs;
retval : LONGINT;
begin
regs.reg2:=longint(@pip);
SysCall(SysCall_nr_pipe,regs);
pipe_in:=pip[1];
pipe_out:=pip[2];
linuxerror:=errno;
AssignPipe:=(LinuxError=0);
asm
lea pip,%ebx
push %ebx
mov $42,%eax
int $0x80
addl $4,%esp
mov %eax,retval
end;
checkreturnvalue(retval,retval);
LinuxError:=Errno;
pipe_in:=pip[1];
pipe_out:=pip[2];
AssignPipe:=(LinuxError=0);
end;
Function AssignPipe(var pipe_in,pipe_out:text):boolean;
{
Sets up a pair of file variables, which act as a pipe. The first one can
@ -2375,12 +2383,17 @@ end;
Function PClose(Var F:text) :longint;
var
sr : syscallregs;
pl : ^longint;
res : longint;
begin
sr.reg2:=Textrec(F).Handle;
SysCall (syscall_nr_close,sr);
res:=Textrec(F).Handle;
asm
push res
mov $6,%eax
int $0x80
add $4,%esp
end;
{ closed our side, Now wait for the other - this appears to be needed ?? }
pl:=@(textrec(f).userdata[2]);
waitpid(pl^,@res,0);
@ -2390,19 +2403,23 @@ end;
Function PClose(Var F:file) : longint;
var
sr : syscallregs;
pl : ^longint;
res : longint;
begin
sr.reg2:=FileRec(F).Handle;
SysCall (Syscall_nr_close,sr);
res:=filerec(F).Handle;
asm
push res
mov $6,%eax
int $0x80
add $4,%esp
end;
{ closed our side, Now wait for the other - this appears to be needed ?? }
pl:=@(filerec(f).userdata[2]);
waitpid(pl^,@res,0);
pclose:=res shr 8;
end;
Procedure PCloseText(Var F:text);
{
May not use @PClose due overloading
@ -2411,8 +2428,6 @@ begin
PClose(f);
end;
Procedure POpen(var F:text;const Prog:String;rw:char);
{
Starts the program in 'Prog' and makes it's input or out put the
@ -2577,17 +2592,26 @@ end;
Function mkFifo(pathname:string;mode:longint):boolean;
var
regs : SysCallRegs;
var retval : LONGINT;
begin
pathname:=pathname+#0;
regs.reg2:=longint(@pathname[1]);
regs.reg3:=mode or STAT_IFIFO;
regs.reg4:=0;
mkFifo:=(SysCall(syscall_nr_mknod,regs)=0);
asm
lea %ecx,pathname
inc %ecx
push $0
mov mode,%ebx
or STAT_IFIFO,%ebx
push %ebx
push %ecx
mov $14,$eax
int $0x80
addl $12,%esp
mov %eax,retval
end;
mkfifo:=checkreturnvalue(retval,retval)=0;
LinuxError:=Errno;
end;
Procedure AssignStream(Var StreamIn,Streamout:text;Const Prog:String);
{
Starts the program in 'Prog' and makes its input and output the
@ -2754,6 +2778,7 @@ end;
General information calls
******************************************************************************}
{
Function Sysinfo(var Info:TSysinfo):Boolean;
{
Get system info
@ -2764,9 +2789,9 @@ Begin
regs.reg2:=longint(@info);
Sysinfo:=SysCall(SysCall_nr_Sysinfo,regs)=0;
End;
}
{
Function Uname(var unamerec:utsname):Boolean;
{
Get machine's names
@ -2778,7 +2803,7 @@ Begin
Uname:=SysCall(SysCall_nr_uname,regs)=0;
LinuxError:=Errno;
End;
}
Function GetEnv(P:string):Pchar;
@ -2810,7 +2835,7 @@ Begin
getenv:=nil;
end;
{
Function GetDomainName:String;
{
@ -2827,8 +2852,6 @@ begin
getdomainname:=strpas(@Sysn.domainname[0]);
end;
Function GetHostName:String;
{
Get machines name. Returns empty string if not set.
@ -2843,7 +2866,7 @@ begin
else
gethostname:=strpas(@Sysn.nodename[0]);
end;
}
{******************************************************************************
Signal handling calls
@ -2858,19 +2881,23 @@ Function Kill(Pid:longint;Sig:integer):integer;
Return value is zero, except for case three, where the return value
is the number of processes to which the signal was sent.
}
var
regs : Syscallregs;
var retval : LONGINT;
begin
regs.reg2:=Pid;
regs.reg3:=Sig;
kill:=SysCall(Syscall_nr_kill,regs);
if kill<0 then
Kill:=0;
linuxerror:=errno;
asm
push Sig
push Pid
mov $37,$eax
int $0x80
addl $8,%esp
mov %eax,retval
end;
Kill:=checkreturnvalue(retval,retval);
if kill<0 THEN
Kill:=0;
LinuxError:=Errno;
end;
Procedure SigAction(Signum:Integer;Var Act,OldAct:PSigActionRec );
{
Change action of process upon receipt of a signal.
@ -2878,18 +2905,24 @@ Procedure SigAction(Signum:Integer;Var Act,OldAct:PSigActionRec );
If Act is non-nil, it is used to specify the new action.
If OldAct is non-nil the previous action is saved there.
}
Var
sr : Syscallregs;
var retval : LONGINT;
begin
sr.reg2:=Signum;
sr.reg3:=Longint(act);
sr.reg4:=Longint(oldact);
SysCall(Syscall_nr_sigaction,sr);
linuxerror:=errno;
asm
push oldact
push act
push signum
mov $46,$eax
int $0x80
addl $12,%esp
mov %eax,retval
end;
SigAction:=checkreturnvalue(retval,retval);
if kill<0 THEN
Kill:=0;
LinuxError:=Errno;
end;
Procedure SigProcMask(How:Integer;SSet,OldSSet:PSigSet);
{
Change the list of currently blocked signals.
@ -2899,58 +2932,68 @@ Procedure SigProcMask(How:Integer;SSet,OldSSet:PSigSet);
SigSetMask : Set the list of blocked signals to SSet
if OldSSet is non-null, the old set will be saved there.
}
Var
sr : SyscallRegs;
VAR retval : LONGINT;
begin
sr.reg2:=how;
sr.reg3:=longint(SSet);
sr.reg4:=longint(OldSSet);
SysCall(Syscall_nr_sigprocmask,sr);
linuxerror:=errno;
asm
push OldSSet
push SSet
push How
mov $48,%eax
int $0x80
addl $12,%esp
mov %eax,retval
end;
SigProcMask:=checkreturnvalue(retval,retval);
LinuxError:=Errno;
end;
Function SigPending:SigSet;
{
Allows examination of pending signals. The signal mask of pending
signals is set in SSet
}
Var
sr : SyscallRegs;
dummy : Sigset;
retval: LONGINT;
begin
sr.reg2:=longint(@dummy);
SysCall(Syscall_nr_sigpending,sr);
linuxerror:=errno;
Sigpending:=dummy;
asm
push dummy
mov $52,%eax
int $0x80
addl $4,%esp
end;
sigpending:=checkreturnvalue(retval,dummy);
LinuxError:=Errno;
end;
Procedure SigSuspend(Mask:Sigset);
{
Set the signal mask with Mask, and suspend the program until a signal
is received.
}
Var
sr : SyscallRegs;
retval: LONGINT;
begin
sr.reg2:=mask;
SysCall(Syscall_nr_sigsuspend,sr);
linuxerror:=errno;
asm
push mask
mov $111,%eax
int $0x80
addl $4,%esp
mov %eax,retval
end;
checkreturnvalue(retval,retval);
LinuxError:=Errno;
end;
{
Function Signal(Signum:Integer;Handler:SignalHandler):SignalHandler;
{
Install a new handler for signal Signum.
The old signal handler is returned.
This call does, in fact, the same as SigAction.
}
var
sr : Syscallregs;
begin
sr.reg2:=signum;
sr.reg3:=longint(handler);
@ -2966,7 +3009,7 @@ begin
linuxerror:=0;
end;
end;
}
procedure SigRaise(sig:integer);
begin
@ -3996,7 +4039,10 @@ End.
{
$Log$
Revision 1.1 2000-02-03 17:03:36 marco
Revision 1.2 2000-02-04 12:05:04 marco
* a few functions added.
Revision 1.1 2000/02/03 17:03:36 marco
* initial version. Ported till line +/- 2000