LINKAT(2)

ИМЯ
linkat - создаёт файловую ссылку относительно файловых дескрипторов каталогов

ОБЗОР
#include <fcntl.h> /* определения констант AT_* */
#include <unistd.h>

int linkat(int olddirfd, const char *oldpath,
           int newdirfd, const char *newpath, int flags);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

linkat():
    Начиная с glibc 2.10:
        _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
    До glibc 2.10:
        _ATFILE_SOURCE

ОПИСАНИЕ
Системный вызов linkat() работает также как системный вызов link(2), за исключением случаев, описанных в данной справочной странице. Если в oldpath задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор olddirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в link(2)). Если в oldpath задан относительный путь и olddirfd равно специальному значению AT_FDCWD, то oldpath рассматривается относительно текущего рабочего каталога вызывающего процесса (как link(2)). Если в oldpath задан абсолютный путь, то olddirfd игнорируется. Значение newpath интерпретируется как oldpath, за исключением того, что относительный путь интерпретируется относительно каталога, на который ссылается файловый дескриптор newdirfd. По умолчанию, linkat() не разыменовывает oldpath, если это символьная ссылка (подобно link(2)). Начиная с Linux 2.6.18 в flags можно указать AT_SYMLINK_FOLLOW, и тогда значение oldpath будет разыменовано, если это символьная ссылка. До ядра 2.6.18 аргумент flags не использовался и должен был быть равен 0.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении linkat() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ
В linkat() могут возникнуть те же ошибки, что и в link(2). Также, в linkat() могут возникнуть следующие ошибки:

EBADF
    olddirfd или newdirfd не является правильным файловым дескриптором.

ENOTDIR
    Значение oldpath содержит относительный путь и olddirfd содержит файловый дескриптор, указывающий на файл, а не на каталог; или произошло тоже самое с newpath и newdirfd.

ВЕРСИИ
Вызов linkat() был добавлен в ядро Linux версии 2.6.16; поддержка в glibc доступна с версии 2.4.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008.

ЗАМЕЧАНИЯ
Смотрите в openat(2) объяснение необходимости linkat().

СМОТРИТЕ ТАКЖЕ
link(2), openat(2), path_resolution(7), symlink(7)