ИМЯ chmod, fchmod, fchmodat - изменяет права доступа к файлу
ОБЗОР #include <sys/stat.h>
int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode);
#include <fcntl.h> /* определения констант AT_* */ #include <sys/stat.h>
int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
fchmod(): /* начиная с glibc 2.16: */ _POSIX_C_SOURCE || /* версии glibc <= 2.19: */ _BSD_SOURCE || /* версии glibc <= 2.15: */ _XOPEN_SOURCE >= 500 || /* Glibc 2.12 - 2.15: */ _POSIX_C_SOURCE >= 200809L
fchmodat(): Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE
ОПИСАНИЕ Системные вызовы chmod() и fchmod() изменяют биты режима файла (режим файла состоит из бит прав доступа к файлу плюс биты set-user-ID, set-group-ID и бит закрепления) Данные системные вызовы отличаются только способом указания файла:
* Вызов chmod() изменяет режим файла, задаваемого путём из параметра pathname, который разыменовывается, если является символьной ссылкой.
* Вызов fchown() изменяет режим файла, задаваемого открытым файловым дескриптором fd.
Новый режим файла указывается в mode и представляет собой битовую маску, создаваемую побитовым сложением нуля или более следующих констант:
S_ISUID (04000) set-user-ID (установить эффективный идентификатор пользователя процесса при execve(2))
S_ISGID (02000) set-group-ID (установить эффективный идентификатор группы процесса при execve(2); обязательная блокировка, описывается в fcntl(2); выбрать новую группу файла от родительского каталога, описывается в chown(2) и mkdir(2))
S_ISVTX (01000) закрепляющий бит (ограничительный флаг удаления, описывается в unlink(2))
S_IRUSR (00400) владелец может читать
S_IWUSR (00200) владелец может писать
S_IROTH (00004) все остальные могут читать
S_IWOTH (00002) все остальные могут писать
S_IXOTH (00001) все остальные могут выполнять файл или искать в каталоге
Эффективный идентификатор пользователя (UID) вызывающего процесса должен совпадать с UID владельца файла или процесс должен быть привилегированным (Linux: у него должен быть мандат CAP_FOWNER).
Если вызывающий процесс не является привилегированным (Linux: не имеет мандата CAP_FSETID), а группа-владелец файла не совпадает с эффективным групповым ID процесса или одним из его дополнительных групповых идентификаторов, то бит S_ISGID будет сброшен, но ошибки при этом не возникнет.
В зависимости от файловой системы в целях безопасности биты выполнения set-user-ID и set-group-ID могут сбрасываться при записи в файл (в Linux это происходит, если записывающий процесс не имеет мандата CAP_FSETID). В некоторых файловых системах только суперпользователь может устанавливать закрепляющий бит, который может иметь специальное назначение. Значения закрепляющего бита, set-user-ID и set-group-ID для каталогов смотрите в stat(2).
В файловых системах NFS ограничивающие права сразу начинают действовать даже уже на открытые файлы, так как контроль доступа выполняется сервером, но открытые файлы находятся в ведении клиента. Распространение прав может откладываться для других клиентов, если у них установлен атрибут кэширования.
fchmodat() Системный вызов fchmodat() работает также как системный вызов chmod(), за исключением случаев, описанных здесь.
Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в chmod()).
Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как chmod()).
Если в pathname задан абсолютный путь, то dirfd игнорируется.
Значение flags может быть 0, или включать следующие флаги:
AT_SYMLINK_NOFOLLOW Если значение pathname является символьной ссылкой, не разыменовывать её, а изменить права на самой ссылке. Этот флаг пока не реализован.
Смотрите в openat(2) объяснение необходимости fchmodat().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ В зависимости от файловой системы могут также возвращаться другие ошибки, перечисленные далее.
ELOOP Во время определения pathname встретилось слишком много символьных ссылок.
ENAMETOOLONG Слишком длинное значение аргумента pathname.
ENOENT Файл не существует.
ENOMEM Недостаточное количество памяти ядра.
ENOTDIR Компонент в префиксе пути не является каталогом.
EPERM Эффективный UID не совпадает с идентификатором владельца файла, а процесс не является привилегированным (Linux: не имеет мандата CAP_FOWNER).
EROFS Указанный файл находится на файловой системе, смонтированной только для чтения.
Общий набор ошибок для fchmod() таков:
EBADF Файловый дескриптор fd не действителен.
EIO См. выше.
EPERM См. выше.
EROFS См. выше.
В fchmodat() могут возникнуть те же ошибки, что и в chmod(). Также, в fchmodat() могут возникнуть следующие ошибки:
EBADF Значение dirfd не является правильным файловым дескриптором.
EINVAL Указано неверное значение в flags.
ENOTDIR Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.
ENOTSUP В flags указано AT_SYMLINK_NOFOLLOW, но оно не поддерживается.
ВЕРСИИ Вызов fchmodat() был добавлен в ядро Linux версии 2.6.16; поддержка в glibc доступна с версии 2.4.
СООТВЕТСТВИЕ СТАНДАРТАМ chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008.
fchmodat(): POSIX.1-2008.
ЗАМЕЧАНИЯ Отличия между библиотекой C и ядром В этой странице описана обёрточная функция fchmodat() библиотеки GNU C, реализующая POSIX-интерфейс. Данный интерфейс отличается от лежащего в основе системного вызова Linux тем, что имеет аргумент flags.
|