141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <errno.h> 241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <string.h> 341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <sys/types.h> 441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <netinet/in.h> 541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "utils.h" 741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic __inline__ u_int16_t dn_ntohs(u_int16_t addr) 941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org{ 1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org union { 1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org u_int8_t byte[2]; 1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org u_int16_t word; 1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } u; 1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org u.word = addr; 1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8); 1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic __inline__ int do_digit(char *str, u_int16_t *addr, u_int16_t scale, size_t *pos, size_t len, int *started) 2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org{ 2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org u_int16_t tmp = *addr / scale; 2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (*pos == len) 2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 1; 2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (((tmp) > 0) || *started || (scale == 1)) { 2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *str = tmp + '0'; 2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *started = 1; 2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org (*pos)++; 3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *addr -= (tmp * scale); 3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 0; 3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic const char *dnet_ntop1(const struct dn_naddr *dna, char *str, size_t len) 3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org{ 3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org u_int16_t addr, area; 4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org size_t pos = 0; 4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int started = 0; 4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org memcpy(&addr, dna->a_addr, sizeof(addr)); 4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org addr = dn_ntohs(addr); 4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org area = addr >> 10; 4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (dna->a_len != 2) 4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return NULL; 4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org addr &= 0x03ff; 5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (len == 0) 5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &area, 10, &pos, len, &started)) 5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &area, 1, &pos, len, &started)) 5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (pos == len) 6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *(str + pos) = '.'; 6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org pos++; 6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org started = 0; 6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &addr, 1000, &pos, len, &started)) 6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &addr, 100, &pos, len, &started)) 7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &addr, 10, &pos, len, &started)) 7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (do_digit(str + pos, &addr, 1, &pos, len, &started)) 7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (pos == len) 8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *(str + pos) = 0; 8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return str; 8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgconst char *dnet_ntop(int af, const void *addr, char *str, size_t len) 9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org{ 9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org switch(af) { 9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org case AF_DECnet: 9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org errno = 0; 9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return dnet_ntop1((struct dn_naddr *)addr, str, len); 9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org default: 9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org errno = EAFNOSUPPORT; 9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return NULL; 10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org