shithub: netgraph

ref: f31bebf7e813616b83b255d665bf1283abef5250
dir: /sys.c/

View raw version
#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;
}