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