1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <errno.h>
21a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt#include <string.h>
3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/types.h>
4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h>
5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h"
7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic __inline__ u_int16_t dn_htons(u_int16_t addr)
9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        union {
11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat                u_int8_t byte[2];
12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat                u_int16_t word;
13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        } u;
14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        u.word = addr;
16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8);
17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int dnet_num(const char *src, u_int16_t * dst)
21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int rv = 0;
23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int tmp;
24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*dst = 0;
25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	while ((tmp = *src++) != 0) {
27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		tmp -= '0';
28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if ((tmp < 0) || (tmp > 9))
29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			return rv;
30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		rv++;
32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		(*dst) *= 10;
33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		(*dst) += tmp;
34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return rv;
37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int dnet_pton1(const char *src, struct dn_naddr *dna)
40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
411a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt	u_int16_t addr;
42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	u_int16_t area = 0;
43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	u_int16_t node = 0;
44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int pos;
45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	pos = dnet_num(src, &area);
47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if ((pos == 0) || (area > 63) || (*(src + pos) != '.'))
48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		return 0;
49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	pos = dnet_num(src + pos + 1, &node);
50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if ((pos == 0) || (node > 1023))
51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		return 0;
52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	dna->a_len = 2;
531a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt	addr = dn_htons((area << 10) | node);
541a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt	memcpy(dna->a_addr, &addr, sizeof(addr));
55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return 1;
57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint dnet_pton(int af, const char *src, void *addr)
60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int err;
62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	switch (af) {
64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	case AF_DECnet:
65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		errno = 0;
66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		err = dnet_pton1(src, (struct dn_naddr *)addr);
67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		break;
68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	default:
69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		errno = EAFNOSUPPORT;
70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		err = -1;
71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return err;
74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
75