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