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
Начиная с версии 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.1. Напишите программу, которая отображает права доступа из записи ACL-списка, соответствующей какому-либо пользователю или группе. Эта программа должна принимать через командную строку два аргумента. Первым может быть либо буква u, либо буква g, указывающая на то, что именно идентифицирует второй аргумент — пользователя или группу. (Функции, определенные в листинге 8.1, можно использовать для того, чтобы разрешить ввод второго аргумента либо в числовом представлении, либо как имя.) Если запись ACL-списка, соответствующая указанному пользователю или группе, попадает в класс группы, то программа должна дополнительно отображать права доступа, которые были бы предоставлены после того, как эта запись будет изменена путем записи-маски.
18. Каталоги и ссылки
В данной главе мы завершаем обсуждение вопросов, относящихся к файлам, рассмотрев каталоги и ссылки. После обзора их реализации будут описаны системные вызовы для создания и удаления каталогов и ссылок. Затем будут представлены библиотечные функции, которые позволяют программам сканировать содержимое одиночного каталога, а также выполнять обход (то есть проверить каждый файл) каталога.
Каждый процесс имеет два атрибута, относящихся к каталогу: корневой каталог, задающий точку, относительно которой интерпретируются абсолютные имена путей, и рабочий каталог, задающий точку, относительно которой интерпретируются относительные имена путей. Мы рассмотрим системные вызовы, позволяющие процессу менять оба этих атрибута.
В завершение данной главы мы обсудим библиотечные функции, которые применяются для анализа имен путей и их разбора на компоненты, содержащие имена каталога и файла.
• для каталога указывается другой тип файла в записи индексного дескриптора (см. раздел 14.4);
• каталог является файлом с особым упорядочением. По сути, это таблица, состоящая из имен файлов и номеров индексных дескрипторов.