1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <errno.h> 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/types.h> 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic __inline__ int do_digit(char *str, u_int32_t addr, u_int32_t scale, size_t *pos, size_t len) 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat u_int32_t tmp = addr >> (scale * 4); 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (*pos == len) 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 1; 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tmp &= 0x0f; 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tmp > 9) 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *str = tmp + 'A' - 10; 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *str = tmp + '0'; 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat (*pos)++; 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic const char *ipx_ntop1(const struct ipx_addr *addr, char *str, size_t len) 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i; 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat size_t pos = 0; 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (len == 0) 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for(i = 7; i >= 0; i--) 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (do_digit(str + pos, ntohl(addr->ipx_net), i, &pos, len)) 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pos == len) 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *(str + pos) = '.'; 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pos++; 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for(i = 0; i < 6; i++) { 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (do_digit(str + pos, addr->ipx_node[i], 1, &pos, len)) 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (do_digit(str + pos, addr->ipx_node[i], 0, &pos, len)) 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pos == len) 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *(str + pos) = 0; 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatconst char *ipx_ntop(int af, const void *addr, char *str, size_t len) 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat switch(af) { 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat case AF_IPX: 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat errno = 0; 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return ipx_ntop1((struct ipx_addr *)addr, str, len); 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat default: 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat errno = EAFNOSUPPORT; 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return NULL; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 72