chown()

Изменить идентификатор пользователя и идентификатор группы для файла

Прототип:

#include <sys/types.h>
#include <unistd.h>
int chown( const char *path,
uid_t owner,
gid_t group );

Аргументы:

path
Имя файла, чьи идентификаторы группы и пользователя нужно поменять.
owner
Новый идентификатор пользователя.
group
Новый идентификатор группы.

Библиотека:

libc

Описание:

Функция chown() изменяет идентификатор пользователя или группы для файла, определенного path, на числовые значения, содержащиеся соответственно в owner и group.

Если файл является символической ссылкой, chown() изменяет пользователя или группу для файла или директории, на которые указывает ссылка; lchown() изменяет владение самого файла символической ссылки.

Только процессы с эффективным идентификатором пользователя, равным идентификатору пользователя файла, или обладающие соответствующими правами (например, суперпользователь) могут изменять владение файлом.

В ЗОСРВ «Нейтрино» флаг _POSIX_CHOWN_RESTRICTED (протестирован флагом _PC_CHOWN_RESTRICTED в pathconf()) принудительно устанавливается для path. Это значит, что только суперпользователь может изменить пользователя или группу файла для кого угодно. Обычные пользователи не могут передать файл другому пользователю или группе путем изменения идентификатора пользователя или группы.

Если аргумент path ссылается на обычный файл, биты S_ISUID и S_ISGID прав доступа файла очищаются, если функция успешно завершилась.

Если chown() успешно завершилась, поле st_ctime файла помечается для обновления.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Никаких изменений прав выполнено не было. Код ошибки записан в errno.

Коды ошибок:

EACCES
Для части префикса пути отсутствует право на поиск.
ELOOP
Слишком много уровней символических ссылок или префиксов.
ENAMETOOLONG
Длина строки path превышает PATH_MAX или часть пути к файлу длиннее NAME_MAX.
ENOENT
Файл не существует, или аргумент path указывает на пустую строку.
ENOSYS
Функция chown() не реализована для файловой системы, содержащей path.
ENOTDIR
Часть префикса пути не является директорией.
EPERM
Эффективный идентификатор пользователя не совпадает с владельцем файла и вызывающий процесс не имеет соответствующих привилегий.
EROFS
Файл расположен в файловой системе, доступной только для чтения.

Примеры:

/*
* Change the ownership of a list of files
* to the current user/group
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main( int argc, char** argv )
{
int i;
int ecode = 0;
for ( i = 1; i < argc; i++ )
{
if ( chown( argv[i], getuid(), getgid() ) == -1 )
{
perror( argv[i] );
ecode++;
}
}
exit( ecode );
}

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

chmod(), errno, fchown(), fstat(), lchown(), open(), stat()




Предыдущий раздел: Описание API системной библиотеки