fence-virt/server/static_map.c
Lon Hohberger 726e40673e Static map support and permissions reporting
Signed-off-by: Lon Hohberger <lon@users.sourceforge.net>
2010-01-13 09:26:32 -05:00

142 lines
2.5 KiB
C

#include <stdio.h>
#include <simpleconfig.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <list.h>
#include <debug.h>
struct perm_entry {
list_head();
char name[128];
};
struct perm_group {
list_head();
struct perm_entry *entries;
char name[128];
};
void
static_map_cleanup(void *info)
{
struct perm_group *groups = (struct perm_group *)info;
struct perm_group *group;
struct perm_entry *entry;
while (groups) {
group = groups;
list_remove(&groups, group);
while (group->entries) {
entry = group->entries;
list_remove(&group->entries, entry);
free(entry);
}
free(group);
}
}
int
static_map_check(void *info, const char *value1, const char *value2)
{
struct perm_group *groups = (struct perm_group *)info;
struct perm_group *group;
struct perm_entry *left, *tmp;
int x, y;
if (!info)
return 1; /* no maps == wide open */
list_for(&groups, group, x) {
left = NULL;
list_for(&group->entries, tmp, y) {
if (!strcasecmp(tmp->name, value1)) {
left = tmp;
break;
}
}
if (!left)
continue;
list_for(&group->entries, tmp, y) {
if (!strcasecmp(tmp->name, value2)) {
return 1;
}
}
}
return 0;
}
int
static_map_init(config_object_t *config, void **perm_info)
{
int group_idx = 0;
int entry_idx = 0;
int found;
char value[128];
char buf[256];
char buf2[512];
struct perm_group *group = NULL, *groups = NULL;
struct perm_entry *entry = NULL;
if (!perm_info)
return -1;
do {
snprintf(buf, sizeof(buf)-1, "groups/group[%d]", ++group_idx);
if (sc_get(config, buf, value, sizeof(value)) != 0) {
snprintf(buf2, sizeof(buf2)-1, "%s/@member", buf);
if (sc_get(config, buf2, value, sizeof(value)) != 0) {
break;
} else {
snprintf(value, sizeof(value), "unnamed-%d", group_idx);
}
}
group = malloc(sizeof(*group));
assert(group);
memset(group, 0, sizeof(*group));
strncpy(group->name, value, sizeof(group->name));
dbg_printf(3, "Group: %s\n", value);
entry_idx = 0;
found = 0;
do {
snprintf(buf2, sizeof(buf2)-1, "%s/@member[%d]", buf, ++entry_idx);
if (sc_get(config, buf2, value, sizeof(value)) != 0) {
break;
}
++found;
entry = malloc(sizeof(*entry));
assert(entry);
memset(entry, 0, sizeof(*entry));
strncpy(entry->name, value, sizeof(entry->name));
dbg_printf(3, " - Entry: %s\n", value);
list_insert(&group->entries, entry);
} while (1);
if (!found)
free(group);
else
list_insert(&groups, group);
} while (1);
*perm_info = groups;
return 0;
}