summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Vander Stoep <jeffv@google.com>2015-04-15 15:39:47 -0700
committerJeff Vander Stoep <jeffv@google.com>2015-04-20 08:26:13 -0700
commitd33fe1742ea81a7e69094175e39700c1dbed927f (patch)
tree831c5fc75eb3704eb57e0048cfff946f856b994f
parent62ec721cb757fbfc10a5106692dd996845878c45 (diff)
downloadcheckpolicy-master-soong.tar.gz
dispol: display operations as ranges.master-soong
Change-Id: Ic40a137a9b3f1023a6b23f67d0b05708486a98d0
-rw-r--r--test/dispol.c33
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;