Как отмечалось в разделе 15.1, нижние 12 битов поля st_mode структуры stat задают права доступа для файла. Первые три из этих битов являются специальными и называются set-user-ID, set-group-ID и бит закрепления (закрепляющий бит) (на рис. 15.1 они обозначены буквами U, G и T). Подробнее о них мы поговорим в подразделе 15.4.5. Остальные девять битов формируют маску, определяющую права доступа, которые предоставляются различным категориям пользователей, получающих доступ к файлу. Маска прав доступа к файлу разделяет объекты на три категории.

• Владелец (известный также как пользователь). Такие права доступа предоставлены владельцу данного файла.

Термин «пользователь» используется такими командами, как chmod(1), которые обозначают буквой u эту категорию прав доступа.

Группа. Такие права доступа предоставляются пользователям, входящим в группу файла.

• Остальные. Права доступа, предоставляемые всем остальным пользователям.

Каждой категории пользователей могут быть предоставлены следующие три права доступа:

• чтение: содержимое файла можно читать;

запись: содержимое файла можно изменять;

• выполнение: данный файл можно выполнить (то есть это программа или сценарий). Для запуска файла сценария (например, bash) необходимо наличие прав на чтение и выполнение.

Права доступа и принадлежность файла можно просмотреть с помощью команды ls — l, как показано в следующем примере:

$ ls — l myscript.sh

— rwxr-x- 1 mtk users 1667 Jan 15 09:22 myscript.sh

Права доступа к файлу отображаются как rwxr-x- (дефис, с которого начинается эта строка, сообщает тип файла: обычный файл). Для интерпретации данной строки следует разбить эти девять символов на блоки по три символа, которые будут указывать на предоставленные права доступа: чтение, запись или выполнение. Первый блок сообщает о правах доступа для владельца; ему разрешены чтение, запись и выполнение. Следующий блок сообщает о правах доступа для группы: разрешены чтение и выполнение, но не запись. Последний блок сообщает права доступа для остальных пользователей: им не предоставлено никаких прав.

Заголовочный файл определяет константы, которые с помощью операции И (&) можно объединить со значением поля st_mode структуры stat, чтобы проверить, какие именно биты прав доступа установлены. (Эти константы определены также благодаря подключению файла , прототипирующий системный вызов open().) Данные константы приведены в табл. 15.4.

Помимо показанных в табл. 15.4, определены три константы, чтобы уравнять маски всех трех прав доступа для каждой категории — владельца, группы и остальных: S_IRWXU (0700), S_IRWXG (070) и S_IRWXO (07).

Таблица 15.4. Константы для битов прав доступа к файлу

Константа — Восьмеричное значение — Бит прав доступа

S_ISUID — 04000 — Set-user-ID

S_ISGID — 02000 — Set-group-ID

S_ISVTX — 01000 — Закрепляющий

S_IRUSR — 0400 — Пользователь: чтение

S_IWUSR — 0200 — Пользователь: запись

S_IXUSR — 0100 — Пользователь: выполнение

S_IRGRP — 040 — Группа: чтение

S_IWGRP — 020 — Группа: запись

S_IXGRP — 010 — Группа: выполнение

S_IROTH — 04 — Остальные: чтение

S_IWOTH — 02 — Остальные: запись

S_IXOTH — 01 — Остальные: выполнение

Заголовочный файл в листинге 15.3 объявляет функцию filePermStr(), которая после принятия маски прав доступа к файлу возвращает статически размещенное строковое представление этой маски в таком же стиле, какой используется командой ls(1).

Листинг 15.3. Заголовочный файл для file_perms.c

files/file_perms.h

#ifndef FILE_PERMS_H

#define FILE_PERMS_H

#include

#define FP_SPECIAL 1 /* Включить в возвращаемую строку информацию о битах

set-user-ID, set-group-ID и закрепляющем */

char *filePermStr(mode_t perm, int flags);

#endif

files/file_perms.h

Если флаг FP_SPECIAL установлен в качестве аргумента filePermStr() flags, то возвращаемая строка содержит параметры битов set-user-ID, set-group-ID и закрепляющего опять-таки в стиле команды ls(1).

Реализация функции filePermStr() приведена в листинге 15.4. Мы применяем эту функцию в программе из листинга 15.1.

Листинг 15.4. Преобразование маски прав доступа к файлу в строку

files/file_perms.c

#include

#include

#include "file_perms.h" /* Интерфейс для данной реализации */

#define STR_SIZE sizeof("rwxrwxrwx")

char * /* Возвращает вместо маски прав доступа к файлу

строку в стиле ls(1) */

filePermStr(mode_t perm, int flags)

{

static char str[STR_SIZE];

snprintf(str, STR_SIZE, "%c%c%c%c%c%c%c%c%c",

(perm & S_IRUSR)? 'r': '-', (perm & S_IWUSR)? 'w': '-',

Перейти на страницу:

Похожие книги