Home | History | Annotate | Download | only in sepolicy-analyze
      1 #include <getopt.h>
      2 
      3 #include "attribute.h"
      4 
      5 void attribute_usage() {
      6     fprintf(stderr, "\tattribute [-l|--list] [-r|--reverse] <name>\n");
      7 }
      8 
      9 static void retrieve_mapping(policydb_t *policydb, struct type_datum *dat, char *name, int reverse) {
     10     struct ebitmap_node *n;
     11     unsigned int bit;
     12 
     13     if (reverse) {
     14         ebitmap_for_each_bit(&policydb->type_attr_map[dat->s.value - 1], n, bit) {
     15             if (!ebitmap_node_get_bit(n, bit))
     16                 continue;
     17             if (!strcmp(policydb->p_type_val_to_name[bit], name))
     18                 continue;
     19             printf("%s\n", policydb->p_type_val_to_name[bit]);
     20         }
     21     } else {
     22         ebitmap_for_each_bit(&policydb->attr_type_map[dat->s.value - 1], n, bit) {
     23             if (!ebitmap_node_get_bit(n, bit))
     24                 continue;
     25             printf("%s\n", policydb->p_type_val_to_name[bit]);
     26         }
     27     }
     28 }
     29 
     30 static int list_attribute(policydb_t *policydb, char *name, int reverse)
     31 {
     32     struct type_datum *dat;
     33 
     34     dat = hashtab_search(policydb->p_types.table, name);
     35     if (!dat) {
     36         fprintf(stderr, "%s is not defined in this policy.\n", name);
     37         return -1;
     38     }
     39 
     40     if (reverse) {
     41         if (dat->flavor != TYPE_TYPE) {
     42             fprintf(stderr, "%s is an attribute not a type in this policy.\n", name);
     43             return -1;
     44         }
     45     } else {
     46         if (dat->flavor != TYPE_ATTRIB) {
     47             fprintf(stderr, "%s is a type not an attribute in this policy.\n", name);
     48             return -1;
     49         }
     50     }
     51     retrieve_mapping(policydb, dat, name, reverse);
     52 
     53     return 0;
     54 }
     55 
     56 static int print_attr(__attribute__ ((unused)) hashtab_key_t k,
     57                       hashtab_datum_t d, void *args) {
     58     struct type_datum *dat = (struct type_datum *)d;
     59     policydb_t *pdb = (policydb_t *)args;
     60     if (!dat) {
     61         fprintf(stderr, "type encountered without datum!\n");
     62         return -1;
     63     }
     64     if (dat->flavor == TYPE_ATTRIB) {
     65         printf("%s\n", pdb->p_type_val_to_name[dat->s.value - 1]);
     66     }
     67     return 0;
     68 }
     69 
     70 static int list_all_attributes(policydb_t *policydb) {
     71     return hashtab_map(policydb->p_types.table, print_attr, policydb);
     72 }
     73 
     74 int attribute_func (int argc, char **argv, policydb_t *policydb) {
     75     int rc = -1;
     76     int list = 0;
     77     int reverse = 0;
     78     char ch;
     79 
     80     struct option attribute_options[] = {
     81         {"list", no_argument, NULL, 'l'},
     82         {"reverse", no_argument, NULL, 'r'},
     83         {NULL, 0, NULL, 0}
     84     };
     85 
     86     while ((ch = getopt_long(argc, argv, "lr", attribute_options, NULL)) != -1) {
     87         switch (ch) {
     88         case 'l':
     89             list = 1;
     90             break;
     91         case 'r':
     92             reverse = 1;
     93             break;
     94         default:
     95             USAGE_ERROR = true;
     96             goto out;
     97         }
     98     }
     99 
    100     if ((argc != 2 && !(reverse && argc == 3)) || (list && reverse)) {
    101         USAGE_ERROR = true;
    102         goto out;
    103     }
    104     if (list)
    105         rc = list_all_attributes(policydb);
    106     else
    107         rc = list_attribute(policydb, argv[optind], reverse);
    108  out:
    109     return rc;
    110 }
    111