diff options
author | Jeff Vander Stoep <jeffv@google.com> | 2015-04-15 15:39:47 -0700 |
---|---|---|
committer | Jeff Vander Stoep <jeffv@google.com> | 2015-04-20 08:26:13 -0700 |
commit | d33fe1742ea81a7e69094175e39700c1dbed927f (patch) | |
tree | 831c5fc75eb3704eb57e0048cfff946f856b994f | |
parent | 62ec721cb757fbfc10a5106692dd996845878c45 (diff) | |
download | checkpolicy-master-soong.tar.gz |
dispol: display operations as ranges.master-soong
Change-Id: Ic40a137a9b3f1023a6b23f67d0b05708486a98d0
-rw-r--r-- | test/dispol.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/test/dispol.c b/test/dispol.c index 7be9267..3b7726d 100644 --- a/test/dispol.c +++ b/test/dispol.c @@ -55,23 +55,50 @@ int render_access_mask(uint32_t mask, avtab_key_t * key, policydb_t * p, } #define operation_perm_test(x, p) (1 & (p[x >> 5] >> (x & 0x1f))) +#define next_bit_in_range(i, p) \ + ((i + 1 < sizeof(p)*8) && operation_perm_test((i + 1), p)) int render_operations(avtab_operations_t *ops, avtab_key_t * key, FILE * fp) { uint16_t value; - unsigned int bit = 0; + uint16_t low_bit; + uint16_t low_value; + unsigned int bit; + unsigned int in_range = 0; fprintf(fp, "{ "); for (bit = 0; bit < sizeof(ops->perms)*8; bit++) { if (!operation_perm_test(bit, ops->perms)) continue; + + if (in_range && next_bit_in_range(bit, ops->perms)) { + /* continue until high value found */ + continue; + } else if (next_bit_in_range(bit, ops->perms)) { + /* low value */ + low_bit = bit; + in_range = 1; + continue; + } + if (key->specified & AVTAB_OPNUM) { value = ops->type<<8 | bit; - fprintf(fp, "0x%hx ", value); + low_value = ops->type<<8 | low_bit; + if (in_range) + fprintf(fp, "0x%hx-0x%hx ", low_value, value); + else + fprintf(fp, "0x%hx ", value); } else if (key->specified & AVTAB_OPTYPE) { value = bit << 8; - fprintf(fp, "0x%hx-0x%hx ", value, value|0xff); + low_value = low_bit << 8; + if (in_range) + fprintf(fp, "0x%hx-0x%hx ", low_value, (uint16_t) (value|0xff)); + else + fprintf(fp, "0x%hx-0x%hx ", value, (uint16_t) (value|0xff)); + } + if (in_range) + in_range = 0; } fprintf(fp, "}"); return 0; |