mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 14:59:33 +02:00
384 lines
8.8 KiB
PHP
384 lines
8.8 KiB
PHP
{
|
|
$Id$
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 2002 by Marco van de Voort
|
|
|
|
Some generic overloads for stringfunctions in the baseunix unit.
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
|
|
{$if defined(CPUARM) or defined(CPUX86_64) or defined(CPUSPARC)}
|
|
{$define RTSIGACTION}
|
|
{$endif}
|
|
|
|
{$I textrec.inc}
|
|
{$I filerec.inc}
|
|
|
|
Function FpLink (existing : AnsiString; newone : AnsiString): cInt;
|
|
Begin
|
|
FpLink:=FpLink(pchar(existing),pchar(newone));
|
|
End;
|
|
|
|
Function FpMkfifo (path : AnsiString; Mode : TMode): cInt;
|
|
Begin
|
|
FpMkfifo:=FpMkfifo(pchar(path),mode);
|
|
End;
|
|
|
|
Function FpChmod (path : AnsiString; Mode : TMode): cInt;
|
|
Begin
|
|
FpChmod:=FpChmod(pchar(path),mode);
|
|
End;
|
|
|
|
Function FpChown (path : AnsiString; owner : TUid; group : TGid): cInt;
|
|
Begin
|
|
FpChown:=FpChown(pchar(path),owner,group);
|
|
End;
|
|
|
|
Function FpUtime (path : AnsiString; times : putimbuf): cInt;
|
|
Begin
|
|
FpUtime:=FpUtime(pchar(path),times);
|
|
End;
|
|
|
|
{
|
|
Function FpGetcwd (path:AnsiString; siz:TSize):AnsiString;
|
|
Begin
|
|
FpGetcwd:=ansistring(pchar(FpGetcwd(pchar(path),siz)));
|
|
End;
|
|
}
|
|
Function FpGetcwd :AnsiString;
|
|
|
|
Var
|
|
Buf : Array[0..PATH_MAX+1] of char;
|
|
Begin
|
|
Buf[PATH_MAX+1]:=#0;
|
|
If FpGetcwd(@Buf[0],PATH_MAX)=Nil then
|
|
FpGetcwd:=''
|
|
else
|
|
FpGetcwd:=Buf;
|
|
End;
|
|
|
|
Function FpExecve (path : AnsiString; argv : ppchar; envp: ppchar): cInt;
|
|
Begin
|
|
FpExecve:=FpExecve (pchar(path),argv,envp);
|
|
End;
|
|
|
|
Function FpExecv (path : AnsiString; argv : ppchar): cInt;
|
|
Begin
|
|
FpExecv:=FpExecve (pchar(path),argv,envp);
|
|
End;
|
|
|
|
|
|
Function FpChdir (path : AnsiString): cInt;
|
|
Begin
|
|
FpChDir:=FpChdir(pchar(Path));
|
|
End;
|
|
|
|
Function FpOpen (path : AnsiString; flags : cInt; Mode: TMode):cInt;
|
|
Begin
|
|
FpOpen:=FpOpen(pchar(Path),flags,mode);
|
|
End;
|
|
|
|
|
|
Function FpMkdir (path : AnsiString; Mode: TMode):cInt;
|
|
Begin
|
|
FpMkdir:=FpMkdir(pchar(Path),mode);
|
|
End;
|
|
|
|
Function FpUnlink (path : AnsiString): cInt;
|
|
Begin
|
|
FpUnlink:=FpUnlink(pchar(path));
|
|
End;
|
|
|
|
Function FpRmdir (path : AnsiString): cInt;
|
|
Begin
|
|
FpRmdir:=FpRmdir(pchar(path));
|
|
End;
|
|
|
|
Function FpRename (old : AnsiString;newpath: AnsiString): cInt;
|
|
Begin
|
|
FpRename:=FpRename(pchar(old),pchar(newpath));
|
|
End;
|
|
|
|
Function FpStat (path: AnsiString; var buf : stat): cInt;
|
|
begin
|
|
FpStat:=FpStat(pchar(path),buf);
|
|
End;
|
|
|
|
Function FpAccess (pathname : AnsiString; aMode : cInt): cInt;
|
|
Begin
|
|
FpAccess:=FpAccess(pchar(pathname),amode);
|
|
End;
|
|
|
|
Function FPFStat(var F:Text;Var Info:stat):Boolean;
|
|
{
|
|
Get all information on a text file, and return it in info.
|
|
}
|
|
begin
|
|
FPFStat:=FPFstat(TextRec(F).Handle,INfo)=0;
|
|
end;
|
|
|
|
Function FPFStat(var F:File;Var Info:stat):Boolean;
|
|
{
|
|
Get all information on a untyped file, and return it in info.
|
|
}
|
|
begin
|
|
FPFStat:=FPFstat(FileRec(F).Handle,Info)=0;
|
|
end;
|
|
|
|
Function FpSignal(signum:longint;Handler:signalhandler):signalhandler;
|
|
// should be moved out of generic files. Too specific.
|
|
|
|
var sa,osa : sigactionrec;
|
|
|
|
begin
|
|
sa.sa_handler:=SigActionHandler(handler);
|
|
FillChar(sa.sa_mask,sizeof(sigset),#0);
|
|
sa.sa_flags := 0;
|
|
{ if (sigintr and signum) =0 then
|
|
{restart behaviour needs libc}
|
|
sa.sa_flags :=sa.sa_flags or SA_RESTART;
|
|
}
|
|
{$ifdef RTSIGACTION}
|
|
sa.sa_flags:=SA_SIGINFO
|
|
{$ifdef cpux86_64}
|
|
or $4000000
|
|
{$endif cpux86_64}
|
|
;
|
|
{$endif RTSIGACTION}
|
|
FPSigaction(signum,@sa,@osa);
|
|
if fpgetErrNo<>0 then
|
|
fpsignal:=NIL
|
|
else
|
|
fpsignal:=signalhandler(osa.sa_handler);
|
|
end;
|
|
|
|
{$ifdef FPC_USE_LIBC} // can't remember why this is the case. Might be legacy.
|
|
function xFpread(fd: cint; buf: pchar; nbytes : size_t): ssize_t; cdecl; external clib name 'read';
|
|
{$else}
|
|
function xFpread(fd: cint; buf: pchar; nbytes : size_t): ssize_t; external name 'FPC_SYSC_READ';
|
|
{$endif}
|
|
|
|
Function FpRead (fd : cInt;var buf; nbytes : TSize): TSsize;
|
|
|
|
begin
|
|
FPRead:=xFpRead(fd,pchar(@buf),nbytes);
|
|
end;
|
|
|
|
Function FpWrite (fd : cInt;const buf; nbytes : TSize): TSsize;
|
|
begin
|
|
FpWrite:=FpWrite(fd,pchar(@buf),nbytes);
|
|
end;
|
|
|
|
Function FpOpen (path : pChar; flags : cInt):cInt;
|
|
|
|
begin
|
|
FpOpen:=FpOpen(path,flags,438);
|
|
end;
|
|
|
|
Function FpOpen (path : AnsiString; flags : cInt):cInt;
|
|
|
|
begin
|
|
FpOpen:=FpOpen(pchar(path),flags,438);
|
|
end;
|
|
|
|
Function FpOpen (path : String; flags : cInt):cInt;
|
|
|
|
begin
|
|
path:=path+#0;
|
|
FpOpen:=FpOpen(@path[1],flags,438);
|
|
end;
|
|
|
|
Function FpOpen (path : String; flags : cInt; Mode: TMode):cInt;
|
|
|
|
begin
|
|
path:=path+#0;
|
|
FpOpen:=FpOpen(@path[1],flags,Mode);
|
|
end;
|
|
|
|
Function FpOpendir (dirname : AnsiString): pDir;
|
|
Begin
|
|
FpOpenDir:=FpOpenDir(pchar(dirname));
|
|
End;
|
|
|
|
|
|
Function FpOpendir (dirname : shortString): pDir;
|
|
Begin
|
|
dirname:=dirname+#0;
|
|
FpOpenDir:=FpOpenDir(pchar(@dirname[1]));
|
|
End;
|
|
|
|
|
|
Function FpStat (path: String; var buf : stat): cInt;
|
|
|
|
begin
|
|
path:=path+#0;
|
|
FpStat:=FpStat(pchar(@path[1]),buf);
|
|
end;
|
|
|
|
Function fpDup(var oldfile,newfile:text):cint;
|
|
{
|
|
Copies the filedescriptor oldfile to newfile, after flushing the buffer of
|
|
oldfile.
|
|
After which the two textfiles are, in effect, the same, except
|
|
that they don't share the same buffer, and don't share the same
|
|
close_on_exit flag.
|
|
}
|
|
begin
|
|
flush(oldfile);{ We cannot share buffers, so we flush them. }
|
|
textrec(newfile):=textrec(oldfile);
|
|
textrec(newfile).bufptr:=@(textrec(newfile).buffer);{ No shared buffer. }
|
|
textrec(newfile).handle:=fpDup(textrec(oldfile).handle);
|
|
fpdup:=textrec(newfile).handle;
|
|
end;
|
|
|
|
Function fpDup(var oldfile,newfile:file):cint;
|
|
{
|
|
Copies the filedescriptor oldfile to newfile
|
|
}
|
|
begin
|
|
filerec(newfile):=filerec(oldfile);
|
|
filerec(newfile).handle:=fpDup(filerec(oldfile).handle);
|
|
fpdup:= filerec(newfile).handle;
|
|
end;
|
|
|
|
|
|
Function FpDup2(var oldfile,newfile:text):cint;
|
|
{
|
|
Copies the filedescriptor oldfile to newfile, after flushing the buffer of
|
|
oldfile. It closes newfile if it was still open.
|
|
After which the two textfiles are, in effect, the same, except
|
|
that they don't share the same buffer, and don't share the same
|
|
close_on_exit flag.
|
|
}
|
|
var
|
|
tmphandle : word;
|
|
begin
|
|
case TextRec(oldfile).mode of
|
|
fmOutput, fmInOut, fmAppend :
|
|
flush(oldfile);{ We cannot share buffers, so we flush them. }
|
|
end;
|
|
case TextRec(newfile).mode of
|
|
fmOutput, fmInOut, fmAppend :
|
|
flush(newfile);
|
|
end;
|
|
tmphandle:=textrec(newfile).handle;
|
|
textrec(newfile):=textrec(oldfile);
|
|
textrec(newfile).handle:=tmphandle;
|
|
textrec(newfile).bufptr:=@(textrec(newfile).buffer);{ No shared buffer. }
|
|
fpDup2:=fpDup2(textrec(oldfile).handle,textrec(newfile).handle);
|
|
end;
|
|
|
|
Function FpDup2(var oldfile,newfile:file):cint;
|
|
{
|
|
Copies the filedescriptor oldfile to newfile
|
|
}
|
|
begin
|
|
filerec(newfile):=filerec(oldfile);
|
|
fpDup2:=fpDup2(filerec(oldfile).handle,filerec(newfile).handle);
|
|
end;
|
|
|
|
function fptime :time_t;
|
|
var t:time_t;
|
|
begin
|
|
fptime:=fptime(t);
|
|
end;
|
|
|
|
Function fpSelect(N:cint;readfds,writefds,exceptfds:pfdset;TimeOut:cint):cint;
|
|
{
|
|
Select checks whether the file descriptor sets in readfs/writefs/exceptfs
|
|
have changed.
|
|
This function allows specification of a timeout as a longint.
|
|
}
|
|
var
|
|
p : PTimeVal;
|
|
tv : TimeVal;
|
|
begin
|
|
if TimeOut=-1 then
|
|
p:=nil
|
|
else
|
|
begin
|
|
tv.tv_Sec:=Timeout div 1000;
|
|
tv.tv_Usec:=(Timeout mod 1000)*1000;
|
|
p:=@tv;
|
|
end;
|
|
fpSelect:=fpSelect(N,Readfds,WriteFds,ExceptFds,p);
|
|
end;
|
|
|
|
Function fpSelect(var T:Text;TimeOut :PTimeval):cint;
|
|
Var
|
|
F:TfdSet;
|
|
begin
|
|
if textrec(t).mode=fmclosed then
|
|
begin
|
|
fpSetErrNo(ESysEBADF);
|
|
exit(-1);
|
|
end;
|
|
FpFD_ZERO(f);
|
|
fpFD_SET(textrec(T).handle,f);
|
|
if textrec(T).mode=fminput then
|
|
fpselect:=fpselect(textrec(T).handle+1,@f,nil,nil,TimeOut)
|
|
else
|
|
fpSelect:=fpselect(textrec(T).handle+1,nil,@f,nil,TimeOut);
|
|
end;
|
|
|
|
Function fpSelect(var T:Text;TimeOut :time_t):cint;
|
|
var
|
|
p : PTimeVal;
|
|
tv : TimeVal;
|
|
begin
|
|
if TimeOut=-1 then
|
|
p:=nil
|
|
else
|
|
begin
|
|
tv.tv_Sec:=Timeout div 1000;
|
|
tv.tv_Usec:=(Timeout mod 1000)*1000;
|
|
p:=@tv;
|
|
end;
|
|
fpSelect:=fpSelect(T,p);
|
|
end;
|
|
|
|
function FpWaitPid (pid : TPid; Var Status : cInt; Options : cint) : TPid;
|
|
|
|
begin
|
|
fpWaitPID:=fpWaitPID(Pid,@Status,Options);
|
|
end;
|
|
|
|
Function fpReadLink(Name:ansistring):ansistring;
|
|
{
|
|
Read a link (where it points to)
|
|
}
|
|
var
|
|
LinkName : ansistring;
|
|
i : cint;
|
|
begin
|
|
SetLength(linkname,PATH_MAX);
|
|
i:=fpReadLink(pchar(name),pchar(linkname),PATH_MAX);
|
|
if i>0 then
|
|
begin
|
|
SetLength(linkname,i);
|
|
fpReadLink:=LinkName;
|
|
end
|
|
else
|
|
fpReadLink:='';
|
|
end;
|
|
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.18 2005-02-14 17:13:31 peter
|
|
* truncate log
|
|
|
|
Revision 1.17 2005/01/30 18:01:15 peter
|
|
* signal cleanup for linux
|
|
* sigactionhandler instead of tsigaction for bsds
|
|
* sigcontext moved to cpu dir
|
|
|
|
}
|