mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-02 06:43:41 +02:00
64 lines
1.7 KiB
PHP
64 lines
1.7 KiB
PHP
{%MainUnit fileutil.pas}
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
function ReadAllLinks(const Filename: string;
|
|
ExceptionOnError: boolean): string;
|
|
------------------------------------------------------------------------------}
|
|
function ReadAllLinks(const Filename: string;
|
|
ExceptionOnError: boolean): string;
|
|
var
|
|
LinkFilename: string;
|
|
AText: string;
|
|
Depth: Integer;
|
|
begin
|
|
Result:=Filename;
|
|
Depth:=0;
|
|
while Depth<12 do begin
|
|
inc(Depth);
|
|
LinkFilename:=FpReadLink(Result);
|
|
if LinkFilename='' then begin
|
|
AText:='"'+Filename+'"';
|
|
case fpGetErrno() of
|
|
ESysEAcces:
|
|
AText:='read access denied for '+AText;
|
|
ESysENoEnt:
|
|
AText:='a directory component in '+AText
|
|
+' does not exist or is a dangling symlink';
|
|
ESysENotDir:
|
|
AText:='a directory component in '+AText+' is not a directory';
|
|
ESysENoMem:
|
|
AText:='insufficient memory';
|
|
ESysELoop:
|
|
AText:=AText+' has a circular symbolic link';
|
|
else
|
|
// not a symbolic link, just a regular file
|
|
exit;
|
|
end;
|
|
if (not ExceptionOnError) then begin
|
|
Result:='';
|
|
exit;
|
|
end;
|
|
raise EFOpenError.Create(AText);
|
|
end else begin
|
|
if not FilenameIsAbsolute(LinkFilename) then
|
|
Result:=ExpandFileNameUTF8(ExtractFilePath(Result)+LinkFilename)
|
|
else
|
|
Result:=LinkFilename;
|
|
end;
|
|
end;
|
|
// probably an endless loop
|
|
if ExceptionOnError then
|
|
raise EFOpenError.Create('too many links, maybe an endless loop.')
|
|
else
|
|
Result:='';
|
|
end;
|
|
|
|
|
|
|
|
function ExtractShortPathNameUTF8(const FileName: String): String;
|
|
begin
|
|
Result:=SysToUTF8(SysUtils.ExtractShortPathName(UTF8ToSys(FileName)));
|
|
end;
|
|
|