Функция acl_get_file() извлекает копию ACL-списка файла, идентифицируемого по аргументу pathname.
acl_t acl;
acl = acl_get_file(pathname, type);
Эта функция извлекает либо ACL-список доступа, либо ACL-список по умолчанию, в зависимости от того, какое значение указано для аргумента type: ACL_TYPE_ACCESS или ACL_TYPE_DEFAULT. В качестве результата функция acl_get_file() возвращает описатель (типа acl_t) для использования с другими ACL-функциями.
Функция acl_get_entry() извлекает описатель (типа acl_entry_t), соотнесенный с одной из записей ACL-списка, размещенного в памяти и указанного с помощью аргумента acl. Данный описатель возвращается в то место, на которое указывает последний аргумент функции.
acl_entry_t entry;
status = acl_get_entry(acl, entry_id, &entry);
Аргумент entry_id определяет, описатель какой записи следует возвращать. Если для этого аргумента указано значение ACL_FIRST_ENTRY, то возвращается описатель первой записи в ACL-списке. Если для аргумента entry_id указано значение ACL_NEXT_ENTRY, то возвращается описатель записи, следующей за последней извлеченной записью ACL-списка. Таким образом, можно организовать цикл по всем записям в ACL-списке, указав для аргумента type при первом вызове значение ACL_FIRST_ENTRY, а при последующих вызовах — значение ACL_NEXT_ENTRY.
Функция acl_get_entry() возвращает 1 в случае успешного извлечения записи ACL-списка, 0 — если записей больше нет и –1 в случае ошибки.
Функции acl_get_tag_type() и acl_set_tag_type() извлекают и меняют тип тега в записи ACL-списка, на которую указывает аргумент entry.
acl_tag_t tag_type;
status = acl_get_tag_type(entry, &tag_type);
status = acl_set_tag_type(entry, tag_type);
Аргумент tag_type имеет тип acl_type_t (целочисленным) и одно из следующих значений: ACL_USER_OBJ, ACL_USER, ACL_GROUP_OBJ, ACL_GROUP, ACL_OTHER или ACL_MASK.
Функции acl_get_qualifier() и acl_set_qualifier() извлекают и меняют тег-спецификатор в записи ACL-списка, на которую указывает аргумент entry. Рассмотрим пример: в нем мы полагаем, что данная запись уже определена нами как ACL_USER за счет соблюдения типа тега:
uid_t *qualp; /* Указатель на UID */
qualp = acl_get_qualifier(entry);
status = acl_set_qualifier(entry, qualp);
Тег-спецификатор действителен, только если тип тега данной записи равен ACL_USER или ACL_GROUP. В первом случае указатель qualp является указателем на идентификатор пользователя (uid_t *), а во втором случае — на идентификатор группы (gid_t *).
Функции acl_get_permset() и acl_set_permset() извлекают и изменяют набор прав доступа в записи ACL-списка, на которую ссылается аргумент entry.
acl_permset_t permset;
status = acl_get_permset(entry, &permset);
status = acl_set_permset(entry, permset);
Тип данных acl_permset_t является описателем, ссылающимся на набор прав доступа.
Следующие функции используются для работы с содержимым набора прав доступа:
int is_set;
is_set = acl_get_perm(permset, perm);
status = acl_add_perm(permset, perm);
status = acl_delete_perm(permset, perm);
status = acl_clear_perms(permset);
В каждом из перечисленных вызовов для аргумента perm указывается значение ACL_READ, ACL_WRITE или ACL_EXECUTE с обычным смыслом. Эти функции используются следующим образом:
• функция acl_get_perm() возвращает 1 (true), если право, указанное в аргументе perm, задействовано в наборе прав доступа, на который ссылается аргумент permset, и 0 — если это не так. Данная функция является расширением предварительного стандарта POSIX.1e в Linux;
• функция acl_add_perm() добавляет право доступа, указанное в аргументе perm, к набору прав, на который ссылается аргумент permset;
• функция acl_delete_perm() изымает право, указанное в аргументе perm, из набора прав доступа, на который ссылается аргумент permset (не является ошибкой удаление отсутствуюещего в наборе права);
• функция acl_clear_perms() удаляет все права доступа из набора, на который указывает аргумент permset.
Функция acl_create_entry() создает новую запись в существующем ACL-списке. Описатель, соотнесенный с новой записью, возвращается в то место, на которое указывает второй аргумент функции.
acl_entry_t entry;
status = acl_create_entry(&acl, &entry);
После этого новую запись можно заполнить с помощью функций, описанных ранее. Функция acl_delete_entry() удаляет запись из ACL-списка.
status = acl_delete_entry(acl, entry);
Функция acl_set_file() является противоположностью функции acl_get_file(). Она обновляет расположенный на диске ACL-список с помощью содержимого ACL-списка, находящегося в памяти и указанного в аргументе acl.
int status;
status = acl_set_file(pathname, type, acl);