xref: /illumos-gate/usr/src/cmd/ipf/lib/common/getifname.c (revision ab25eeb5)
1 /*
2  * Copyright (C) 2003 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  *
6  * Copyright 2006 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 "qif.h"
14 #include "kmem.h"
15 
16 /*
17  * Given a pointer to an interface in the kernel, return a pointer to a
18  * string which is the interface name.
19  */
20 char *getifname(ptr)
21 struct ifnet *ptr;
22 {
23 #if SOLARIS || defined(__hpux)
24 # if SOLARIS
25 #  include <sys/mutex.h>
26 #  include <sys/condvar.h>
27 # endif
28 # ifdef __hpux
29 #  include "compat.h"
30 # endif
31 	char *ifname;
32 	qif_t qif;
33 
34 	if ((void *)ptr == (void *)-1)
35 		return "!";
36 	if (ptr == NULL)
37 		return "-";
38 
39 	if (kmemcpy((char *)&qif, (u_long)ptr, sizeof(qif)) == -1)
40 		return "X";
41 	ifname = strdup(qif.qf_name);
42 	if ((ifname != NULL) && (*ifname == '\0')) {
43 		free(ifname);
44 		return "!";
45 	}
46 	return ifname;
47 #else
48 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
49     defined(__OpenBSD__) || \
50     (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
51 #else
52 	char buf[32];
53 	int len;
54 # endif
55 	struct ifnet netif;
56 
57 	if ((void *)ptr == (void *)-1)
58 		return "!";
59 	if (ptr == NULL)
60 		return "-";
61 
62 	if (kmemcpy((char *)&netif, (u_long)ptr, sizeof(netif)) == -1)
63 		return "X";
64 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
65     defined(__OpenBSD__) || defined(linux) || \
66     (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
67 	return strdup(netif.if_xname);
68 # else
69 	if (kstrncpy(buf, (u_long)netif.if_name, sizeof(buf)) == -1)
70 		return "X";
71 	if (netif.if_unit < 10)
72 		len = 2;
73 	else if (netif.if_unit < 1000)
74 		len = 3;
75 	else if (netif.if_unit < 10000)
76 		len = 4;
77 	else
78 		len = 5;
79 	buf[sizeof(buf) - len] = '\0';
80 	sprintf(buf + strlen(buf), "%d", netif.if_unit % 10000);
81 	return strdup(buf);
82 # endif
83 #endif
84 }
85