1#include "attribute.h"
2
3void attribute_usage() {
4    fprintf(stderr, "\tattribute <attribute-name>\n");
5}
6
7static int list_attribute(policydb_t * policydb, char *name)
8{
9    struct type_datum *attr;
10    struct ebitmap_node *n;
11    unsigned int bit;
12
13    attr = hashtab_search(policydb->p_types.table, name);
14    if (!attr) {
15        fprintf(stderr, "%s is not defined in this policy.\n", name);
16        return -1;
17    }
18
19    if (attr->flavor != TYPE_ATTRIB) {
20        fprintf(stderr, "%s is a type not an attribute in this policy.\n", name);
21        return -1;
22    }
23
24    ebitmap_for_each_bit(&policydb->attr_type_map[attr->s.value - 1], n, bit) {
25        if (!ebitmap_node_get_bit(n, bit))
26            continue;
27        printf("%s\n", policydb->p_type_val_to_name[bit]);
28    }
29
30    return 0;
31}
32
33int attribute_func (int argc, char **argv, policydb_t *policydb) {
34    if (argc != 2) {
35        USAGE_ERROR = true;
36        return -1;
37    }
38    return list_attribute(policydb, argv[1]);
39}
40