1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 3170268Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5255332Scy * 6255332Scy * See the IPFILTER.LICENCE file for details on licencing. 7255332Scy * 8255332Scy * $Id$ 9255332Scy */ 10170268Sdarrenr 11145510Sdarrenr#include "ipf.h" 12145510Sdarrenr 13255332Scyint gethost(family, name, hostp) 14255332Scy int family; 15255332Scy char *name; 16255332Scy i6addr_t *hostp; 17145510Sdarrenr{ 18145510Sdarrenr struct hostent *h; 19145510Sdarrenr struct netent *n; 20145510Sdarrenr u_32_t addr; 21145510Sdarrenr 22271971Scy bzero(hostp, sizeof(*hostp)); 23145510Sdarrenr if (!strcmp(name, "test.host.dots")) { 24255332Scy if (family == AF_INET) { 25255332Scy hostp->in4.s_addr = htonl(0xfedcba98); 26255332Scy } 27255332Scy#ifdef USE_INET6 28255332Scy if (family == AF_INET6) { 29271970Scy hostp->i6[0] = htonl(0xfe80aa55); 30271970Scy hostp->i6[1] = htonl(0x12345678); 31271970Scy hostp->i6[2] = htonl(0x5a5aa5a5); 32271970Scy hostp->i6[3] = htonl(0xfedcba98); 33255332Scy } 34255332Scy#endif 35145510Sdarrenr return 0; 36145510Sdarrenr } 37145510Sdarrenr 38145510Sdarrenr if (!strcmp(name, "<thishost>")) 39145510Sdarrenr name = thishost; 40145510Sdarrenr 41255332Scy if (family == AF_INET) { 42255332Scy h = gethostbyname(name); 43255332Scy if (h != NULL) { 44255332Scy if ((h->h_addr != NULL) && 45255332Scy (h->h_length == sizeof(addr))) { 46255332Scy bcopy(h->h_addr, (char *)&addr, sizeof(addr)); 47255332Scy hostp->in4.s_addr = addr; 48255332Scy return 0; 49255332Scy } 50255332Scy } 51255332Scy 52255332Scy n = getnetbyname(name); 53255332Scy if (n != NULL) { 54255332Scy hostp->in4.s_addr = htonl(n->n_net & 0xffffffff); 55145510Sdarrenr return 0; 56145510Sdarrenr } 57145510Sdarrenr } 58255332Scy#ifdef USE_INET6 59255332Scy if (family == AF_INET6) { 60255332Scy struct addrinfo hints, *res; 61255332Scy struct sockaddr_in6 *sin6; 62145510Sdarrenr 63255332Scy bzero((char *)&hints, sizeof(hints)); 64255332Scy hints.ai_family = PF_INET6; 65255332Scy 66255332Scy getaddrinfo(name, NULL, &hints, &res); 67255332Scy if (res != NULL) { 68255332Scy sin6 = (struct sockaddr_in6 *)res->ai_addr; 69255332Scy hostp->in6 = sin6->sin6_addr; 70255332Scy freeaddrinfo(res); 71255332Scy return 0; 72255332Scy } 73145510Sdarrenr } 74255332Scy#endif 75145510Sdarrenr return -1; 76145510Sdarrenr} 77