dispol: display operations as ranges

Displays operations ranges more concisely. E.g.

{ 0x8901-0x8930 }

instead of

{ 0x8901 0x8902 0x8903 0x8904 80x8905 0x0806 ... 0x8930 }

Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
This commit is contained in:
Jeff Vander Stoep 2015-04-27 15:05:31 -07:00 committed by Stephen Smalley
parent 994db9d390
commit 7f1ec68362

View File

@ -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 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) int render_operations(avtab_operations_t *ops, avtab_key_t * key, FILE * fp)
{ {
uint16_t value; 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, "{ "); fprintf(fp, "{ ");
for (bit = 0; bit < sizeof(ops->perms)*8; bit++) { for (bit = 0; bit < sizeof(ops->perms)*8; bit++) {
if (!operation_perm_test(bit, ops->perms)) if (!operation_perm_test(bit, ops->perms))
continue; 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) { if (key->specified & AVTAB_OPNUM) {
value = ops->type<<8 | bit; 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) { } else if (key->specified & AVTAB_OPTYPE) {
value = bit << 8; 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, "}"); fprintf(fp, "}");
return 0; return 0;