gethost.c revision 271971
164562Sgshapiro/* $FreeBSD: head/contrib/ipfilter/lib/gethost.c 271971 2014-09-22 16:06:37Z cy $ */ 264562Sgshapiro 364562Sgshapiro/* 464562Sgshapiro * Copyright (C) 2012 by Darren Reed. 564562Sgshapiro * 6111823Sgshapiro * See the IPFILTER.LICENCE file for details on licencing. 764562Sgshapiro * 864562Sgshapiro * $Id$ 964562Sgshapiro */ 1064562Sgshapiro 1164562Sgshapiro#include "ipf.h" 1264562Sgshapiro 1364562Sgshapiroint gethost(family, name, hostp) 1464562Sgshapiro int family; 1564562Sgshapiro char *name; 1664562Sgshapiro i6addr_t *hostp; 17159609Sgshapiro{ 1864562Sgshapiro struct hostent *h; 1964562Sgshapiro struct netent *n; 2064562Sgshapiro u_32_t addr; 2164562Sgshapiro 2264562Sgshapiro bzero(hostp, sizeof(*hostp)); 2364562Sgshapiro if (!strcmp(name, "test.host.dots")) { 2464562Sgshapiro if (family == AF_INET) { 2564562Sgshapiro hostp->in4.s_addr = htonl(0xfedcba98); 26159609Sgshapiro } 27159609Sgshapiro#ifdef USE_INET6 28159609Sgshapiro if (family == AF_INET6) { 29159609Sgshapiro hostp->i6[0] = htonl(0xfe80aa55); 30159609Sgshapiro hostp->i6[1] = htonl(0x12345678); 31159609Sgshapiro hostp->i6[2] = htonl(0x5a5aa5a5); 32159609Sgshapiro hostp->i6[3] = htonl(0xfedcba98); 33159609Sgshapiro } 34159609Sgshapiro#endif 35159609Sgshapiro return 0; 36159609Sgshapiro } 37159609Sgshapiro 38159609Sgshapiro if (!strcmp(name, "<thishost>")) 39159609Sgshapiro name = thishost; 40159609Sgshapiro 41159609Sgshapiro if (family == AF_INET) { 42159609Sgshapiro h = gethostbyname(name); 43159609Sgshapiro if (h != NULL) { 44159609Sgshapiro if ((h->h_addr != NULL) && 45159609Sgshapiro (h->h_length == sizeof(addr))) { 46159609Sgshapiro bcopy(h->h_addr, (char *)&addr, sizeof(addr)); 4780785Sgshapiro hostp->in4.s_addr = addr; 48159609Sgshapiro return 0; 49159609Sgshapiro } 50159609Sgshapiro } 51159609Sgshapiro 52159609Sgshapiro n = getnetbyname(name); 53159609Sgshapiro if (n != NULL) { 54159609Sgshapiro hostp->in4.s_addr = htonl(n->n_net & 0xffffffff); 55159609Sgshapiro return 0; 56159609Sgshapiro } 57159609Sgshapiro } 58159609Sgshapiro#ifdef USE_INET6 59159609Sgshapiro if (family == AF_INET6) { 60159609Sgshapiro struct addrinfo hints, *res; 61159609Sgshapiro struct sockaddr_in6 *sin6; 62159609Sgshapiro 63159609Sgshapiro bzero((char *)&hints, sizeof(hints)); 64159609Sgshapiro hints.ai_family = PF_INET6; 65159609Sgshapiro 6680785Sgshapiro getaddrinfo(name, NULL, &hints, &res); 67159609Sgshapiro if (res != NULL) { 68159609Sgshapiro sin6 = (struct sockaddr_in6 *)res->ai_addr; 69159609Sgshapiro hostp->in6 = sin6->sin6_addr; 70159609Sgshapiro freeaddrinfo(res); 71159609Sgshapiro return 0; 72159609Sgshapiro } 73159609Sgshapiro } 74159609Sgshapiro#endif 75159609Sgshapiro return -1; 76159609Sgshapiro} 77159609Sgshapiro