1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3170268Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5255332Scy *
6255332Scy * See the IPFILTER.LICENCE file for details on licencing.
7255332Scy *
8255332Scy * $Id$
9255332Scy */
10170268Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145510Sdarrenr
13255332Scyint gethost(family, name, hostp)
14255332Scy	int family;
15255332Scy	char *name;
16255332Scy	i6addr_t *hostp;
17145510Sdarrenr{
18145510Sdarrenr	struct hostent *h;
19145510Sdarrenr	struct netent *n;
20145510Sdarrenr	u_32_t addr;
21145510Sdarrenr
22271971Scy	bzero(hostp, sizeof(*hostp));
23145510Sdarrenr	if (!strcmp(name, "test.host.dots")) {
24255332Scy		if (family == AF_INET) {
25255332Scy			hostp->in4.s_addr = htonl(0xfedcba98);
26255332Scy		}
27255332Scy#ifdef USE_INET6
28255332Scy		if (family == AF_INET6) {
29271970Scy			hostp->i6[0] = htonl(0xfe80aa55);
30271970Scy			hostp->i6[1] = htonl(0x12345678);
31271970Scy			hostp->i6[2] = htonl(0x5a5aa5a5);
32271970Scy			hostp->i6[3] = htonl(0xfedcba98);
33255332Scy		}
34255332Scy#endif
35145510Sdarrenr		return 0;
36145510Sdarrenr	}
37145510Sdarrenr
38145510Sdarrenr	if (!strcmp(name, "<thishost>"))
39145510Sdarrenr		name = thishost;
40145510Sdarrenr
41255332Scy	if (family == AF_INET) {
42255332Scy		h = gethostbyname(name);
43255332Scy		if (h != NULL) {
44255332Scy			if ((h->h_addr != NULL) &&
45255332Scy			    (h->h_length == sizeof(addr))) {
46255332Scy				bcopy(h->h_addr, (char *)&addr, sizeof(addr));
47255332Scy				hostp->in4.s_addr = addr;
48255332Scy				return 0;
49255332Scy			}
50255332Scy		}
51255332Scy
52255332Scy		n = getnetbyname(name);
53255332Scy		if (n != NULL) {
54255332Scy			hostp->in4.s_addr = htonl(n->n_net & 0xffffffff);
55145510Sdarrenr			return 0;
56145510Sdarrenr		}
57145510Sdarrenr	}
58255332Scy#ifdef USE_INET6
59255332Scy	if (family == AF_INET6) {
60255332Scy		struct addrinfo hints, *res;
61255332Scy		struct sockaddr_in6 *sin6;
62145510Sdarrenr
63255332Scy		bzero((char *)&hints, sizeof(hints));
64255332Scy		hints.ai_family = PF_INET6;
65255332Scy
66255332Scy		getaddrinfo(name, NULL, &hints, &res);
67255332Scy		if (res != NULL) {
68255332Scy			sin6 = (struct sockaddr_in6 *)res->ai_addr;
69255332Scy			hostp->in6 = sin6->sin6_addr;
70255332Scy			freeaddrinfo(res);
71255332Scy			return 0;
72255332Scy		}
73145510Sdarrenr	}
74255332Scy#endif
75145510Sdarrenr	return -1;
76145510Sdarrenr}
77