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
может привести к немедленному запрету доступа к уже открытым файлам.
Кэширование на клиенте может привести к задержке между сменой
владельца и истинным моментом, когда этот пользователь сможет
обратиться к файлу с других клиентов.