xref: /illumos-gate/usr/src/cmd/ipf/lib/common/gethost.c (revision 9b4c7145)
1ab25eeb5Syz /*
2ab25eeb5Syz  * Copyright (C) 1993-2005  by Darren Reed.
3*9b4c7145Sjojemann  *
4ab25eeb5Syz  * See the IPFILTER.LICENCE file for details on licencing.
5*9b4c7145Sjojemann  *
6*9b4c7145Sjojemann  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
7*9b4c7145Sjojemann  * Use is subject to license terms.
8*9b4c7145Sjojemann  */
9*9b4c7145Sjojemann 
10*9b4c7145Sjojemann #pragma ident	"%Z%%M%	%I%	%E% SMI"
11ab25eeb5Syz 
127c478bd9Sstevel@tonic-gate #include "ipf.h"
137c478bd9Sstevel@tonic-gate 
gethost(name,hostp,use_inet6)14*9b4c7145Sjojemann int gethost(name, hostp, use_inet6)
157c478bd9Sstevel@tonic-gate char *name;
16*9b4c7145Sjojemann i6addr_t *hostp;
17*9b4c7145Sjojemann int use_inet6;
187c478bd9Sstevel@tonic-gate {
19*9b4c7145Sjojemann 	struct addrinfo hints, *ai;
20ab25eeb5Syz 	struct netent *n;
21*9b4c7145Sjojemann 	int error;
227c478bd9Sstevel@tonic-gate 
23ab25eeb5Syz 	if (!strcmp(name, "test.host.dots")) {
24*9b4c7145Sjojemann 		hostp->in4.s_addr = htonl(0xfedcba98);
25ab25eeb5Syz 		return 0;
26ab25eeb5Syz 	}
27ab25eeb5Syz 
287c478bd9Sstevel@tonic-gate 	if (!strcmp(name, "<thishost>"))
297c478bd9Sstevel@tonic-gate 		name = thishost;
307c478bd9Sstevel@tonic-gate 
31*9b4c7145Sjojemann 	bzero(&hints, sizeof (hints));
32*9b4c7145Sjojemann 	if (use_inet6 == 0)
33*9b4c7145Sjojemann 		hints.ai_family = AF_INET;
34*9b4c7145Sjojemann 	else
35*9b4c7145Sjojemann 		hints.ai_family = AF_INET6;
36*9b4c7145Sjojemann 
37*9b4c7145Sjojemann 	error = getaddrinfo(name, NULL, &hints, &ai);
38*9b4c7145Sjojemann 
39*9b4c7145Sjojemann 	if ((error == 0) && (ai != NULL) && (ai->ai_addr != NULL)) {
40*9b4c7145Sjojemann 		switch (ai->ai_family)
41*9b4c7145Sjojemann 		{
42*9b4c7145Sjojemann 			case AF_INET:
43*9b4c7145Sjojemann 				hostp->in4 = ((struct sockaddr_in *)
44*9b4c7145Sjojemann 				    ai->ai_addr)->sin_addr;
45*9b4c7145Sjojemann 				break;
46*9b4c7145Sjojemann 			case AF_INET6:
47*9b4c7145Sjojemann 				hostp->in6 = ((struct sockaddr_in6 *)
48*9b4c7145Sjojemann 				    ai->ai_addr)->sin6_addr;
49*9b4c7145Sjojemann 				break;
50*9b4c7145Sjojemann 			default:
51*9b4c7145Sjojemann 				break;
527c478bd9Sstevel@tonic-gate 		}
53*9b4c7145Sjojemann 		freeaddrinfo(ai);
54*9b4c7145Sjojemann 		return 0;
557c478bd9Sstevel@tonic-gate 	}
56ab25eeb5Syz 
57*9b4c7145Sjojemann 	if (ai != NULL)
58*9b4c7145Sjojemann 		freeaddrinfo(ai);
59*9b4c7145Sjojemann 
60*9b4c7145Sjojemann 	if (use_inet6 == 0) {
61*9b4c7145Sjojemann 		n = getnetbyname(name);
62*9b4c7145Sjojemann 		if (n != NULL) {
63*9b4c7145Sjojemann 			hostp->in4.s_addr = htonl(n->n_net);
64*9b4c7145Sjojemann 			return 0;
65*9b4c7145Sjojemann 		}
66ab25eeb5Syz 	}
677c478bd9Sstevel@tonic-gate 	return -1;
687c478bd9Sstevel@tonic-gate }
69