ref: 59402bf42b8b199218f1f0d111aaf273a3c1806a
dir: /sys.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include <String.h>
#include "dat.h"
#include "fns.h"
/* user request: these tuples are systems */
static char *sysargs[] = {
"sys", "ip", "dom", "ipgw",
};
#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;
}
void
forsysarg(int (*f)(char*,void*), void *aux)
{
int n = sizeof(sysargs) / sizeof(*sysargs);
for (int i = 0; i < n; i++)
if (f(sysargs[i], aux))
return;
}
static void
condgenipnet(char *key, char *value)
{
Ndbtuple *t;
t = csipinfo(netdir, key, value, &Sipnet, 1);
if (!t)
return;
if (!t->val) {
ndbfree(t);
return;
}
genipnet(Sipnet, t->val);
ndbfree(t);
}
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;
}
fillblockvalue(sys, systuples[i], key, value);
}
condgenipnet(key, value);
return 1;
}