fchown()

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

Прототип:

#include <sys/types.h>
#include <unistd.h>
int fchown( int fd,
uid_t owner,
gid_t group );

Аргументы:

fd
Файловый дескриптор для файла, идентификаторы пользователя и группы которого планируется изменить.
owner
Новый идентификатор пользователя.
group
Новый идентификатор группы.

Библиотека:

libc

Описание:

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

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

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

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

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

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

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

Коды ошибок:

EBADF
Некорректный файловый дескриптор.
EPERM
Эффективный идентификатор пользователя не совпадает с владельцем файла или вызывающий процесс не имеет необходимых прав доступа.
EROFS
Указанный файл находится в файловой системе, доступной только для чтения.

Примеры:

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

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

POSIX 1003.1

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

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

chmod(), chown(), errno, fchmod(), fstat(), lchown(), open(), stat()




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