chown, fchown, lchown - функции, изменяющие владельца файла
НАЗВАНИЕchown, fchown, lchown - функции, изменяющие владельца
файла
СИНТАКСИС
#include
#include
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
ОПИСАНИЕ
Владелец файла, который задан параметром path или fd,
будет изменен. Только суперпользователь может изменить
владельца файла. Владелец файла может изменять группу
файла на любую группу, к которой он принадлежит.
Суперпользователь может произвольно производить эту
замену. Если значение параметров owner или group равно
-1, то соответствующий идентификатор не изменяется. Когда
владелец или группа исполняемого файла изменяются не
суперпользователем, то биты S_ISUID и S_ISGID будут
сброшены. POSIX не требует, чтобы это происходило, когда
суперпользователь выполняет функцию chown: в этом случае
все зависит от версии ядра Linux. Если в правах доступа к
файлу не установлен бит исполнения группой (S_IXGRP), то
бит S_ISGID означает принудительную блокировку этого
файла и не очищается функцией chown.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
После успешного выполнения действия возвращаемое значение
равно нулю. При ошибке оно равно -1, а переменной errno
присваивается соответствующий код ошибки.
КОДЫ ОШИБОК
Основные коды ошибок chown:
EPERM (фактический UID не совпадает с номером владельца
файла и не равен нулю; параметры owner или group
заданы неверно);
EROFS (файл находится в файловой системе, предназначенной
только для чтения);
EFAULT ( path указывает на каталог за пределами доступного
адресного пространства);
ENAMETOOLONG
(полное имя path является слишком длинным);
ENOENT (файла не существует);
ENOMEM (недостаточно памяти в системе);
ENOTDIR
(компонент path не является каталогом);
EACCES (запрещен поиск в одном из каталогов, являющихся
компонентом пути);
ELOOP ( path является зацикленной символьной ссылкой, то
есть при соответствующей подстановке возникает
ссылка на неё саму).
Основные ошибки fchown:
EBADF (неправильный описатель файла);
ENOENT (см. выше);
EPERM (см. выше);
EROFS (см. выше);
EIO (при модификации inode произошла ошибка
низкоуровневого ввода-вывода).
ЗАМЕЧАНИЯ
В версиях Linux до 2.1.81 (кроме 2.1.46) chown не проходит
по символьным ссылками. Начиная с версии Linux 2.1.81,
chown проходит по символьным ссылкам; кроме того,
существует новый системный вызов lchown, который не
следует по символьным ссылкам. Начиная с Linux 2.1.86,
этот новый вызов (имеющий ту же семантику, что и старый
chown), имеет тот же самый номер системного вызова, а
chown получил новый номер.
Прототип fchown доступен, только если определено
_BSD_SOURCE (либо явно, либо неявно - не определением
переменной _POSIX_SOURCE или компилированием с флагом
-ansi).
СООТВЕТСТВИЕ СТАНДАРТАМ
Вызов chown соответствует SVr4, SVID, POSIX, X/OPEN. В
версии 4.4BSD его может делать только суперпользователь
(то есть обычные пользователи не могут передавать файлы).
SVr4 описывает EINVAL, EINTR, ENOLINK и EMULTIHOP, но не
документирует ENOMEM. POSIX.1 не описывает ENOMEM и
ELOOP.
Вызов fchown соответствует 4.4BSD и SVr4. SVr4 описывает
дополнительные коды ошибок EINVAL, EIO, EINTR и ENOLINK.
ОГРАНИЧЕНИЯ
Семантика chown() специально нарушается в файловых
системах NFS с разрешенным преобразованием UID. Вдобавок
нарушается семантика всех системных вызовов к содержимому
файла, потому что выполнение chown() может привести к
немедленному запрету доступа к уже открытым файлам.
Кэширование на клиенте может привести к задержке между
сменой владельца и истинным моментом, когда этот
пользователь сможет обратиться к файлу на других клиентах.