ref: f31bebf7e813616b83b255d665bf1283abef5250
dir: /sys.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include "dat.h"
#include "fns.h"
static char *sysargs[] = {
"sys", "ip", "dom",
};
#define MAXSYS 100
static Sys systems[MAXSYS];
static int nsystems = 0;
int
numsystems()
{
return nsystems;
}
static Sys*
gensystem(void)
{
Sys *s;
s = &systems[nsystems];
nsystems++;
memset(s, 0, sizeof(Sys));
return s;
}
Sys*
findsys(char *key, char *value)
{
Sys *s;
Tuple *t;
for (int i = 0; i < nsystems; i++) {
s = &systems[i];
t = findtuple(s, key);
if (t && strcmp(t->value, value) == 0)
return s;
}
return nil;
}
void
forsys(void (*f)(Sys*,void*), void *aux)
{
for (int i = 0; i < nsystems; i++)
f(&systems[i], aux);
}
int
issysarg(char *key)
{
int n = sizeof(sysargs) / sizeof(*sysargs);
for (int i = 0; i < n; i++) {
if (strcmp(sysargs[i], key) == 0)
return 1;
}
return 0;
}
static void
fillsysvalue(Sys *s, char *key, char *ids, char *idv)
{
char *val;
Ndbtuple *t;
val = csgetvalue(netdir, ids, idv, key, nil);
if (val) {
addtuple(s, key, val, 0);
return;
}
t = csipinfo(netdir, ids, idv, &key, 1);
if (t) {
if (t->val) val = strdup(t->val);
ndbfree(t);
}
if (!val)
return;
addtuple(s, key, val, 1);
if (gensys("sys", val))
return;
if (gensys("ip", val))
return;
}
int
gensys(char *key, char *value)
{
char *valid;
Sys *sys;
valid = csgetvalue(netdir, key, value, key, nil);
if (!valid)
return 0;
sys = findsys(key, value);
if (sys)
return 1;
sys = gensystem();
for (int i = 0; i < nsystuples; i++) {
if (strcmp(systuples[i], key) == 0) {
addtuple(sys, systuples[i], strdup(value), 0);
continue;
}
fillsysvalue(sys, systuples[i], key, value);
}
return 1;
}