uid-range: add some basic operations on UidRange objects
Helpers to compare and get size, and whether the object is empty.
This commit is contained in:
@@ -340,3 +340,23 @@ bool uid_range_overlaps(const UIDRange *range, uid_t start, uid_t nr) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool uid_range_equal(const UIDRange *a, const UIDRange *b) {
|
||||
if (a == b)
|
||||
return true;
|
||||
|
||||
if (!a || !b)
|
||||
return false;
|
||||
|
||||
if (a->n_entries != b->n_entries)
|
||||
return false;
|
||||
|
||||
for (size_t i = 0; i < a->n_entries; i++) {
|
||||
if (a->entries[i].start != b->entries[i].start)
|
||||
return false;
|
||||
if (a->entries[i].nr != b->entries[i].nr)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,36 @@ static inline bool uid_range_contains(const UIDRange *range, uid_t uid) {
|
||||
|
||||
int uid_map_read_one(FILE *f, uid_t *ret_base, uid_t *ret_shift, uid_t *ret_range);
|
||||
|
||||
static inline size_t uid_range_entries(const UIDRange *range) {
|
||||
return range ? range->n_entries : 0;
|
||||
}
|
||||
|
||||
static inline unsigned uid_range_size(const UIDRange *range) {
|
||||
if (!range)
|
||||
return 0;
|
||||
|
||||
unsigned n = 0;
|
||||
|
||||
FOREACH_ARRAY(e, range->entries, range->n_entries)
|
||||
n += e->nr;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline bool uid_range_is_empty(const UIDRange *range) {
|
||||
|
||||
if (!range)
|
||||
return true;
|
||||
|
||||
FOREACH_ARRAY(e, range->entries, range->n_entries)
|
||||
if (e->nr > 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool uid_range_equal(const UIDRange *a, const UIDRange *b);
|
||||
|
||||
typedef enum UIDRangeUsernsMode {
|
||||
UID_RANGE_USERNS_INSIDE,
|
||||
UID_RANGE_USERNS_OUTSIDE,
|
||||
|
||||
Reference in New Issue
Block a user