1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <errno.h>
29ec0e899e13f01e44e8111179910e5d57ced2c4aMike Frysinger#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 __inline__ u_int16_t dn_htons(u_int16_t addr)
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        union {
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                u_int8_t byte[2];
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                u_int16_t word;
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        } u;
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        u.word = addr;
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8);
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int dnet_num(const char *src, u_int16_t * dst)
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int rv = 0;
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int tmp;
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	*dst = 0;
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while ((tmp = *src++) != 0) {
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		tmp -= '0';
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((tmp < 0) || (tmp > 9))
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return rv;
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		rv++;
32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		(*dst) *= 10;
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		(*dst) += tmp;
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return rv;
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int dnet_pton1(const char *src, struct dn_naddr *dna)
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
419ec0e899e13f01e44e8111179910e5d57ced2c4aMike Frysinger	u_int16_t addr;
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int16_t area = 0;
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int16_t node = 0;
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int pos;
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	pos = dnet_num(src, &area);
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if ((pos == 0) || (area > 63) || (*(src + pos) != '.'))
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	pos = dnet_num(src + pos + 1, &node);
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if ((pos == 0) || (node > 1023))
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	dna->a_len = 2;
539ec0e899e13f01e44e8111179910e5d57ced2c4aMike Frysinger	addr = dn_htons((area << 10) | node);
549ec0e899e13f01e44e8111179910e5d57ced2c4aMike Frysinger	memcpy(dna->a_addr, &addr, sizeof(addr));
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 1;
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint dnet_pton(int af, const char *src, void *addr)
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int err;
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	switch (af) {
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case AF_DECnet:
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		errno = 0;
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		err = dnet_pton1(src, (struct dn_naddr *)addr);
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		break;
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	default:
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		errno = EAFNOSUPPORT;
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		err = -1;
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return err;
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
75