xref: /illumos-gate/usr/src/cmd/ipf/lib/getifname.c (revision 533affcbc7fc4d0c8132976ea454aaa715fe2307)
1 /*
2  * Copyright (C) 2003 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  *
6  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
7  * Use is subject to license terms.
8  */
9 
10 #include "ipf.h"
11 #include "kmem.h"
12 
13 /*
14  * Given a pointer to an interface in the kernel, return a pointer to a
15  * string which is the interface name.
16  *
17  * The same code is used to run in two different environments: in ipfstat
18  * and in ipftest.  In ipftest, kmemcpy is wrapper for bcopy but in ipfstat,
19  * it is used as an interface to libkvm.
20  */
21 char *getifname(ptr)
22 struct ifnet *ptr;
23 {
24 # ifdef SOLARIS
25 #  include <sys/mutex.h>
26 #  include <sys/condvar.h>
27 # endif
28 # ifdef __hpux
29 #  include "compat.h"
30 # endif
31 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
32     defined(__OpenBSD__) || \
33     (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
34 #else
35 	char buf[32];
36 	int len;
37 # endif
38 	struct ifnet netif;
39 #define SOLARIS_PFHOOKS	1
40 # ifdef SOLARIS_PFHOOKS
41 	if ((opts & OPT_DONOTHING) == 0)
42 		return "@";
43 # endif
44 
45 	if ((void *)ptr == (void *)-1)
46 		return "!";
47 	if (ptr == NULL)
48 		return "-";
49 
50 	if (kmemcpy((char *)&netif, (u_long)ptr, sizeof(netif)) == -1)
51 		return "X";
52 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
53     defined(__OpenBSD__) || defined(linux) || \
54     (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
55 	return strdup(netif.if_xname);
56 # else
57 	if (kstrncpy(buf, (u_long)netif.if_name, sizeof(buf)) == -1)
58 		return "X";
59 	if (netif.if_unit < 10)
60 		len = 2;
61 	else if (netif.if_unit < 1000)
62 		len = 3;
63 	else if (netif.if_unit < 10000)
64 		len = 4;
65 	else
66 		len = 5;
67 	buf[sizeof(buf) - len] = '\0';
68 	sprintf(buf + strlen(buf), "%d", netif.if_unit % 10000);
69 	return strdup(buf);
70 # endif
71 }
72