123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- {
- 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; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpLink:=FpLink(pchar(existing),pchar(newone));
- End;
- Function FpMkfifo (path : AnsiString; Mode : TMode): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpMkfifo:=FpMkfifo(pchar(path),mode);
- End;
- Function FpChmod (path : AnsiString; Mode : TMode): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpChmod:=FpChmod(pchar(path),mode);
- End;
- Function FpChown (path : AnsiString; owner : TUid; group : TGid): cInt;{$ifdef VER2_0}inline;{$endif}
- Begin
- FpChown:=FpChown(pchar(path),owner,group);
- End;
- Function FpUtime (path : AnsiString; times : putimbuf): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpUtime:=FpUtime(pchar(path),times);
- End;
- {
- Function FpGetcwd (path:AnsiString; siz:TSize):AnsiString; {$ifdef VER2_0}inline;{$endif}
- 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; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpExecve:=FpExecve (pchar(path),argv,envp);
- End;
- Function FpExecv (path : AnsiString; argv : ppchar): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpExecv:=FpExecve (pchar(path),argv,envp);
- End;
- Function FpChdir (path : AnsiString): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpChDir:=FpChdir(pchar(Path));
- End;
- Function FpOpen (path : AnsiString; flags : cInt; Mode: TMode):cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpOpen:=FpOpen(pchar(Path),flags,mode);
- End;
- Function FpMkdir (path : AnsiString; Mode: TMode):cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpMkdir:=FpMkdir(pchar(Path),mode);
- End;
- Function FpUnlink (path : AnsiString): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpUnlink:=FpUnlink(pchar(path));
- End;
- Function FpRmdir (path : AnsiString): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpRmdir:=FpRmdir(pchar(path));
- End;
- Function FpRename (old : AnsiString;newpath: AnsiString): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpRename:=FpRename(pchar(old),pchar(newpath));
- End;
- Function FpStat (path: AnsiString; var buf : stat): cInt; {$ifdef VER2_0}inline;{$endif}
- begin
- FpStat:=FpStat(pchar(path),buf);
- End;
- Function FpAccess (pathname : AnsiString; aMode : cInt): cInt; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpAccess:=FpAccess(pchar(pathname),amode);
- End;
- Function FPFStat(var F:Text;Var Info:stat):Boolean; {$ifdef VER2_0}inline;{$endif}
- {
- 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; {$ifdef VER2_0}inline;{$endif}
- {
- 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(sa.sa_mask),#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; {$ifdef VER2_0}inline;{$endif}
- begin
- FPRead:=xFpRead(fd,pchar(@buf),nbytes);
- end;
- Function FpWrite (fd : cInt;const buf; nbytes : TSize): TSsize; {$ifdef VER2_0}inline;{$endif}
- begin
- FpWrite:=FpWrite(fd,pchar(@buf),nbytes);
- end;
- {$ifdef linux}
- function FppRead (fd : cInt;var buf; nbytes : TSize; offset:Toff): TSsize; {$ifdef VER2_0}inline;{$endif}
- begin
- FppRead:=FppRead(fd,pchar(@buf),nbytes,offset);
- end;
- function FppWrite (fd : cInt;const buf; nbytes : TSize; offset:Toff): TSsize; {$ifdef VER2_0}inline;{$endif}
- begin
- FppWrite:=FppWrite(fd,pchar(@buf),nbytes,offset);
- end;
- {$endif}
- Function FpOpen (path : pChar; flags : cInt):cInt; {$ifdef VER2_0}inline;{$endif}
- begin
- FpOpen:=FpOpen(path,flags,438);
- end;
- Function FpOpen (path : AnsiString; flags : cInt):cInt; {$ifdef VER2_0}inline;{$endif}
- 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; {$ifdef VER2_0}inline;{$endif}
- Begin
- FpOpenDir:=FpOpenDir(pchar(dirname));
- End;
- Function FpOpendir (dirname : shortString): pDir; {$ifdef VER2_0}inline;{$endif}
- 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
- }
- var
- tmphandle : word;
- begin
- tmphandle := filerec(newfile).handle;
- filerec(newfile):=filerec(oldfile);
- filerec(newfile).handle := tmphandle;
- fpDup2:=fpDup2(filerec(oldfile).handle,filerec(newfile).handle);
- end;
- function fptime :time_t; {$ifdef VER2_0}inline;{$endif}
- 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;
|