shithub: netgraph

ref: 59402bf42b8b199218f1f0d111aaf273a3c1806a
dir: /sys.c/

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