xref: /freebsd/sbin/ipf/libipf/portname.c (revision 2a63c3be158216222d89a073dcbd6a72ee4aab5a)
1*41edb306SCy Schubert 
2*41edb306SCy Schubert /*
3*41edb306SCy Schubert  * Copyright (C) 2012 by Darren Reed.
4*41edb306SCy Schubert  *
5*41edb306SCy Schubert  * See the IPFILTER.LICENCE file for details on licencing.
6*41edb306SCy Schubert  *
7*41edb306SCy Schubert  * $Id$
8*41edb306SCy Schubert  */
9*41edb306SCy Schubert #include "ipf.h"
10*41edb306SCy Schubert 
11*41edb306SCy Schubert 
12*41edb306SCy Schubert char *
portname(int pr,int port)13*41edb306SCy Schubert portname(int pr, int port)
14*41edb306SCy Schubert {
15*41edb306SCy Schubert 	static char buf[32];
16*41edb306SCy Schubert 	struct protoent *p = NULL;
17*41edb306SCy Schubert 	struct servent *sv = NULL;
18*41edb306SCy Schubert 	struct servent *sv1 = NULL;
19*41edb306SCy Schubert 
20*41edb306SCy Schubert 	if ((opts & OPT_NORESOLVE) == 0) {
21*41edb306SCy Schubert 		if (pr == -1) {
22*41edb306SCy Schubert 			if ((sv = getservbyport(htons(port), "tcp"))) {
23*41edb306SCy Schubert 				strncpy(buf, sv->s_name, sizeof(buf)-1);
24*41edb306SCy Schubert 				buf[sizeof(buf)-1] = '\0';
25*41edb306SCy Schubert 				sv1 = getservbyport(htons(port), "udp");
26*41edb306SCy Schubert 				sv = strncasecmp(buf, sv->s_name, strlen(buf)) ?
27*41edb306SCy Schubert 				     NULL : sv1;
28*41edb306SCy Schubert 			}
29*41edb306SCy Schubert 			if (sv)
30*41edb306SCy Schubert 				return (buf);
31*41edb306SCy Schubert 		} else if ((pr != -2) && (p = getprotobynumber(pr))) {
32*41edb306SCy Schubert 			if ((sv = getservbyport(htons(port), p->p_name))) {
33*41edb306SCy Schubert 				strncpy(buf, sv->s_name, sizeof(buf)-1);
34*41edb306SCy Schubert 				buf[sizeof(buf)-1] = '\0';
35*41edb306SCy Schubert 				return (buf);
36*41edb306SCy Schubert 			}
37*41edb306SCy Schubert 		}
38*41edb306SCy Schubert 	}
39*41edb306SCy Schubert 
40*41edb306SCy Schubert 	(void) snprintf(buf, sizeof(buf), "%d", port);
41*41edb306SCy Schubert 	return (buf);
42*41edb306SCy Schubert }
43