summaryrefslogtreecommitdiff
path: root/devel/libgtop/files/patch-sysdeps_freebsd_netload.c
blob: bb6d286e03f69694ed13ce505413fb6bd92955b6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
--- sysdeps/freebsd/netload.c.orig	Mon Dec 12 05:09:39 2005
+++ sysdeps/freebsd/netload.c	Wed May  3 13:46:08 2006
@@ -28,6 +28,8 @@
 
 #include <glibtop_suid.h>
 
+#include <string.h>
+
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
@@ -83,9 +85,11 @@ glibtop_get_netload_p (glibtop *server, 
 		       const char *interface)
 {
     struct ifnet ifnet;
-    u_long ifnetaddr, ifnetfound, ifaddraddr;
+    u_long ifnetaddr, ifnetfound;
     struct sockaddr *sa = NULL;
+#if (defined(__FreeBSD__) && (__FreeBSD_version < 501113)) || defined(__bsdi__)
     char tname [16];
+#endif
     char name [32];
 
     union {
@@ -101,12 +105,12 @@ glibtop_get_netload_p (glibtop *server, 
 		  &ifnetaddr, sizeof (ifnetaddr)) != sizeof (ifnetaddr))
 	glibtop_error_io_r (server, "kvm_read (ifnet)");
 
-    ifaddraddr = 0;
-    while (ifnetaddr || ifaddraddr) {
+    while (ifnetaddr) {
 	struct sockaddr_in *sin;
 	register char *cp;
+	u_long ifaddraddr;
 
-	if (ifaddraddr == 0) {
+	{
 	    ifnetfound = ifnetaddr;
 
 	    if (kvm_read (server->machine.kd, ifnetaddr, &ifnet,
@@ -151,7 +155,11 @@ glibtop_get_netload_p (glibtop *server, 
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK);
 	if (ifnet.if_flags & IFF_POINTOPOINT)
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT);
+#ifdef IFF_DRV_RUNNING
+	if (ifnet.if_drv_flags & IFF_DRV_RUNNING)
+#else
 	if (ifnet.if_flags & IFF_RUNNING)
+#endif
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING);
 	if (ifnet.if_flags & IFF_NOARP)
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP);
@@ -159,7 +167,11 @@ glibtop_get_netload_p (glibtop *server, 
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC);
 	if (ifnet.if_flags & IFF_ALLMULTI)
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI);
+#ifdef IFF_DRV_OACTIVE
+	if (ifnet.if_drv_flags & IFF_DRV_OACTIVE)
+#else
 	if (ifnet.if_flags & IFF_OACTIVE)
+#endif
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_OACTIVE);
 	if (ifnet.if_flags & IFF_SIMPLEX)
 		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_SIMPLEX);
@@ -191,7 +203,7 @@ glibtop_get_netload_p (glibtop *server, 
 	buf->collisions = ifnet.if_collisions;
 	buf->flags = _glibtop_sysdeps_netload;
 
-	if (ifaddraddr) {
+	while (ifaddraddr) {
 	    if ((kvm_read (server->machine.kd, ifaddraddr, &ifaddr,
 			   sizeof (ifaddr)) != sizeof (ifaddr)))
 		glibtop_error_io_r (server, "kvm_read (ifaddraddr)");
@@ -201,7 +213,12 @@ glibtop_get_netload_p (glibtop *server, 
 		CP(&ifaddr);
 	    sa = (struct sockaddr *)cp;
 
-	    if (sa->sa_family == AF_INET) {
+	    if (sa->sa_family == AF_LINK) {
+		struct sockaddr_dl *dl = (struct sockaddr_dl *) sa;
+
+		memcpy (buf->hwaddress, LLADDR (dl), sizeof (buf->hwaddress));
+		buf->flags |= GLIBTOP_NETLOAD_HWADDRESS;
+	    } else if (sa->sa_family == AF_INET) {
 		sin = (struct sockaddr_in *)sa;
 #if !defined(__bsdi__)
 		/* Commenting out to "fix" #13345. */
@@ -211,8 +228,14 @@ glibtop_get_netload_p (glibtop *server, 
 		buf->mtu = ifnet.if_mtu;
 
 		buf->flags |= _glibtop_sysdeps_netload_data;
+	    } else if (sa->sa_family == AF_INET6) {
+		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
 
+		memcpy (buf->address6, &sin6->sin6_addr, sizeof (buf->address6));
+		buf->flags |= GLIBTOP_NETLOAD_ADDRESS6;
 	    }
+	    /* FIXME prefix6, scope6 */
+	    ifaddraddr = (u_long) ifaddr.ifa.ifa_link.tqe_next;
 	}
 	return;
     }