xref: /freebsd/sbin/ipf/libipf/getifname.c (revision 716fd348e01c5f2ba125f878a634a753436c2994)
1 /*	$FreeBSD$	*/
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id$
9  */
10 
11 #include "ipf.h"
12 
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 char *
20 getifname(struct ifnet *ptr)
21 {
22 #if SOLARIS
23 #  include <sys/mutex.h>
24 #  include <sys/condvar.h>
25 # include "../pfil/qif.h"
26 	char *ifname;
27 	qif_t qif;
28 
29 	if ((void *)ptr == (void *)-1)
30 		return ("!");
31 	if (ptr == NULL)
32 		return ("-");
33 
34 	if (kmemcpy((char *)&qif, (u_long)ptr, sizeof(qif)) == -1)
35 		return ("X");
36 	ifname = strdup(qif.qf_name);
37 	if ((ifname != NULL) && (*ifname == '\0')) {
38 		free(ifname);
39 		return ("!");
40 	}
41 	return (ifname);
42 #else
43 	struct ifnet netif;
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 	return (strdup(netif.if_xname));
53 #endif
54 }
55