int privilegeset_in_set(struct PrivilegeSet *set, const char *priv);
struct PrivilegeSet *privilegeset_set_new(const char *name, const char *privs, PrivilegeFlags flags);
+struct PrivilegeSet *privilegeset_extend(struct PrivilegeSet *parent, const char *name, const char *privs, PrivilegeFlags flags);
struct PrivilegeSet *privilegeset_get(const char *name);
void privilegeset_ref(struct PrivilegeSet *set);
void privilegeset_unref(struct PrivilegeSet *set);
{
struct PrivilegeSet *set;
+ s_assert(privilegeset_get(name) == NULL);
+
set = rb_malloc(sizeof(struct PrivilegeSet));
set->refs = 1;
set->name = rb_strdup(name);
return set;
}
+struct PrivilegeSet *
+privilegeset_extend(struct PrivilegeSet *parent, const char *name, const char *privs, PrivilegeFlags flags)
+{
+ struct PrivilegeSet *set;
+
+ s_assert(parent != NULL);
+ s_assert(name != NULL);
+ s_assert(privs != NULL);
+ s_assert(privilegeset_get(name) == NULL);
+
+ set = rb_malloc(sizeof(struct PrivilegeSet));
+ set->refs = 1;
+ set->name = rb_strdup(name);
+ set->flags = flags;
+ set->privs = rb_malloc(strlen(parent->privs) + 1 + strlen(privs) + 1);
+ strcpy(parent->privs, set->privs);
+ strcat(set->privs, " ");
+ strcat(set->privs, privs);
+
+ return set;
+}
+
struct PrivilegeSet *
privilegeset_get(const char *name)
{