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