12393Syz155240 /*
22393Syz155240 * Copyright (C) 1993-2005 by Darren Reed.
3*2609Sjojemann *
42393Syz155240 * See the IPFILTER.LICENCE file for details on licencing.
5*2609Sjojemann *
6*2609Sjojemann * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
7*2609Sjojemann * Use is subject to license terms.
8*2609Sjojemann */
9*2609Sjojemann
10*2609Sjojemann #pragma ident "%Z%%M% %I% %E% SMI"
112393Syz155240
120Sstevel@tonic-gate #include "ipf.h"
130Sstevel@tonic-gate
gethost(name,hostp,use_inet6)14*2609Sjojemann int gethost(name, hostp, use_inet6)
150Sstevel@tonic-gate char *name;
16*2609Sjojemann i6addr_t *hostp;
17*2609Sjojemann int use_inet6;
180Sstevel@tonic-gate {
19*2609Sjojemann struct addrinfo hints, *ai;
202393Syz155240 struct netent *n;
21*2609Sjojemann int error;
220Sstevel@tonic-gate
232393Syz155240 if (!strcmp(name, "test.host.dots")) {
24*2609Sjojemann hostp->in4.s_addr = htonl(0xfedcba98);
252393Syz155240 return 0;
262393Syz155240 }
272393Syz155240
280Sstevel@tonic-gate if (!strcmp(name, "<thishost>"))
290Sstevel@tonic-gate name = thishost;
300Sstevel@tonic-gate
31*2609Sjojemann bzero(&hints, sizeof (hints));
32*2609Sjojemann if (use_inet6 == 0)
33*2609Sjojemann hints.ai_family = AF_INET;
34*2609Sjojemann else
35*2609Sjojemann hints.ai_family = AF_INET6;
36*2609Sjojemann
37*2609Sjojemann error = getaddrinfo(name, NULL, &hints, &ai);
38*2609Sjojemann
39*2609Sjojemann if ((error == 0) && (ai != NULL) && (ai->ai_addr != NULL)) {
40*2609Sjojemann switch (ai->ai_family)
41*2609Sjojemann {
42*2609Sjojemann case AF_INET:
43*2609Sjojemann hostp->in4 = ((struct sockaddr_in *)
44*2609Sjojemann ai->ai_addr)->sin_addr;
45*2609Sjojemann break;
46*2609Sjojemann case AF_INET6:
47*2609Sjojemann hostp->in6 = ((struct sockaddr_in6 *)
48*2609Sjojemann ai->ai_addr)->sin6_addr;
49*2609Sjojemann break;
50*2609Sjojemann default:
51*2609Sjojemann break;
52*2609Sjojemann }
53*2609Sjojemann freeaddrinfo(ai);
54*2609Sjojemann return 0;
55*2609Sjojemann }
56*2609Sjojemann
57*2609Sjojemann if (ai != NULL)
58*2609Sjojemann freeaddrinfo(ai);
59*2609Sjojemann
60*2609Sjojemann if (use_inet6 == 0) {
61*2609Sjojemann n = getnetbyname(name);
62*2609Sjojemann if (n != NULL) {
63*2609Sjojemann hostp->in4.s_addr = htonl(n->n_net);
640Sstevel@tonic-gate return 0;
650Sstevel@tonic-gate }
660Sstevel@tonic-gate }
670Sstevel@tonic-gate return -1;
680Sstevel@tonic-gate }
69