save works
This commit is contained in:
parent
b1faeb94b6
commit
b748e30d20
35 changed files with 1247 additions and 2149 deletions
318
src/lib/group.c
318
src/lib/group.c
|
|
@ -1,4 +1,5 @@
|
|||
#include <errno.h>
|
||||
#include <rtti.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
|
@ -7,6 +8,11 @@
|
|||
#include "objmgr.h"
|
||||
#include "utils.h"
|
||||
#include "xce/types.h"
|
||||
#include "xstring.h"
|
||||
|
||||
typedef struct {
|
||||
|
||||
} group_private_t;
|
||||
|
||||
static void group_killer(xce_group_t* g)
|
||||
{
|
||||
|
|
@ -20,7 +26,7 @@ static void group_killer(xce_group_t* g)
|
|||
xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->members), i);
|
||||
|
||||
if (!m->is_group) {
|
||||
FREEUP(m->u.name);
|
||||
dereference(m->u.name);
|
||||
}
|
||||
FREEUP(m);
|
||||
}
|
||||
|
|
@ -29,7 +35,7 @@ static void group_killer(xce_group_t* g)
|
|||
xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->ex_members), i);
|
||||
|
||||
if (!m->is_group) {
|
||||
FREEUP(m->u.name);
|
||||
dereference(m->u.name);
|
||||
}
|
||||
FREEUP(m);
|
||||
}
|
||||
|
|
@ -45,76 +51,10 @@ static void group_killer(xce_group_t* g)
|
|||
xlist_fini(&(g->ex_members));
|
||||
xlist_fini(&(g->affecteds));
|
||||
|
||||
FREEUP(g->name);
|
||||
FREEUP(g);
|
||||
dereference(g->name);
|
||||
}
|
||||
|
||||
int groupmgr_init(groupmgr_t* mgr, int nslots, int delta)
|
||||
{
|
||||
int rc = 0;
|
||||
xce_group_config_t all = { .name = "all" };
|
||||
xce_group_config_t empty = { .name = "empty" };
|
||||
xce_group_t* g = NULL;
|
||||
|
||||
memset(mgr, 0x0, sizeof(*mgr));
|
||||
|
||||
rc = kvmgr_init(&(mgr->groups), string_hash_key, nslots, delta,
|
||||
(zarray_item_killer_t)group_killer);
|
||||
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* create builtin all group */
|
||||
g = build_group(mgr, &all, NULL);
|
||||
if (g == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* create builtin empty group */
|
||||
g = build_group(mgr, &empty, NULL);
|
||||
if (g == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void groupmgr_fini(groupmgr_t* mgr) { kvmgr_fini(&(mgr->groups)); }
|
||||
|
||||
int groupmgr_add(groupmgr_t* mgr, xce_group_t* g)
|
||||
{
|
||||
return kvmgr_add(&(mgr->groups), (void*)g->name, g);
|
||||
}
|
||||
|
||||
xce_group_t* groupmgr_lock(groupmgr_t* mgr, char* name, int op)
|
||||
{
|
||||
return (xce_group_t*)kvmgr_lock(&(mgr->groups), (void*)name, op);
|
||||
}
|
||||
|
||||
void groupmgr_del(groupmgr_t* mgr, xce_group_t* g)
|
||||
{
|
||||
kvmgr_del(&(mgr->groups), (void*)g->name);
|
||||
}
|
||||
|
||||
int groupmgr_iter(groupmgr_t* mgr, xlist_t* l, void* arg)
|
||||
{
|
||||
return kvmgr_iter(&(mgr->groups), NULL, l, arg);
|
||||
}
|
||||
|
||||
xce_group_t* get_group(groupmgr_t* mgr, char* name)
|
||||
{
|
||||
xce_group_t* g = NULL;
|
||||
|
||||
if ((mgr == NULL) || (name == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g = groupmgr_lock(mgr, name, OBJREF_NOP);
|
||||
return g;
|
||||
}
|
||||
|
||||
xce_g_member_t* make_g_member(groupmgr_t* mgr, char* name)
|
||||
xce_g_member_t* make_g_member(var mgr, char* name)
|
||||
{
|
||||
xce_g_member_t* m = NULL;
|
||||
xce_group_t* g = NULL;
|
||||
|
|
@ -135,7 +75,7 @@ xce_g_member_t* make_g_member(groupmgr_t* mgr, char* name)
|
|||
m->u.g = g;
|
||||
} else {
|
||||
m->is_group = 0;
|
||||
m->u.name = strdup(name);
|
||||
m->u.name = makeString(name);
|
||||
}
|
||||
|
||||
return m;
|
||||
|
|
@ -162,6 +102,238 @@ static int update_group_dirty(xce_group_t* g)
|
|||
return count;
|
||||
}
|
||||
|
||||
static int init_group_by_config(xce_group_t* g, var mgr,
|
||||
xce_group_config_t* g_config)
|
||||
{
|
||||
int i;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t group_datasize(va_list ap)
|
||||
{
|
||||
size_t sz = sizeof(xce_group_t);
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
static int group_init(meta_obj_t* obj, va_list ap)
|
||||
{
|
||||
xce_group_t* g = RTTI_OBJ_TO_DATA(xce_group_t, obj);
|
||||
var mgr = va_arg(ap, var);
|
||||
xce_group_config_t* config = va_arg(ap, xce_group_config_t*);
|
||||
char* g_name = va_arg(ap, char*);
|
||||
int rc;
|
||||
|
||||
if ((mgr == NULL) || (config == NULL)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = key_add(mgr, (void*)g_name, (void*)g);
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
xlist_init(&(g->affecteds), 4);
|
||||
xlist_init(&(g->members), 4);
|
||||
xlist_init(&(g->ex_members), 4);
|
||||
|
||||
g->name = makeString(g_name);
|
||||
g->dirty = 0;
|
||||
|
||||
init_group_by_config(g, mgr, config);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void group_destroy(meta_obj_t* obj)
|
||||
{
|
||||
xce_group_t* g = RTTI_OBJ_TO_DATA(xce_group_t, obj);
|
||||
|
||||
group_killer(g);
|
||||
}
|
||||
|
||||
static typeinfo_t group_type = { .name = "group",
|
||||
.privateSize = sizeof(group_private_t),
|
||||
.dataSize = (datasize_fn_t)group_datasize,
|
||||
.init = (obj_init_fn_t)group_init,
|
||||
.destroy = (obj_destroy_fn_t)group_destroy,
|
||||
.interfaces = {} };
|
||||
|
||||
xce_group_t* makeGroup(var mgr, xce_group_config_t* config,
|
||||
char* default_g_name)
|
||||
{
|
||||
xce_group_t* g = NULL;
|
||||
char* g_name = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if ((mgr == NULL) || (config == NULL)) {
|
||||
errno = EINVAL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g_name = config->name;
|
||||
if ((g_name == NULL) || (strlen(g_name) == 0)) {
|
||||
g_name = default_g_name;
|
||||
}
|
||||
|
||||
if (g_name == NULL) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rc = key_find(mgr, (void*)g_name, (void**)&g);
|
||||
if ((rc < 0) && (rc != -ENOENT)) {
|
||||
errno = -rc;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (g != NULL) {
|
||||
int i;
|
||||
|
||||
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;
|
||||
|
||||
init_group_by_config(g, mgr, config);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
g = makeInstance(&group_type, mgr, config, g_name);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
int groupmgr_init(var* mgr, int nslots, int delta)
|
||||
{
|
||||
xce_group_config_t all = { .name = "all" };
|
||||
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 };
|
||||
|
||||
*mgr = makeInstance(&xkvmgr_type, ¶ms);
|
||||
if ((*mgr) == NULL) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* create builtin all group */
|
||||
g = makeGroup(*mgr, &all, NULL);
|
||||
if (g == NULL) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* create builtin empty group */
|
||||
g = makeGroup(*mgr, &empty, NULL);
|
||||
if (g == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int groupmgr_add(var mgr, xce_group_t* g)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
rc = key_add(mgr, (void*)g->name, (void*)g);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
xce_group_t* groupmgr_lock(var mgr, char* name, int op)
|
||||
{
|
||||
int rc;
|
||||
xce_group_t* g = NULL;
|
||||
|
||||
rc = key_find(mgr, (void*)name, (void**)&g);
|
||||
if (rc <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
void groupmgr_del(var mgr, xce_group_t* g)
|
||||
{
|
||||
key_del(mgr, (void*)g->name);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
xce_group_t* get_group(var mgr, char* name)
|
||||
{
|
||||
xce_group_t* g = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if ((mgr == NULL) || (name == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rc = key_find(mgr, (void*)name, (void**)&g);
|
||||
if (rc <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
int fmt_group(char* buf, int len, xce_group_t* g)
|
||||
{
|
||||
int i, pos;
|
||||
|
|
@ -210,7 +382,7 @@ int fmt_group(char* buf, int len, xce_group_t* g)
|
|||
return strlen(buf);
|
||||
}
|
||||
|
||||
xce_group_t* build_group(groupmgr_t* mgr, xce_group_config_t* g_config,
|
||||
xce_group_t* build_group(var mgr, xce_group_config_t* g_config,
|
||||
char* default_group_name)
|
||||
{
|
||||
xce_group_t* g = NULL;
|
||||
|
|
@ -268,7 +440,7 @@ xce_group_t* build_group(groupmgr_t* mgr, xce_group_config_t* g_config,
|
|||
xlist_init(&(g->affecteds), 4);
|
||||
xlist_init(&(g->members), 4);
|
||||
xlist_init(&(g->ex_members), 4);
|
||||
g->name = strdup(g_name);
|
||||
g->name = makeString(g_name);
|
||||
g->dirty = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue