Получить путь по символической ссылке

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Получить путь по символической ссылке

Сообщение ssnakess » 26.05.2024 18:14:32

Доброго времени суток!
подскажите плиз, есть ли стандартная процедура/функция в lazarus, в результате вызова которой я могу получить путь - куда ссылается ссылка.
Как пример:
есть каталог - ссылка /sys/class/net/eth0
он ссылается на /sys/devices/pci0000:00/0000:00:01.3/0000:02:00.2/0000:03:00.0/0000:04:00.0/net/eth0

в программе пробовал получить каталог на который ссылается вышеуказанный через вызов FileGetSymLinkTarget - и получаю относительную ссылку на каталог
Код: Выделить всё
var s:RawByteString;
      SourceName:String;
begin
....
  SourceName:='/sys/class/net/eth0';
...
  FileGetSymLinkTarget(SourceName,s)
...

т.е. в S - получаю
../../devices/pci0000:00/0000:00:01.3/0000:02:00.2/0000:03:00.0/0000:04:00.0/net/eth0
вместо
/sys/devices/pci0000:00/0000:00:01.3/0000:02:00.2/0000:03:00.0/0000:04:00.0/net/eth0

В модуле sysutils/filutilh.inc - кроме как вышеописанного варианта получения ссылки - нет, а может я просто не понял что есть :)
Нашел в интернет что в модуле linux есть требуемое
Код: Выделить всё
uses linux;
Function ReadLink(sympath, buffer:pchar; bufsize:longint):longint;
Function ReadLink(name:pathstr):pathstr;


но у меня этот вариант не прокатывает - ругается что нет такого "ReadLink" в модуле linux
да и правда нет там такого, там только futex и прочее, и ничего по поводу ссылок нет

Я сделал получение куда указывает ссылка, через "одно место", а именно вызываю командную строку readlink -f <имя файла>
и она возвращает в stdout нормальный каталог на который ссылается ссылка.
но это както не правильно, на получение такого рода инфы - создавать отдельный процесс и вызывать в нем утилиту линуха.
Подскажите, может есть вариант стандартными библиотечными процедурами/функциями лазаруса - получить таки полный путь куда ссылается ссылка?
ssnakess
новенький
 
Сообщения: 47
Зарегистрирован: 24.09.2011 23:08:55

Re: Получить путь по символической ссылке

Сообщение Alexander » 26.05.2024 18:50:18

Код: Выделить всё
uses baseunix;

begin
WriteLn(fpReadLink('/usr/bin/ppcx64'));
end.


Код: Выделить всё
uses baseunix,sysutils;

begin
WriteLn(ExpandFileName(fpReadLink('/sys/class/net/enp2s0')));
end.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 723
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Получить путь по символической ссылке

Сообщение ssnakess » 27.05.2024 00:53:15

Alexander писал(а):
Код: Выделить всё
uses baseunix;

begin
WriteLn(fpReadLink('/usr/bin/ppcx64'));
end.


Код: Выделить всё
uses baseunix,sysutils;

begin
WriteLn(ExpandFileName(fpReadLink('/sys/class/net/enp2s0')));
end.



От спасибо, добрый человек! :)
ssnakess
новенький
 
Сообщения: 47
Зарегистрирован: 24.09.2011 23:08:55

Re: Получить путь по символической ссылке

Сообщение ssnakess » 30.05.2024 19:38:21

ssnakess писал(а):
Alexander писал(а):
Код: Выделить всё
uses baseunix;

begin
WriteLn(fpReadLink('/usr/bin/ppcx64'));
end.


Код: Выделить всё
uses baseunix,sysutils;

begin
WriteLn(ExpandFileName(fpReadLink('/sys/class/net/enp2s0')));
end.



От спасибо, добрый человек! :)



;((
для версии fpc 2.6.4 это не работает
выдает относительную ссылку, от текущего каталога
т.е. надо сперва зайти в тот каталог (т.е. сменить рабочий каталог программы) где лежит эта ссылка. и потом тока вызвать, что немного похоже на трешовый треш :)
вернулся к вызову системной команды readlink -f и чтение потока вывода - решение универсальное получилось
работает с любым fpc и в любой линуховой оси :)

имеется ввиду вызов ExpandFileName - возвращает разадресованную ссылку каталога, относительно текущего каталога работы программы :)
ssnakess
новенький
 
Сообщения: 47
Зарегистрирован: 24.09.2011 23:08:55

Re: Получить путь по символической ссылке

Сообщение Снег Север » 30.05.2024 19:53:13

"ссылку каталога, относительно текущего каталога работы программы "
Гм... Но ведь каталог работы программы всегда известен - не проще ли просто соединением строк слить его и относительный каталог, чем запускать отдельную утилиту и ловить её выхлоп?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3009
Зарегистрирован: 27.11.2007 16:14:47

Re: Получить путь по символической ссылке

Сообщение Alexander » 31.05.2024 06:36:37

> для версии fpc 2.6.4 это не работает

А обновить никак ?

В репозиториях уже давно FPC 3.2.2, да и тот устарел - многие вещи работают только из git версии.

В старых версиях много чего не было. 2.6.4 категорически подлежит обновлению. Существование 2.6.4 можно не учитывать вообще.
Обновить или использовать для сборки портативную версию FPC, если обновление не удалось провести. Проблема на ровном месте.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 723
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Получить путь по символической ссылке

Сообщение v-t-l » 31.05.2024 19:20:18

ssnakess писал(а):;((
для версии fpc 2.6.4 это не работает
выдает относительную ссылку, от текущего каталога


Код: Выделить всё
uses baseunix,sysutils;
var
  s: String;
begin
  s := fpReadLink('/sys/class/net/enp2s0');
  if copy(s,1,2)='./' or copy(s,1,3)='../' then
    s := ExpandFileName(ExtractFilePath('/sys/class/net/enp2s0') + s);
  WriteLn(s);
end.

И версия FPC тут ни при чём. :D
Последний раз редактировалось v-t-l 02.06.2024 10:52:36, всего редактировалось 1 раз.
v-t-l
энтузиаст
 
Сообщения: 730
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Получить путь по символической ссылке

Сообщение Alexander » 01.06.2024 08:27:03

И версия FPC тут ни при чём.


Но тогда это баг FPC. В функцию функции ExpandFileName входит превращение относительного пути в абсолютный и ничего больше.

https://www.freepascal.org/docs-html/rt ... ename.html
Expand a relative filename to an absolute filename.


Добавлено спустя 8 минут 34 секунды:
То есть либо нужно улучшать fpReadLink до полноценного ответа, либо заводить ExpandFileName с дополнительными возможностями.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 723
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Получить путь по символической ссылке

Сообщение v-t-l » 02.06.2024 08:53:05

Alexander писал(а):Но тогда это баг FPC. В функцию функции ExpandFileName входит превращение относительного пути в абсолютный и ничего больше.

С чего бы это баг? Превращение пути относительно чего? Единственный ориентир - текущий каталог. Только если указан путь вида /usr/lib/../bin/mysuperprog, то можно получить абсолютный путь, "устранив" двоеточия и т.п.
v-t-l
энтузиаст
 
Сообщения: 730
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Получить путь по символической ссылке

Сообщение Alexander » 02.06.2024 12:46:13

> Превращение пути относительно чего?

Это и есть вопрос в таком случае. В случае со ссылками ориентир не один, а два. Это и не учтено.
Ну и fpReadLink могла бы выдавать полностью сразу как команда "readlink -f <имя файла>" тогда бы для этого случая ничего и не потребовалось бы больше..

Добавлено спустя 35 минут 45 секунд:
Первый ориентир (относительно текущего каталога) - сама ссылка. Второй ориентир путь, где она лежит - это "её собственный" текущий каталог.
Содержимое ссылки указывает либо абсолютный путь, либо относительный, но относительно себя, а не pwd какой-либо программы.
Вот "относительно себя" и не учтено.

Добавлено спустя 6 часов 44 минуты 13 секунд:
И версия FPC тут ни при чём.


С чуть-чуть дополнением работает:

Код: Выделить всё
{$MODE OBJFPC}
{$H+}
uses baseunix,sysutils;
var
  s: Utf8String;
begin
  s := fpReadLink('/sys/class/net/enp2s0');
  if (copy(s,1,2)='./') or (copy(s,1,3)='../') then
    s := ExpandFileName(ExtractFilePath('/sys/class/net/enp2s0') + s);
  WriteLn(s);
end.


Иначе было:
Код: Выделить всё
t.pas(6,23) Error: Operator is not overloaded: "Constant String" or "ShortString[255]"
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 723
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru