gethost.c revision 271971
164562Sgshapiro/*	$FreeBSD: head/contrib/ipfilter/lib/gethost.c 271971 2014-09-22 16:06:37Z cy $	*/
264562Sgshapiro
364562Sgshapiro/*
464562Sgshapiro * Copyright (C) 2012 by Darren Reed.
564562Sgshapiro *
6111823Sgshapiro * See the IPFILTER.LICENCE file for details on licencing.
764562Sgshapiro *
864562Sgshapiro * $Id$
964562Sgshapiro */
1064562Sgshapiro
1164562Sgshapiro#include "ipf.h"
1264562Sgshapiro
1364562Sgshapiroint gethost(family, name, hostp)
1464562Sgshapiro	int family;
1564562Sgshapiro	char *name;
1664562Sgshapiro	i6addr_t *hostp;
17159609Sgshapiro{
1864562Sgshapiro	struct hostent *h;
1964562Sgshapiro	struct netent *n;
2064562Sgshapiro	u_32_t addr;
2164562Sgshapiro
2264562Sgshapiro	bzero(hostp, sizeof(*hostp));
2364562Sgshapiro	if (!strcmp(name, "test.host.dots")) {
2464562Sgshapiro		if (family == AF_INET) {
2564562Sgshapiro			hostp->in4.s_addr = htonl(0xfedcba98);
26159609Sgshapiro		}
27159609Sgshapiro#ifdef USE_INET6
28159609Sgshapiro		if (family == AF_INET6) {
29159609Sgshapiro			hostp->i6[0] = htonl(0xfe80aa55);
30159609Sgshapiro			hostp->i6[1] = htonl(0x12345678);
31159609Sgshapiro			hostp->i6[2] = htonl(0x5a5aa5a5);
32159609Sgshapiro			hostp->i6[3] = htonl(0xfedcba98);
33159609Sgshapiro		}
34159609Sgshapiro#endif
35159609Sgshapiro		return 0;
36159609Sgshapiro	}
37159609Sgshapiro
38159609Sgshapiro	if (!strcmp(name, "<thishost>"))
39159609Sgshapiro		name = thishost;
40159609Sgshapiro
41159609Sgshapiro	if (family == AF_INET) {
42159609Sgshapiro		h = gethostbyname(name);
43159609Sgshapiro		if (h != NULL) {
44159609Sgshapiro			if ((h->h_addr != NULL) &&
45159609Sgshapiro			    (h->h_length == sizeof(addr))) {
46159609Sgshapiro				bcopy(h->h_addr, (char *)&addr, sizeof(addr));
4780785Sgshapiro				hostp->in4.s_addr = addr;
48159609Sgshapiro				return 0;
49159609Sgshapiro			}
50159609Sgshapiro		}
51159609Sgshapiro
52159609Sgshapiro		n = getnetbyname(name);
53159609Sgshapiro		if (n != NULL) {
54159609Sgshapiro			hostp->in4.s_addr = htonl(n->n_net & 0xffffffff);
55159609Sgshapiro			return 0;
56159609Sgshapiro		}
57159609Sgshapiro	}
58159609Sgshapiro#ifdef USE_INET6
59159609Sgshapiro	if (family == AF_INET6) {
60159609Sgshapiro		struct addrinfo hints, *res;
61159609Sgshapiro		struct sockaddr_in6 *sin6;
62159609Sgshapiro
63159609Sgshapiro		bzero((char *)&hints, sizeof(hints));
64159609Sgshapiro		hints.ai_family = PF_INET6;
65159609Sgshapiro
6680785Sgshapiro		getaddrinfo(name, NULL, &hints, &res);
67159609Sgshapiro		if (res != NULL) {
68159609Sgshapiro			sin6 = (struct sockaddr_in6 *)res->ai_addr;
69159609Sgshapiro			hostp->in6 = sin6->sin6_addr;
70159609Sgshapiro			freeaddrinfo(res);
71159609Sgshapiro			return 0;
72159609Sgshapiro		}
73159609Sgshapiro	}
74159609Sgshapiro#endif
75159609Sgshapiro	return -1;
76159609Sgshapiro}
77159609Sgshapiro