Главная » 2017 » Ноябрь » 17 » man 2 fchmod
01:44
man 2 fchmod

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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.



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 543 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar