shithub: netgraph

ref: 59402bf42b8b199218f1f0d111aaf273a3c1806a
dir: /ipnet.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 ipnets */
static char *netargs[] = {
	"ipnet",
};

int
isnetarg(char *key)
{
	int n = sizeof(netargs) / sizeof(*netargs);
	for (int i = 0; i < n; i++)
		if (strcmp(netargs[i], key) == 0)
			return 1;
	return 0;
}

static Ipnet ipnets[50];
static int nipnets = 0;

int
numipnets()
{
	return nipnets;
}

Color
getipnetcolor(char *k, char *v)
{
	Ipnet *n;
	Color c = { 0., 0., 0. };
	n = findipnet(k, v);
	if (!n) {
		fprint(2, "ipnet %s=%s not found\n", k, v);
		return c;
	}
	
	return n->color;
}

static Ipnet*
gennet(void)
{
	Ipnet *n;
	n = &ipnets[nipnets];
	nipnets++;
	memset(n, 0, sizeof(Ipnet));
	return n;
}

Ipnet*
findipnet(char *key, char *value)
{
	Ipnet *n;
	Tuple *t;
	
	for (int i = 0; i < nipnets; i++) {
		n = &ipnets[i];
		t = findtuple(n, key);
		if (t && strcmp(t->value, value) == 0)
			return n;
	}
	return nil;
}

int
genipnet(char *key, char *value)
{
	Ipnet *n;
	char *valid;
	
	valid = csgetvalue(netdir, key, value, key, nil);
	if (!valid)
		return 0;
	n = findipnet(key, value);
	if (n)
		return 1;
	n = gennet();
	
	for (int i = 0; i < nipnettuples; i++) {
		if (strcmp(ipnettuples[i], key) == 0) {
			addtuple(n, ipnettuples[i], strdup(value), 0);
			continue;
		}
		fillblockvalue(n, ipnettuples[i], key, value);
	}
	
	return 1;
}

void
fornet(void (*f)(Ipnet*,void*), void *aux)
{
	for (int i = 0; i < nipnets; i++)
		f(&ipnets[i], aux);
}