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