diff options
Diffstat (limited to 'sbin/ipf/libipf/portname.c')
-rw-r--r-- | sbin/ipf/libipf/portname.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sbin/ipf/libipf/portname.c b/sbin/ipf/libipf/portname.c new file mode 100644 index 000000000000..f567b26fc3fd --- /dev/null +++ b/sbin/ipf/libipf/portname.c @@ -0,0 +1,43 @@ +/* $FreeBSD$ */ + +/* + * Copyright (C) 2012 by Darren Reed. + * + * See the IPFILTER.LICENCE file for details on licencing. + * + * $Id$ + */ +#include "ipf.h" + + +char * +portname(int pr, int port) +{ + static char buf[32]; + struct protoent *p = NULL; + struct servent *sv = NULL; + struct servent *sv1 = NULL; + + if ((opts & OPT_NORESOLVE) == 0) { + if (pr == -1) { + if ((sv = getservbyport(htons(port), "tcp"))) { + strncpy(buf, sv->s_name, sizeof(buf)-1); + buf[sizeof(buf)-1] = '\0'; + sv1 = getservbyport(htons(port), "udp"); + sv = strncasecmp(buf, sv->s_name, strlen(buf)) ? + NULL : sv1; + } + if (sv) + return (buf); + } else if ((pr != -2) && (p = getprotobynumber(pr))) { + if ((sv = getservbyport(htons(port), p->p_name))) { + strncpy(buf, sv->s_name, sizeof(buf)-1); + buf[sizeof(buf)-1] = '\0'; + return (buf); + } + } + } + + (void) snprintf(buf, sizeof(buf), "%d", port); + return (buf); +} |