1/* $FreeBSD$ */ 2 3/* 4 * Copyright (C) 2012 by Darren Reed. 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 * 8 * $Id$ 9 */ 10 11#include "ipf.h" 12 13int gethost(family, name, hostp) 14 int family; 15 char *name; 16 i6addr_t *hostp; 17{ 18 struct hostent *h; 19 struct netent *n; 20 u_32_t addr; 21 22 if (!strcmp(name, "test.host.dots")) { 23 if (family == AF_INET) { 24 hostp->in4.s_addr = htonl(0xfedcba98); 25 } 26#ifdef USE_INET6 27 if (family == AF_INET6) { 28 hostp->i6[0] = 0xfe80aa55; 29 hostp->i6[1] = 0x12345678; 30 hostp->i6[2] = 0x5a5aa5a5; 31 hostp->i6[3] = 0xfedcba98; 32 } 33#endif 34 return 0; 35 } 36 37 if (!strcmp(name, "<thishost>")) 38 name = thishost; 39 40 if (family == AF_INET) { 41 h = gethostbyname(name); 42 if (h != NULL) { 43 if ((h->h_addr != NULL) && 44 (h->h_length == sizeof(addr))) { 45 bcopy(h->h_addr, (char *)&addr, sizeof(addr)); 46 hostp->in4.s_addr = addr; 47 return 0; 48 } 49 } 50 51 n = getnetbyname(name); 52 if (n != NULL) { 53 hostp->in4.s_addr = htonl(n->n_net & 0xffffffff); 54 return 0; 55 } 56 } 57#ifdef USE_INET6 58 if (family == AF_INET6) { 59 struct addrinfo hints, *res; 60 struct sockaddr_in6 *sin6; 61 62 bzero((char *)&hints, sizeof(hints)); 63 hints.ai_family = PF_INET6; 64 65 getaddrinfo(name, NULL, &hints, &res); 66 if (res != NULL) { 67 sin6 = (struct sockaddr_in6 *)res->ai_addr; 68 hostp->in6 = sin6->sin6_addr; 69 freeaddrinfo(res); 70 return 0; 71 } 72 } 73#endif 74 return -1; 75} 76