realpath
распознает все символьные ссылки, удлиняет записи типа
'/./', '/../'
(включая ведущий символ
'/'
в строке
path
символов, завершенных нулем)
и сохраняет приведенное к нормальному виду полное имя файла в буфере
размера
PATH_MAX ,
указанном в
resolved_path.
В результате путь не имеет ссылок и компонентов
'/./'
или
'/../'.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Если не произошло никаких ошибок, возвращается указатель на
resolved_path.
Иначе возвращается указатель на NULL и содержимое массива
resolved_path
не определяется. Глобальная переменная
errno
указывает на код ошибки.
НАЙДЕННЫЕ ОШИБКИ
EACCES
- запрещено чтение или поиск для компонента, содержащегося в пути;
EINVAL
- одна из величин
path
или
resolved_path
равна NULL (в libc5 это просто вызывает ошибку segfault);
EIO
- ошибка ввода-вывода при чтении из файловой системы;
ELOOP
- слишком много символьных ссылок в транслируемом пути;
ENAMETOOLONG
- компонент имени в пути содержит более
NAME_MAX
символов или компонент пути содержит более
PATH_MAX
символов);
ENOENT
- указанный файл отсутствует;
ENOTDIR
- компонент пути - это не каталог.
НАЙДЕННЫЕ ОШИБКИ
Никогда не используйте эту функцию. В ней изначально заложена
некорректность, так как невозможно определить подходящий размер
для буфера вывода. В соответствии с POSIX буфера размером
PATH_MAX должно хватить, но PATH_MAX может и не быть определяемой
константой, и может быть получен через
pathconf().
И запрос
pathconf()
особо не поможет, так как с одной стороны POSIX предупреждает,
что результат
pathconf()
может быть слишком велик и не входить в память, отведенную через malloc.
С другой стороны,
pathconf()
может возвратить -1 для обозначения того, что PATH_MAX неограничен.
Реализации libc4 и libc5 содержат ошибку, вызывающую переполнение
буфера (исправлено в libc-5.4.13).
Так что suid-програмы, такие, как mount, нуждаются в собственной версии.
ПРИМЕЧАНИЯ ПО ИСТОРИИ
Функция
realpath
впервые появилась в BSD 4.4, распространяемой Jan-Simon Pendry.
В Linux эта функция появилась в libc 4.5.21.
СООТВЕТСТВИЕ СТАНДАРТАМ
В BSD 4.4 и Solaris максимальная длина пути равна MAXPATHLEN
(находится в <sys/param.h>). SUSv2 описывает PATH_MAX и
NAME_MAX, находящиеся в <limits.h> и определяемые функцией
pathconf() .
Вот типичный фрагмент кода:
Версии BSD 4.4, Linux и SUSv2 всегда возвращают абсолютное полное имя.
Solaris может вернуть относительное имя, если аргумент
path
относителен. Прототип
realpath
определен в файле <unistd.h> libc4 и libc5,
а в других системах - в файле <stdlib.h>.