Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

F_OK
Проверка существования файла.

Проверяется каждый компонент в имени пути, а на некоторых реализациях при проверке для

root access
может действовать, как если бы был установлен
X_OK
, даже если в правах доступа к файлу не установлены биты, разрешающие исполнение. (Странно, но верно: в этом случае предупрежденный вооружен.) В Linux нет такой проблемы.

Если

path
является символической ссылкой,
access
проверяет файл, на который указывает символическая ссылка.

Возвращаемое значение равно 0, если операция для действительных UID и GID разрешена,

и -1 в противном случае. Соответственно, если
access
возвращает -1, программа с setuid может запретить доступ к файлу, с которым в противном случае эффективный UID/GID смог бы работать:

if (access("/some/special/file", R_OK|W_OK) < 0) {

 fprintf(stderr, "Sorry: /some/special/file: %s\n",

strerror(errno));

 exit(1);

}

По крайней мере для серии ядра Linux 2.4, когда тест X_OK применяется к файловой системе, смонтированной с опцией

noexec
(см. раздел 8.2.1 «Использование опций монтирования»), тест успешно проходится, если права доступа к файлу имеют разрешение на исполнение. Это верно, несмотря на то, что попытка выполнить файл завершилась бы неудачей.

ЗАМЕЧАНИЕ. Хотя использование

access
перед открытием файла является обычной практикой, существует состояние гонки открываемый файл может быть сброшен при подкачке между проверкой функцией
access
и вызовом
open
. Необходимо осмотрительное программирование, такое, как проверка владельца и прав доступа с помощью
stat
и
fstat
до и после вызовов
access
и
open
.

Например, программа

pathchk
проверяет действительность имен путей. GNU версия использует
access
для проверки того, что компоненты каталога данного пути действительны. Из Coreutils
pathchk.c
:

244 /* Возвращает 1, если PATH является годным к использованию

245 каталогом, 0 если нет, 2 если он не существует. */

246

247 static int

248 dir_ok(const char *path)

249 {

250 struct stat stats;

251

252 if (stat (path, &stats)) /* Nonzero return = failure */

253 return 2;

254

255 if (!S_ISDIR(stats.st_mode))

256 {

257 error(0, 0, _("'%s" is not a directory"), path);

258 return 0;

259 }

260

261 /* Используйте access для проверки прав доступа на поиск,

262 поскольку при проверке битов прав доступа st_mode они могут

263 потеряться новыми механизмами управления доступом. Конечно,

264 доступ теряется, если вы используете setuid. */

265 if (access (path, X_OK) != 0)

266 {

267 if (errno == EACCES)

268 error (0, 0, _("directory '%s' is not searchable"), path);

269 else

270 error(0, errno, "%s", path);

271 return 0;

272 }

273

274 return 1;

275 }

Код

прост. Строки 252–253 проверяют, существует ли файл. Если
stat
завершится неудачей, файл не существует. Строки 255–259 удостоверяют, что файл в самом деле является каталогом.

Комментарий в строках 261–264 объясняет использование

access
. Проверки битов
st_mode
недостаточно: файл может находиться в файловой системе, которая смонтирована только для чтения, в удаленной файловой системе или в файловой системе, не принадлежащей Linux или Unix, или у файла могут быть атрибуты, предотвращающие доступ. Таким образом, лишь ядро может в действительности сказать, будет ли работать
access
. Строки 265–272 осуществляют проверку, выдавая сообщение об ошибке, определяемое значением
errno
(строки 267–270).

11.4. Проверка для эффективного пользователя:

euidaccess
(GLIBC)

GLIBC предоставляет дополнительную функцию, которая работает подобно

access
, но проверяет в соответствии с эффективными UID, GID и набором групп:

#include <unistd.h> /* CLIBC */

int euidaccess(const char *path, int amode);

Аргументы и возвращаемое значение имеют тот же смысл, как для

access
. Когда равны эффективный и действительный UID и эффективный и действительный GID,
euidaccess
вызывает для осуществления теста
access
. Это имеет то преимущество, что ядро может проверить файловую систему только для чтения или другие условия, которые не отражаются в правах доступа и владении файлами.

В противном случае

euidaccess
сравнивает значения владельца и группы файла со значениями эффективных UID и GID и набора групп, используя соответствующие биты прав доступа. Этот тест основан на сведениях о файле от
stat
.

Если вы пишете переносимую программу, но предпочитаете использовать этот интерфейс, достаточно просто извлечь исходный файл из архива GLIBC и приспособить его для общего использования.

11.5. Установка дополнительных битов доступа для каталогов

На современных системах setgid и «липкий» биты имеют особое значение при применении к каталогам.

11.5.1. Группа по умолчанию для новых файлов и каталогов

В оригинальной системе Unix, когда

open
или
creat
создавали новый файл, он получал эффективные UID и GID создавшего их процесса.

V7, BSD вплоть до BSD 4.1 и System V вплоть до Release 3 все трактовали каталоги как файлы. Однако, с добавлением дополнительного набора групп в BSD 4.2 способ создания новых каталогов изменился: новые каталоги наследовали группу родительского каталога. Более того, новые файлы также наследовали ID группы родительского каталога, а не эффективный GID создающего процесса.

Поделиться:
Популярные книги

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Воронцов. Перезагрузка. Книга 4

Тарасов Ник
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Трое с площади Карронад

Крапивин Владислав Петрович
Детские:
детские приключения
9.10
рейтинг книги
Трое с площади Карронад

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Гром Раскатного. Том 2

Володин Григорий Григорьевич
2. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 2

Старый, но крепкий 5

Крынов Макс
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 5

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6