set->privs[set->size] = NULL;
}
-static void
+void
privilegeset_add_privs(struct PrivilegeSet *dst, const char *privs)
{
- size_t alloc_size;
- size_t n;
+ size_t alloc_size, old_stored_size;
if (dst->priv_storage == NULL)
{
alloc_size = dst->allocated_size;
}
+ old_stored_size = dst->stored_size;
dst->stored_size += strlen(privs) + 1;
while (alloc_size < dst->stored_size)
const char *s;
char *d;
- for (s = privs, d = dst->priv_storage; s < privs + strlen(privs); s += n , d += n)
- {
- const char *e = strchr(s, ' ');
- /* up to space if there is one, else up to end of string */
- n = 1 + (e != NULL ? e - s : strlen(s));
- rb_strlcpy(d, s, n);
- dst->size += 1;
+ for (s = privs, d = dst->priv_storage + old_stored_size;
+ s <= privs + strlen(privs);
+ s++, d++)
+ {
+ *d = *s;
+ if (*d == ' ' || *d == '\0')
+ {
+ *d = '\0';
+ if (s > privs) dst->size += 1;
+ }
}
privilegeset_index(dst);
#define MSG "%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__
+void privilegeset_add_privs(struct PrivilegeSet *dst, const char *privs);
+
struct Client me;
static void cleanup(void)
cleanup();
}
+static void test_privset_add(void)
+{
+ struct PrivilegeSet *set = privilegeset_set_new("test", "foo bar", 0);
+ privilegeset_add_privs(set, "baz qux");
+
+ is_bool(true, privilegeset_in_set(set, "foo"), MSG);
+ is_bool(true, privilegeset_in_set(set, "bar"), MSG);
+ is_bool(true, privilegeset_in_set(set, "baz"), MSG);
+ is_bool(true, privilegeset_in_set(set, "qux"), MSG);
+
+ is_bool(false, privilegeset_in_set(set, "frob"), MSG);
+
+ cleanup();
+}
+
static void test_privset_extend(void)
{
struct PrivilegeSet *parent = privilegeset_set_new("parent", "foo bar", 0);
plan_lazy();
test_privset_membership();
+ test_privset_add();
test_privset_extend();
test_privset_persistence();
test_privset_diff();