Как отмечалось в разделе 15.1, нижние 12 битов поля st_mode структуры stat задают права доступа для файла. Первые три из этих битов являются специальными и называются set-user-ID, set-group-ID и бит закрепления (закрепляющий бит) (на рис. 15.1 они обозначены буквами U, G и T). Подробнее о них мы поговорим в подразделе 15.4.5. Остальные девять битов формируют маску, определяющую права доступа, которые предоставляются различным категориям пользователей, получающих доступ к файлу. Маска прав доступа к файлу разделяет объекты на три категории.
•
Термин «пользователь» используется такими командами, как chmod(1), которые обозначают буквой u эту категорию прав доступа.
•
Каждой категории пользователей могут быть предоставлены следующие три права доступа:
•
•
Права доступа и принадлежность файла можно просмотреть с помощью команды ls — l, как показано в следующем примере:
$ ls — l myscript.sh
— rwxr-x- 1 mtk users 1667 Jan 15 09:22 myscript.sh
Права доступа к файлу отображаются как rwxr-x- (дефис, с которого начинается эта строка, сообщает тип файла: обычный файл). Для интерпретации данной строки следует разбить эти девять символов на блоки по три символа, которые будут указывать на предоставленные права доступа: чтение, запись или выполнение. Первый блок сообщает о правах доступа для владельца; ему разрешены чтение, запись и выполнение. Следующий блок сообщает о правах доступа для группы: разрешены чтение и выполнение, но не запись. Последний блок сообщает права доступа для остальных пользователей: им не предоставлено никаких прав.
Заголовочный файл
Помимо показанных в табл. 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': '-',