1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3145510Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
8255332Scy * $Id$
9145510Sdarrenr */
10145510Sdarrenr#include "ipf.h"
11145510Sdarrenr
12145510Sdarrenr
13255332Scychar *portname(pr, port)
14255332Scy	int pr, port;
15145510Sdarrenr{
16255332Scy	static char buf[32];
17255332Scy	struct protoent *p = NULL;
18255332Scy	struct servent *sv = NULL;
19255332Scy	struct servent *sv1 = NULL;
20145510Sdarrenr
21145510Sdarrenr	if ((opts & OPT_NORESOLVE) == 0) {
22145510Sdarrenr		if (pr == -1) {
23145510Sdarrenr			if ((sv = getservbyport(htons(port), "tcp"))) {
24145510Sdarrenr				strncpy(buf, sv->s_name, sizeof(buf)-1);
25145510Sdarrenr				buf[sizeof(buf)-1] = '\0';
26145510Sdarrenr				sv1 = getservbyport(htons(port), "udp");
27145510Sdarrenr				sv = strncasecmp(buf, sv->s_name, strlen(buf)) ?
28145510Sdarrenr				     NULL : sv1;
29145510Sdarrenr			}
30145510Sdarrenr			if (sv)
31145510Sdarrenr				return buf;
32145510Sdarrenr		} else if ((pr != -2) && (p = getprotobynumber(pr))) {
33145510Sdarrenr			if ((sv = getservbyport(htons(port), p->p_name))) {
34145510Sdarrenr				strncpy(buf, sv->s_name, sizeof(buf)-1);
35145510Sdarrenr				buf[sizeof(buf)-1] = '\0';
36145510Sdarrenr				return buf;
37145510Sdarrenr			}
38145510Sdarrenr		}
39145510Sdarrenr	}
40145510Sdarrenr
41145510Sdarrenr	(void) sprintf(buf, "%d", port);
42145510Sdarrenr	return buf;
43145510Sdarrenr}
44