case 'd': type = ACL_TYPE_DEFAULT; break;

case '?': usageError(argv[0]);

}

}

if (optind + 1!= argc)

usageError(argv[0]);

acl = acl_get_file(argv[optind], type);

if (acl == NULL)

errExit("acl_get_file");

/* Просмотр каждой записи в этом ACL-списке */

for (entryId = ACL_FIRST_ENTRY;; entryId = ACL_NEXT_ENTRY) {

if (acl_get_entry(acl, entryId, &entry)!= 1)

break; /* Выход при ошибке или по окончании записей */

/* Извлечение и отображение типа тега */

if (acl_get_tag_type(entry, &tag) == -1)

errExit("acl_get_tag_type");

printf("%-12s", (tag == ACL_USER_OBJ)? "user_obj":

(tag == ACL_USER)? "user":

(tag == ACL_GROUP_OBJ)? "group_obj":

(tag == ACL_GROUP)? "group":

(tag == ACL_MASK)? "mask":

(tag == ACL_OTHER)? "other": "???");

/* Извлечение и отображение необязательного тега-спецификатора */

if (tag == ACL_USER) {

uidp = acl_get_qualifier(entry);

if (uidp == NULL)

errExit("acl_get_qualifier");

name = userNameFromId(*uidp);

if (name == NULL)

printf("%-8d", *uidp);

else

printf("%-8s", name);

if (acl_free(uidp) == -1)

errExit("acl_free");

} else if (tag == ACL_GROUP) {

gidp = acl_get_qualifier(entry);

if (gidp == NULL)

errExit("acl_get_qualifier");

name = groupNameFromId(*gidp);

if (name == NULL)

printf("%-8d", *gidp);

else

printf("%-8s", name);

if (acl_free(gidp) == -1)

errExit("acl_free");

} else {

printf(" ");

}

/* Извлечение и отображение прав доступа */

if (acl_get_permset(entry, &permset) == -1)

errExit("acl_get_permset");

permVal = acl_get_perm(permset, ACL_READ);

if (permVal == -1)

errExit("acl_get_perm — ACL_READ");

printf("%c", (permVal == 1)? 'r': '-');

permVal = acl_get_perm(permset, ACL_WRITE);

if (permVal == -1)

errExit("acl_get_perm — ACL_WRITE");

printf("%c", (permVal == 1)? 'w': '-');

permVal = acl_get_perm(permset, ACL_EXECUTE);

if (permVal == -1)

errExit("acl_get_perm — ACL_EXECUTE");

printf("%c", (permVal == 1)? 'x': '-');

printf("\n");

}

if (acl_free(acl) == -1)

errExit("acl_free");

exit(EXIT_SUCCESS);

}

acl/acl_view.c

17.9. Резюме

Начиная с версии 2.6 Linux поддерживает списки контроля доступа (ACL-списки). Они расширяют традиционную модель прав доступа к файлам в UNIX, позволяя управлять разрешениями, предоставляемыми конкретным пользователям и группам.

Дополнительная информация

Последние версии (Draft 17) временных стандартов POSIX.1e и POSIX.2c доступны на веб-странице wt.tuxomania.net/publications/posix.1e/.

На странице acl(5) руководства приводится обзор ACL-списков, а также указания, относящиеся к портируемости различных библиотечных ACL-функций, реализованных в Linux.

Подробности о реализации ACL-списков и расширенных атрибутов в Linux можно найти в работе [Grьnbacher, 2003]. Ее автор, Андреас Грюнбахер (Andreas Grьnbacher) ведет также сайт http://acl.bestbits.at/, содержащий информацию о списках контроля доступа.

17.10. Упражнение

17.1. Напишите программу, которая отображает права доступа из записи ACL-списка, соответствующей какому-либо пользователю или группе. Эта программа должна принимать через командную строку два аргумента. Первым может быть либо буква u, либо буква g, указывающая на то, что именно идентифицирует второй аргумент — пользователя или группу. (Функции, определенные в листинге 8.1, можно использовать для того, чтобы разрешить ввод второго аргумента либо в числовом представлении, либо как имя.) Если запись ACL-списка, соответствующая указанному пользователю или группе, попадает в класс группы, то программа должна дополнительно отображать права доступа, которые были бы предоставлены после того, как эта запись будет изменена путем записи-маски.

<p>18. Каталоги и ссылки</p>

В данной главе мы завершаем обсуждение вопросов, относящихся к файлам, рассмотрев каталоги и ссылки. После обзора их реализации будут описаны системные вызовы для создания и удаления каталогов и ссылок. Затем будут представлены библиотечные функции, которые позволяют программам сканировать содержимое одиночного каталога, а также выполнять обход (то есть проверить каждый файл) каталога.

Каждый процесс имеет два атрибута, относящихся к каталогу: корневой каталог, задающий точку, относительно которой интерпретируются абсолютные имена путей, и рабочий каталог, задающий точку, относительно которой интерпретируются относительные имена путей. Мы рассмотрим системные вызовы, позволяющие процессу менять оба этих атрибута.

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

18.1. Каталоги и (жесткие) ссылки

Каталог хранится в файловой системе, подобно обычному файлу. Две особенности отличают каталог от обычного файла:

• для каталога указывается другой тип файла в записи индексного дескриптора (см. раздел 14.4);

• каталог является файлом с особым упорядочением. По сути, это таблица, состоящая из имен файлов и номеров индексных дескрипторов.

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

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