Ejemplo n.º 1
0
int
main(int argc, char** argv)
{
	char*		s;
	char*		e;
	char*		f;
	unsigned char	b;
	unsigned char	a[IP6ADDR];
	int		c;
	int		r;
	int		all = 1;

	while (s = *++argv)
	{
		if (*s == '-' && !*(s + 1))
		{
			all = !all;
			continue;
		}
		r = strtoip6(s, &e, a, &b);
		f = fmtip6(a, b);
		c = *e;
		*e = 0;
		if (r || all || strcmp(s, f))
		{
			*e = c;
			printf("%d %32s %32s %s\n", r, s, e, f);
		}
	}
	return 0;
}
Ejemplo n.º 2
0
int
ivstr(Iv_t* iv, const char* s, char** e, unsigned char* addr, unsigned char* bits)
{
	int	c;
	int	i;
	int	n;
	int	r;

	if (iv->size == 16)
		return strtoip6(s, e, addr, bits);
	r = -1;
	i = 0;
	do
	{
		n = 0;
		while ((c = *s++) >= '0' && c <= '9')
			n = n * 10 + (c - '0');
		if (n > 0xff)
			goto done;
		addr[i++] = n;
	} while (c == '.' && i < iv->size);
	if (bits)
	{
		if (c == '/')
		{
			n = 0;
			while ((c = *s++) >= '0' && c <= '9')
				n = n * 10 + (c - '0');
			c = (n + 7) / 8;
			if (i > c)
				i = c;
		}
		else
			n = i * 8;
		*bits = n;
	}
	while (i < iv->size)
		addr[i++] = 0;
	r = 0;
 done:
	if (e)
		*e = (char*)(s - 1);
	return r;
}
Ejemplo n.º 3
0
static int
tableident(Dssfile_t* file, void* buf, size_t n, Dssdisc_t* disc)
{
	register char*	s;
	register char*	e;
	register char*	f;
	register int	c;
	unsigned char	prefix[IP6PREFIX];
	Bgpnum_t	addr;
	unsigned char	bits;

	s = (char*)buf;
	e = s + n;
	for (;;)
	{
		for (;;)
		{
			if (s >= e)
				return 0;
			c = *s++;
			if (!isascii(c))
				return 0;
			if (!isspace(c))
				break;
		}
		f = s - 1;
		for (;;)
		{
			if (s >= e)
				return 0;
			c = *s++;
			if (!isascii(c))
				return 0;
			if (c == '\n')
				break;
		}
		if (isdigit(*f) && !strtoip4(f, NiL, &addr, &bits) || !strtoip6(f, NiL, prefix, prefix + IP6BITS) && (file->caller = file))
			break;
	}
	return 1;
}
Ejemplo n.º 4
0
int
main(int argc, char** argv)
{
	char*		file;
	char*		s;
	Ptv_t*		ptv;
	Ptvprefix_t*	pp;
	Sfio_t*		sp;
	unsigned char	prefix[IP6PREFIX];
	unsigned char	addr[IP6ADDR];
	Ptvdisc_t	ptvdisc;

	int		dump = 0;

	error_info.id = "testptv";
	ptvinit(&ptvdisc);
	ptvdisc.errorf = errorf;
	for (;;)
	{
		switch (optget(argv, usage))
		{
		case 'd':
			dump = 1;
			continue;
		case '?':
			error(ERROR_USAGE|4, "%s", opt_info.arg);
			continue;
		case ':':
			error(2, "%s", opt_info.arg);
			continue;
		}
		break;
	}
	argv += opt_info.index;
	if (!(file = *argv++))
		error(ERROR_USAGE|4, "%s", optusage(0));
	if (!(sp = sfopen(0, file, "r")))
		error(ERROR_SYSTEM|3, "%s: cannot read prefix file", file);
	if (!(ptv = ptvopen(&ptvdisc, 16)))
		error(3, "cannot open ptv table");
	while (s = sfgetr(sp, '\n', 1))
		if (strtoip6(s, 0, prefix, prefix + IP6BITS))
			error(1, "%s: invalid prefix", s);
		else
		{
			if (dump)
				sfprintf(sfstderr, "insert  %s  %s\n", fmtip6(ptvmin(ptv->size, ptv->r[0], prefix, prefix[IP6BITS]), prefix[IP6BITS]), fmtip6(ptvmax(ptv->size, ptv->r[1], prefix, prefix[IP6BITS]), prefix[IP6BITS]));
			if (!ptvinsert(ptv, ptvmin(ptv->size, ptv->r[0], prefix, prefix[IP6BITS]), ptvmax(ptv->size, ptv->r[1], prefix, prefix[IP6BITS])))
			{
				error(2, "%s: ptv insertion error", s);
				break;
			}
		}
	sfclose(sp);
	if (dump)
		ptvdump(ptv, sfstdout);
	file = *argv++;
	do
	{
		if (!file || streq(file, "-"))
			sp = sfstdin;
		else if (!(sp = sfopen(0, file, "r")))
			error(ERROR_SYSTEM|3, "%s: cannot read address file", file);
		while (s = sfgetr(sp, '\n', 1))
			if (strtoip6(s, 0, addr, 0))
				error(1, "%s: invalid address", s);
			else if (pp = ptvmatch(ptv, addr))
				sfprintf(sfstdout, "%-38s %-38s %-38s\n", fmtip6(addr, -1), fmtip6(pp->min, -1), fmtip6(pp->max, -1));
			else
				sfprintf(sfstdout, "%-38s -\n", fmtip6(addr, -1));
		if (sp != sfstdin)
			sfclose(sp);
	} while (file && (file = *argv++));
	ptvclose(ptv);
	return 0;
}
Ejemplo n.º 5
0
static int
tableread(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
{
	register Tablestate_t*	state = (Tablestate_t*)file->data;
	register Bgproute_t*	rp;
	register char*		s;
	char*			p;
	char*			e;
	Bgproute_t*		op;

	for (;;)
	{
		op = &state->route[state->index];
		rp = &state->route[state->index = !state->index];
		if (!(s = sfgetr(file->io, '\n', 1)))
			return 0;
		while (*s == ' ' || *s == '\t' || *s == '\r')
			s++;
		if (*s == 0 || *s == '#' || *s == '\n')
			continue;
		rp->set = 0;
		rp->type = BGP_TYPE_withdraw;
		rp->attr = BGP_valid;
		rp->origin = BGP_ORIGIN_incomplete;
		if (state->v6)
		{
			rp->addr.v4 = 0;
			rp->bits = 0;
			if (strtoip6(s, &p, rp->prefixv6, rp->prefixv6 + IP6BITS))
				break;
			rp->set |= BGP_SET_prefixv6;
			for (s = p; *s == ' ' || *s == '\t'; s++);
			rp->hop.v4 = strtoul(s, &p, 0);
			switch (*p)
			{
			case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
			case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
			case ':':
				rp->hop.v4 = 0;
				if (!strtoip6(s, &e, rp->hop.v6, NiL) && e > p)
				{
					rp->type = BGP_TYPE_announce;
					rp->attr |= BGP_slot;
					rp->set |= BGP_SET_hopv6;
				}
				break;
			case '.':
				if (strtoip4(s, &e, &rp->hop.v4, NiL) || e <= p)
					break;
				/*FALLTHROUGH*/
			default:
				if (rp->hop.v4)
				{
					rp->type = BGP_TYPE_announce;
					rp->attr |= BGP_slot;
				}
				break;
			}
			if ((rp->set & BGP_SET_prefixv6) && memcmp(rp->prefixv6, op->prefixv6, sizeof(rp->prefixv6)))
				rp->attr |= BGP_best;
			else if ((rp->set & BGP_SET_hopv6) && !memcmp(rp->hop.v6, op->hop.v6, sizeof(rp->hop.v6)))
				continue;
			else if (rp->hop.v4 && op->hop.v4 && rp->hop.v4 == op->hop.v4)
				continue;
		}
		else
		{
			if (strtoip4(s, &p, &rp->addr.v4, &rp->bits))
				break;
			for (s = p; *s == ' ' || *s == '\t'; s++);
			rp->hop.v4 = strtoul(s, &p, 0);
			if (p > s && (*p != '.' || !strtoip4(s, NiL, &rp->hop.v4, NiL)) && rp->hop.v4)
			{
				rp->type = BGP_TYPE_announce;
				rp->attr |= BGP_slot;
			}
			if (rp->addr.v4 != op->addr.v4 || rp->bits != op->bits)
				rp->attr |= BGP_best;
			else if (rp->hop.v4 == op->hop.v4)
				continue;
		}
		record->data = rp;
		record->size = BGP_FIXED;
		return 1;
	}
	return 0;
}