lchown()

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

Прототип:

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

Аргументы:

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

Библиотека:

libc

Описание:

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

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

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

Если аргумент пути path относится к обычному файлу, биты set-user-ID (S_ISUID) и set-group-ID (S_ISGID) файлового режима сбрасываются, если функция выполняется успешно.

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

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

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

Коды ошибок:

EACCES
В разрешении на поиск в компоненте пути к файлу отказано.
ELOOP
Слишком много уровней символических ссылок или префиксов в пути к файлу.
ENAMETOOLONG
Длина строки path превышает PATH_MAX, или компонент пути к файлу длиннее, чем NAME_MAX.
ENOENT
Компонент пути к файлу не существует, или аргумент path указывает на пустую строку.
ENOSYS
Функция lchown() не реализована для файловой системы, указанной в 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 ( lchown( argv[i], getuid(), getgid() ) == -1 )
{
perror( argv[i] );
ecode++;
}
}
return (ecode);
}

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

POSIX 1003.1 XSI

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

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

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




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