mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-29 04:14:05 +02:00
170 lines
4.2 KiB
PHP
170 lines
4.2 KiB
PHP
{
|
|
$Id$
|
|
This file is part of the Free Pascal run time library.
|
|
|
|
Main OS dependant body of the system unit, loosely modelled
|
|
after POSIX. *BSD version (Linux version is near identical)
|
|
|
|
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.
|
|
|
|
**********************************************************************}
|
|
|
|
|
|
{*****************************************************************************
|
|
Directory Handling
|
|
*****************************************************************************}
|
|
|
|
Procedure MkDir(Const s: String);[IOCheck];
|
|
const
|
|
{ read/write search permission for everyone }
|
|
MODE_MKDIR = S_IWUSR OR S_IRUSR OR
|
|
S_IWGRP OR S_IRGRP OR
|
|
S_IWOTH OR S_IROTH OR
|
|
S_IXUSR OR S_IXGRP OR S_IXOTH;
|
|
Var
|
|
Buffer: Array[0..255] of Char;
|
|
Begin
|
|
If (s='') or (InOutRes <> 0) then
|
|
exit;
|
|
Move(s[1], Buffer, Length(s));
|
|
Buffer[Length(s)] := #0;
|
|
If Fpmkdir(@buffer, MODE_MKDIR)<0 Then
|
|
Errno2Inoutres
|
|
Else
|
|
InOutRes:=0;
|
|
End;
|
|
|
|
|
|
Procedure RmDir(Const s: String);[IOCheck];
|
|
Var
|
|
Buffer: Array[0..255] of Char;
|
|
Begin
|
|
if (s = '.') then
|
|
InOutRes := 16;
|
|
If (s='') or (InOutRes <> 0) then
|
|
exit;
|
|
Move(s[1], Buffer, Length(s));
|
|
Buffer[Length(s)] := #0;
|
|
If Fprmdir(@buffer)<0 Then
|
|
Errno2Inoutres
|
|
Else
|
|
InOutRes:=0;
|
|
End;
|
|
|
|
|
|
Procedure ChDir(Const s: String);[IOCheck];
|
|
Var
|
|
Buffer: Array[0..255] of Char;
|
|
Begin
|
|
If (s='') or (InOutRes <> 0) then
|
|
exit;
|
|
Move(s[1], Buffer, Length(s));
|
|
Buffer[Length(s)] := #0;
|
|
If Fpchdir(@buffer)<0 Then
|
|
Errno2Inoutres
|
|
Else
|
|
InOutRes:=0;
|
|
{ file not exists is path not found under tp7 }
|
|
if InOutRes=2 then
|
|
InOutRes:=3;
|
|
End;
|
|
|
|
{ // $define usegetcwd}
|
|
|
|
procedure getdir(drivenr : byte;var dir : shortstring);
|
|
var
|
|
{$ifdef usegetcwd}
|
|
buf : array[0..254] of char;
|
|
{$else}
|
|
cwdinfo : stat;
|
|
rootinfo : stat;
|
|
thedir,dummy : string[255];
|
|
dirstream : pdir;
|
|
d : pdirent;
|
|
name : string[255];
|
|
thisdir : stat;
|
|
tmp : string[255];
|
|
{$endif}
|
|
|
|
begin
|
|
dir:='';
|
|
{$ifdef usegetcwd}
|
|
if Fpgetcwd(@buf,sizeof(buf))<>nil then
|
|
dir:=strpas(buf);
|
|
{$else}
|
|
thedir:='';
|
|
dummy:='';
|
|
|
|
{ get root directory information }
|
|
tmp := '/'+#0;
|
|
if Fpstat(@tmp[1],rootinfo)<0 then
|
|
Exit;
|
|
repeat
|
|
tmp := dummy+'.'+#0;
|
|
{ get current directory information }
|
|
if Fpstat(@tmp[1],cwdinfo)<0 then
|
|
Exit;
|
|
tmp:=dummy+'..'+#0;
|
|
{ open directory stream }
|
|
{ try to find the current inode number of the cwd }
|
|
dirstream:=Fpopendir(@tmp[1]);
|
|
if dirstream=nil then
|
|
exit;
|
|
repeat
|
|
name:='';
|
|
d:=Fpreaddir(dirstream);
|
|
{ no more entries to read ... }
|
|
if not assigned(d) then
|
|
break;
|
|
tmp:=dummy+'../'+strpas(d^.d_name) + #0;
|
|
if (Fpstat(@tmp[1],thisdir)=0) then
|
|
begin
|
|
{ found the entry for this directory name }
|
|
if (cwdinfo.st_dev=thisdir.st_dev) and (cwdinfo.st_ino=thisdir.st_ino) then
|
|
begin
|
|
{ are the filenames of type '.' or '..' ? }
|
|
{ then do not set the name. }
|
|
if (not ((d^.d_name[0]='.') and ((d^.d_name[1]=#0) or
|
|
((d^.d_name[1]='.') and (d^.d_name[2]=#0))))) then
|
|
name:='/'+strpas(d^.d_name);
|
|
end;
|
|
end;
|
|
until (name<>'');
|
|
if Fpclosedir(dirstream)<0 then
|
|
Exit;
|
|
thedir:=name+thedir;
|
|
dummy:=dummy+'../';
|
|
if ((cwdinfo.st_dev=rootinfo.st_dev) and (cwdinfo.st_ino=rootinfo.st_ino)) then
|
|
begin
|
|
if thedir='' then
|
|
dir:='/'
|
|
else
|
|
dir:=thedir;
|
|
exit;
|
|
end;
|
|
until false;
|
|
{$endif}
|
|
end;
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.3 2005-02-14 17:13:31 peter
|
|
* truncate log
|
|
|
|
Revision 1.2 2005/02/13 20:01:38 peter
|
|
* include file cleanup
|
|
|
|
Revision 1.1 2005/02/07 22:04:55 peter
|
|
* moved to unix
|
|
|
|
Revision 1.1 2005/02/06 13:06:20 peter
|
|
* moved file and dir functions to sysfile/sysdir
|
|
* win32 thread in systemunit
|
|
|
|
}
|