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 */
10145510Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145510Sdarrenr
13255332Scychar *hostname(family, ip)
14255332Scy	int family;
15255332Scy	void *ip;
16145510Sdarrenr{
17145510Sdarrenr	static char hostbuf[MAXHOSTNAMELEN+1];
18145510Sdarrenr	struct hostent *hp;
19145510Sdarrenr	struct in_addr ipa;
20145510Sdarrenr	struct netent *np;
21145510Sdarrenr
22170268Sdarrenr	memset(&ipa, 0, sizeof(ipa));	/* XXX gcc */
23170268Sdarrenr
24255332Scy	if (family == AF_INET) {
25145510Sdarrenr		ipa.s_addr = *(u_32_t *)ip;
26145510Sdarrenr		if (ipa.s_addr == htonl(0xfedcba98))
27145510Sdarrenr			return "test.host.dots";
28145510Sdarrenr	}
29145510Sdarrenr
30145510Sdarrenr	if ((opts & OPT_NORESOLVE) == 0) {
31255332Scy		if (family == AF_INET) {
32145510Sdarrenr			hp = gethostbyaddr(ip, 4, AF_INET);
33145510Sdarrenr			if (hp != NULL && hp->h_name != NULL &&
34145510Sdarrenr			    *hp->h_name != '\0') {
35145510Sdarrenr				strncpy(hostbuf, hp->h_name, sizeof(hostbuf));
36145510Sdarrenr				hostbuf[sizeof(hostbuf) - 1] = '\0';
37145510Sdarrenr				return hostbuf;
38145510Sdarrenr			}
39145510Sdarrenr
40145510Sdarrenr			np = getnetbyaddr(ipa.s_addr, AF_INET);
41145510Sdarrenr			if (np != NULL && np->n_name != NULL &&
42145510Sdarrenr			    *np->n_name != '\0') {
43145510Sdarrenr				strncpy(hostbuf, np->n_name, sizeof(hostbuf));
44145510Sdarrenr				hostbuf[sizeof(hostbuf) - 1] = '\0';
45145510Sdarrenr				return hostbuf;
46145510Sdarrenr			}
47145510Sdarrenr		}
48145510Sdarrenr	}
49145510Sdarrenr
50255332Scy	if (family == AF_INET) {
51145510Sdarrenr		return inet_ntoa(ipa);
52145510Sdarrenr	}
53145510Sdarrenr#ifdef  USE_INET6
54145510Sdarrenr	(void) inet_ntop(AF_INET6, ip, hostbuf, sizeof(hostbuf) - 1);
55145510Sdarrenr	hostbuf[MAXHOSTNAMELEN] = '\0';
56145510Sdarrenr	return hostbuf;
57145510Sdarrenr#else
58145510Sdarrenr	return "IPv6";
59145510Sdarrenr#endif
60145510Sdarrenr}
61