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 #pragma ident "%Z%%M% %I% %E% SMI"
11
12 #include "ipf.h"
13 #include "kmem.h"
14
15 /*
16 * Given a pointer to an interface in the kernel, return a pointer to a
17 * string which is the interface name.
18 *
19 * The same code is used to run in two different environments: in ipfstat
20 * and in ipftest. In ipftest, kmemcpy is wrapper for bcopy but in ipfstat,
21 * it is used as an interface to libkvm.
22 */
getifname(ptr)23 char *getifname(ptr)
24 struct ifnet *ptr;
25 {
26 # if SOLARIS
27 # include <sys/mutex.h>
28 # include <sys/condvar.h>
29 # endif
30 # ifdef __hpux
31 # include "compat.h"
32 # endif
33 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
34 defined(__OpenBSD__) || \
35 (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
36 #else
37 char buf[32];
38 int len;
39 # endif
40 struct ifnet netif;
41 #define SOLARIS_PFHOOKS 1
42 # ifdef SOLARIS_PFHOOKS
43 if ((opts & OPT_DONOTHING) == 0)
44 return "@";
45 # endif
46
47 if ((void *)ptr == (void *)-1)
48 return "!";
49 if (ptr == NULL)
50 return "-";
51
52 if (kmemcpy((char *)&netif, (u_long)ptr, sizeof(netif)) == -1)
53 return "X";
54 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
55 defined(__OpenBSD__) || defined(linux) || \
56 (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
57 return strdup(netif.if_xname);
58 # else
59 if (kstrncpy(buf, (u_long)netif.if_name, sizeof(buf)) == -1)
60 return "X";
61 if (netif.if_unit < 10)
62 len = 2;
63 else if (netif.if_unit < 1000)
64 len = 3;
65 else if (netif.if_unit < 10000)
66 len = 4;
67 else
68 len = 5;
69 buf[sizeof(buf) - len] = '\0';
70 sprintf(buf + strlen(buf), "%d", netif.if_unit % 10000);
71 return strdup(buf);
72 # endif
73 }
74