getifname.c revision 145519
1145519Sdarrenr/*	$FreeBSD: head/contrib/ipfilter/lib/getifname.c 145519 2005-04-25 18:20:15Z darrenr $	*/
2145510Sdarrenr
3145510Sdarrenr#include "ipf.h"
4145510Sdarrenr
5145510Sdarrenr#include "kmem.h"
6145510Sdarrenr
7145510Sdarrenr/*
8145510Sdarrenr * Given a pointer to an interface in the kernel, return a pointer to a
9145510Sdarrenr * string which is the interface name.
10145510Sdarrenr */
11145510Sdarrenrchar *getifname(ptr)
12145510Sdarrenrstruct ifnet *ptr;
13145510Sdarrenr{
14145510Sdarrenr#if SOLARIS || defined(__hpux)
15145510Sdarrenr# if SOLARIS
16145510Sdarrenr#  include <sys/mutex.h>
17145510Sdarrenr#  include <sys/condvar.h>
18145510Sdarrenr# endif
19145510Sdarrenr# ifdef __hpux
20145510Sdarrenr#  include "compat.h"
21145510Sdarrenr# endif
22145510Sdarrenr# include "../pfil/qif.h"
23145510Sdarrenr	char *ifname;
24145510Sdarrenr	qif_t qif;
25145510Sdarrenr
26145510Sdarrenr	if ((void *)ptr == (void *)-1)
27145510Sdarrenr		return "!";
28145510Sdarrenr	if (ptr == NULL)
29145510Sdarrenr		return "-";
30145510Sdarrenr
31145510Sdarrenr	if (kmemcpy((char *)&qif, (u_long)ptr, sizeof(qif)) == -1)
32145510Sdarrenr		return "X";
33145510Sdarrenr	ifname = strdup(qif.qf_name);
34145510Sdarrenr	if ((ifname != NULL) && (*ifname == '\0')) {
35145510Sdarrenr		free(ifname);
36145510Sdarrenr		return "!";
37145510Sdarrenr	}
38145510Sdarrenr	return ifname;
39145510Sdarrenr#else
40145510Sdarrenr# if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
41145510Sdarrenr    defined(__OpenBSD__) || \
42145510Sdarrenr    (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
43145510Sdarrenr#else
44145510Sdarrenr	char buf[32];
45145510Sdarrenr	int len;
46145510Sdarrenr# endif
47145510Sdarrenr	struct ifnet netif;
48145510Sdarrenr
49145510Sdarrenr	if ((void *)ptr == (void *)-1)
50145510Sdarrenr		return "!";
51145510Sdarrenr	if (ptr == NULL)
52145510Sdarrenr		return "-";
53145510Sdarrenr
54145510Sdarrenr	if (kmemcpy((char *)&netif, (u_long)ptr, sizeof(netif)) == -1)
55145510Sdarrenr		return "X";
56145510Sdarrenr# if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
57145510Sdarrenr    defined(__OpenBSD__) || defined(linux) || \
58145510Sdarrenr    (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
59145510Sdarrenr	return strdup(netif.if_xname);
60145510Sdarrenr# else
61145510Sdarrenr	if (kstrncpy(buf, (u_long)netif.if_name, sizeof(buf)) == -1)
62145510Sdarrenr		return "X";
63145510Sdarrenr	if (netif.if_unit < 10)
64145510Sdarrenr		len = 2;
65145510Sdarrenr	else if (netif.if_unit < 1000)
66145510Sdarrenr		len = 3;
67145510Sdarrenr	else if (netif.if_unit < 10000)
68145510Sdarrenr		len = 4;
69145510Sdarrenr	else
70145510Sdarrenr		len = 5;
71145510Sdarrenr	buf[sizeof(buf) - len] = '\0';
72145510Sdarrenr	sprintf(buf + strlen(buf), "%d", netif.if_unit % 10000);
73145510Sdarrenr	return strdup(buf);
74145510Sdarrenr# endif
75145510Sdarrenr#endif
76145510Sdarrenr}
77