save works
This commit is contained in:
parent
acfbec875b
commit
3f74f14687
38 changed files with 751 additions and 448 deletions
116
src/lib/group.c
116
src/lib/group.c
|
|
@ -156,7 +156,10 @@ static int group_init(meta_obj_t* obj, va_list ap)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
lock(mgr, RTTI_LOCK_WRITE);
|
||||
rc = key_add(mgr, (void*)g_name, (void*)g);
|
||||
unlock(mgr);
|
||||
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -210,7 +213,10 @@ xce_group_t* makeGroup(var mgr, xce_group_config_t* config,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
lock(mgr, RTTI_LOCK_READ);
|
||||
rc = key_find(mgr, (void*)g_name, (void**)&g);
|
||||
unlock(mgr);
|
||||
|
||||
if ((rc < 0) && (rc != -ENOENT)) {
|
||||
errno = -rc;
|
||||
return NULL;
|
||||
|
|
@ -262,7 +268,6 @@ int groupmgr_init(var* mgr, int nslots, int delta)
|
|||
xce_group_config_t empty = { .name = "empty" };
|
||||
xce_group_t* g = NULL;
|
||||
kvmgr_params_t params = { .key_type = KVMGR_KEY_STRING,
|
||||
.dynamic = 1,
|
||||
.nslots = nslots,
|
||||
.delta = delta,
|
||||
.datakiller = destroy };
|
||||
|
|
@ -291,7 +296,9 @@ int groupmgr_add(var mgr, xce_group_t* g)
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
lock(mgr, RTTI_LOCK_WRITE);
|
||||
rc = key_add(mgr, (void*)g->name, (void*)g);
|
||||
unlock(mgr);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -301,7 +308,10 @@ xce_group_t* groupmgr_lock(var mgr, char* name, int op)
|
|||
int rc;
|
||||
xce_group_t* g = NULL;
|
||||
|
||||
lock(mgr, RTTI_LOCK_READ);
|
||||
rc = key_find(mgr, (void*)name, (void**)&g);
|
||||
unlock(mgr);
|
||||
|
||||
if (rc <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -311,7 +321,9 @@ xce_group_t* groupmgr_lock(var mgr, char* name, int op)
|
|||
|
||||
void groupmgr_del(var mgr, xce_group_t* g)
|
||||
{
|
||||
lock(mgr, RTTI_LOCK_WRITE);
|
||||
key_del(mgr, (void*)g->name);
|
||||
unlock(mgr);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -325,7 +337,10 @@ xce_group_t* get_group(var mgr, char* name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
lock(mgr, RTTI_LOCK_READ);
|
||||
rc = key_find(mgr, (void*)name, (void**)&g);
|
||||
unlock(mgr);
|
||||
|
||||
if (rc <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -381,105 +396,6 @@ int fmt_group(char* buf, int len, xce_group_t* g)
|
|||
return strlen(buf);
|
||||
}
|
||||
|
||||
xce_group_t* build_group(var mgr, xce_group_config_t* g_config,
|
||||
char* default_group_name)
|
||||
{
|
||||
xce_group_t* g = NULL;
|
||||
char* g_name;
|
||||
int i;
|
||||
|
||||
if ((mgr == NULL) || (g_config == NULL)) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g_name = g_config->name;
|
||||
if ((g_name == NULL) || (strlen(g_name) == 0)) {
|
||||
g_name = default_group_name;
|
||||
}
|
||||
|
||||
if (g_name == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g = get_group(mgr, g_name);
|
||||
if (g != NULL) {
|
||||
for (i = 0; i < g->members.count; i++) {
|
||||
xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->members), i);
|
||||
if (m == NULL) {
|
||||
continue;
|
||||
}
|
||||
if (m->is_group == 0) {
|
||||
FREEUP(m->u.name);
|
||||
}
|
||||
|
||||
FREEUP(m);
|
||||
}
|
||||
g->members.count = 0;
|
||||
|
||||
for (i = 0; i < g->ex_members.count; i++) {
|
||||
xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->ex_members), i);
|
||||
if (m == NULL) {
|
||||
continue;
|
||||
}
|
||||
if (m->is_group == 0) {
|
||||
FREEUP(m->u.name);
|
||||
}
|
||||
|
||||
FREEUP(m);
|
||||
}
|
||||
g->ex_members.count = 0;
|
||||
g->dirty = 1;
|
||||
} else {
|
||||
g = (xce_group_t*)calloc(1, sizeof(*g));
|
||||
if (g == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xlist_init(&(g->affecteds), 4);
|
||||
xlist_init(&(g->members), 4);
|
||||
xlist_init(&(g->ex_members), 4);
|
||||
g->name = makeString(g_name);
|
||||
g->dirty = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < g_config->members.count; i++) {
|
||||
char* g_name = g_config->members.data[i];
|
||||
xce_g_member_t* m = make_g_member(mgr, g_name);
|
||||
|
||||
if (m == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
xlist_store(&(g->members), m);
|
||||
if (m->is_group) {
|
||||
xlist_store(&(m->u.g->affecteds), g);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < g_config->ex_members.count; i++) {
|
||||
char* g_name = g_config->ex_members.data[i];
|
||||
xce_g_member_t* m = make_g_member(mgr, g_name);
|
||||
|
||||
if (m == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
xlist_store(&(g->ex_members), m);
|
||||
if (m->is_group) {
|
||||
xlist_store(&(m->u.g->affecteds), g);
|
||||
}
|
||||
}
|
||||
|
||||
groupmgr_add(mgr, g);
|
||||
|
||||
if (g->dirty) {
|
||||
update_group_dirty(g);
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
static int check_in_member(xce_g_member_t* m, va_list ap)
|
||||
{
|
||||
char* name = va_arg(ap, char*);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue