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