xref: /onnv-gate/usr/src/cmd/ipf/lib/common/gethost.c (revision 2609:e6912463b001)
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