1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <errno.h>
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h>
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/types.h>
4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h>
5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h"
7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic u_int32_t hexget(char c)
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (c >= 'A' && c <= 'F')
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return c - 'A' + 10;
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (c >= 'a' && c <= 'f')
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return c - 'a' + 10;
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (c >= '0' && c <= '9')
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return c - '0';
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0xf0;
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int ipx_getnet(u_int32_t *net, const char *str)
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int32_t tmp;
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for(i = 0; *str && (i < 8); i++) {
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((tmp = hexget(*str)) & 0xf0) {
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (*str == '.')
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return 0;
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			else
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		str++;
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		(*net) <<= 4;
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		(*net) |= tmp;
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (*str == 0)
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return -1;
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int ipx_getnode(u_int8_t *node, const char *str)
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int32_t tmp;
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for(i = 0; i < 6; i++) {
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((tmp = hexget(*str++)) & 0xf0)
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		node[i] = (u_int8_t)tmp;
54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		node[i] <<= 4;
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((tmp = hexget(*str++)) & 0xf0)
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		node[i] |= (u_int8_t)tmp;
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (*str == ':')
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			str++;
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int ipx_pton1(const char *src, struct ipx_addr *addr)
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char *sep = (char *)src;
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int no_node = 0;
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(addr, 0, sizeof(struct ipx_addr));
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while(*sep && (*sep != '.'))
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		sep++;
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (*sep != '.')
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		no_node = 1;
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ipx_getnet(&addr->ipx_net, src))
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addr->ipx_net = htonl(addr->ipx_net);
82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (no_node)
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 1;
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ipx_getnode(addr->ipx_node, sep + 1))
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 1;
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint ipx_pton(int af, const char *src, void *addr)
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int err;
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	switch (af) {
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case AF_IPX:
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		errno = 0;
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		err = ipx_pton1(src, (struct ipx_addr *)addr);
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		break;
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	default:
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		errno = EAFNOSUPPORT;
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		err = -1;
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return err;
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
108