|
@@ -0,0 +1,237 @@
|
|
|
+{
|
|
|
+ $Id$
|
|
|
+ This file is part of the Free Pascal run time library.
|
|
|
+ Copyright (c) 1998 by the Free Pascal development team
|
|
|
+
|
|
|
+ File utility calls
|
|
|
+
|
|
|
+ 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.
|
|
|
+
|
|
|
+ **********************************************************************}
|
|
|
+
|
|
|
+
|
|
|
+Function FileOpen (Const FileName : string; Mode : Integer) : Longint;
|
|
|
+
|
|
|
+Var LinuxFlags : longint;
|
|
|
+
|
|
|
+BEGIN
|
|
|
+ LinuxFlags:=0;
|
|
|
+ Case (Mode and 3) of
|
|
|
+ 0 : LinuxFlags:=LinuxFlags or Open_RdOnly;
|
|
|
+ 1 : LinuxFlags:=LinuxFlags or Open_WrOnly;
|
|
|
+ 2 : LinuxFlags:=LinuxFlags or Open_RdWr;
|
|
|
+ end;
|
|
|
+ FileOpen:=fdOpen (FileName,LinuxFlags);
|
|
|
+ //!! We need to set locking based on Mode !!
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileCreate (Const FileName : String) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileCreate:=FileOpen (FileName,Open_RdWr or Open_Creat);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileRead (Handle : Longint; Var Buffer; Count : longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileRead:=fdRead (Handle,Buffer,Count);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileWrite (Handle : Longint; Var Buffer; Count : Longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileWrite:=fdWrite (Handle,Buffer,Count);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileSeek (Handle,Offset,Origin : Longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileSeek:=fdSeek (Handle,Offset,Origin);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Procedure FileClose (Handle : Longint);
|
|
|
+
|
|
|
+begin
|
|
|
+ fdclose(Handle);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileAge (Const FileName : String): Longint;
|
|
|
+
|
|
|
+Var Info : Stat;
|
|
|
+
|
|
|
+begin
|
|
|
+ If not fstat (FileName,Info) then
|
|
|
+ exit(-1)
|
|
|
+ else
|
|
|
+ Exit (Info.mtime);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileExists (Const FileName : String) : Boolean;
|
|
|
+
|
|
|
+Var Info : Stat;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileExists:=fstat(filename,Info);
|
|
|
+end;
|
|
|
+
|
|
|
+Function LinuxToWinAttr (FN : Char; Const Info : Stat) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ Result:=0;
|
|
|
+ If FN='.' then
|
|
|
+ Result:=Result or faHidden;
|
|
|
+ If (Info.Mode and STAT_IFDIR)=STAT_IFDIR then
|
|
|
+ Result:=Result or faDirectory;
|
|
|
+ If (Info.Mode and STAT_IWUSR)=0 Then
|
|
|
+ Result:=Result or faReadOnly;
|
|
|
+end;
|
|
|
+
|
|
|
+{
|
|
|
+ GlobToSearch takes a glob entry, stats the file.
|
|
|
+ The glob entry is removed.
|
|
|
+ If FileAttributes match, the entry is reused
|
|
|
+}
|
|
|
+
|
|
|
+Function GlobToTSearchRec (Info : TSearchRec) : Boolean;
|
|
|
+
|
|
|
+Var SInfo : Stat;
|
|
|
+ p : Pglob;
|
|
|
+ TAttr : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ P:=pglob(Info.FindHandle);
|
|
|
+ Result:=Fstat(p^.name,SInfo);
|
|
|
+ Info.FindHandle:=Longint(P^.Next);
|
|
|
+ P^.Next:=Nil;
|
|
|
+ GlobFree(P);
|
|
|
+ If Result then
|
|
|
+ begin
|
|
|
+ Info.Attr:=LinuxToWinAttr(p^.name[0],SInfo);
|
|
|
+ Result:=(Info.ExcludeAttr and TAttr)<>0 ;
|
|
|
+ If Result Then
|
|
|
+ With Info do
|
|
|
+ begin
|
|
|
+ Attr:=Info.Attr;
|
|
|
+ Name:=strpas(p^.name);
|
|
|
+ Time:=Sinfo.mtime;
|
|
|
+ Size:=Sinfo.Size;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Function DoFind(Var Rslt : TSearchRec) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ If Rslt.FindHandle<>0 then
|
|
|
+ While (Rslt.FindHandle<>0) and GlobToTSearchRec(Rslt) do;
|
|
|
+ If Rslt.FindHandle=0 Then
|
|
|
+ Result:=-1
|
|
|
+ else
|
|
|
+ Result:=0;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Function FindFirst (Const Path : String; Attr : Longint; Var Rslt : TSearchRec) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ Rslt.ExcludeAttr:=Attr; //!! Not correct !!
|
|
|
+ Rslt.FindHandle:=Longint(Glob(Path));
|
|
|
+ Result:=DoFind (Rslt);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FindNext (Var Rslt : TSearchRec) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ Result:=DoFind (Rslt);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Procedure FindClose (Var F : TSearchrec);
|
|
|
+
|
|
|
+begin
|
|
|
+ GlobFree (PGlob(F.FindHandle));
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileGetDate (Handle : Longint) : Longint;
|
|
|
+
|
|
|
+Var Info : Stat;
|
|
|
+
|
|
|
+begin
|
|
|
+ If Not(FStat(Handle,Info)) then
|
|
|
+ Result:=-1
|
|
|
+ else
|
|
|
+ Result:=Info.Mtime;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileSetDate (Handle,Age : Longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ // Impossible under Linux from FileHandle !!
|
|
|
+ FileSetDate:=-1;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileGetAttr (Const FileName : String) : Longint;
|
|
|
+
|
|
|
+Var Info : Stat;
|
|
|
+
|
|
|
+begin
|
|
|
+ If Not FStat (FileName,Info) then
|
|
|
+ Result:=-1
|
|
|
+ Else
|
|
|
+ Result:=LinuxToWinAttr(FileName[1],Info);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileSetAttr (Const Filename : String; Attr: longint) : Longint;
|
|
|
+
|
|
|
+begin
|
|
|
+ //!! Still Needs doing
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function DeleteFile (Const FileName : String) : Boolean;
|
|
|
+
|
|
|
+begin
|
|
|
+ Result:=UnLink (FileName);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function RenameFile (Const OldName, NewName : String) : Boolean;
|
|
|
+
|
|
|
+Var P1,P2 : String;
|
|
|
+
|
|
|
+begin
|
|
|
+ RenameFile:=Linux.Rename(OldNAme,NewName);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Function FileSearch (Const Name, DirList : String) : String;
|
|
|
+
|
|
|
+begin
|
|
|
+ FileSearch:=Linux.FSearch(Name,Dirlist);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+{
|
|
|
+ $Log$
|
|
|
+ Revision 1.1 1998-10-11 12:21:01 michael
|
|
|
+ Added file calls. Implemented for linux only
|
|
|
+
|
|
|
+}
|