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 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 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 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 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 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