summaryrefslogtreecommitdiff
path: root/net-mgmt/net-snmp4/files/patch-agent_mibgroup_mibII_tcpTable.c
blob: 3fa2daff896c6f0fcdbf92cdb3222342f79473cc (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
--- agent/mibgroup/mibII/tcpTable.c.orig	Fri Jul 18 21:10:09 2003
+++ agent/mibgroup/mibII/tcpTable.c	Fri Jul 18 21:10:12 2003
@@ -435,11 +435,42 @@
 int TCP_Count_Connections (void)
 {
 	int Established;
+#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
+	int mib[4], len;
+	char *p;
+	struct tcpcb *tpcb;
+	struct xtcpcb *tp;
+	struct xinpgen *next;
+
+	mib[0]=CTL_NET;
+	mib[1]=PF_INET;
+	mib[2]=IPPROTO_TCP;
+	mib[3]=TCPCTL_PCBLIST;
+
+	if (sysctl(mib, 4, NULL, &len, NULL, 0) != 0) {
+		snmp_log_perror("TCP_Count_Connections - sysctl");
+		return 0;
+	}
+	if ((p=(char *)malloc(len)) == NULL) {
+		snmp_log_perror("TCP_Count_Connections - malloc");
+		return 0;
+	}
+	if (sysctl(mib, 4, p, &len, NULL, 0) != 0) {
+		snmp_log_perror("TCP_Count_Connections - sysctl");
+		free(p);
+		return 0;
+	}
+	Established=0;
+	next=(struct xinpgen *)p;
+	for (next=(struct xinpgen *)((char *)next + next->xig_len); next->xig_len > sizeof(struct xinpgen); next=(struct xinpgen *)((char *)next + next->xig_len)) {
+		tp=(struct xtcpcb *)next;
+		if (tp->xt_tp.t_state == TCPS_ESTABLISHED || tp->xt_tp.t_state == TCPS_CLOSE_WAIT)
+			Established++;
+	}
+	free(p);
+#else
 	struct inpcb cb;
 	register struct inpcb *next;
-#if !(defined(freebsd2) || defined(netbsd2) || defined(openbsd2))
-	register struct inpcb *prev;
-#endif
 	struct inpcb inpcb;
 	struct tcpcb tcpcb;
 
@@ -450,17 +481,10 @@
 
 	auto_nlist(TCP_SYMBOL, (char *)&cb, sizeof(struct inpcb));
 	inpcb = cb;
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
-	prev = (struct inpcb *) auto_nlist_value(TCP_SYMBOL);
-#endif /*  !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
 	/*
 	 *	Scan the control blocks
 	 */
-#if defined(freebsd2) || defined(netbsd1) || defined(openbsd2)
 	while ((inpcb.INP_NEXT_SYMBOL != NULL) && (inpcb.INP_NEXT_SYMBOL != (struct inpcb *) auto_nlist_value(TCP_SYMBOL)))
-#else /*  defined(freebsd2) || defined(netbsd1) || defined(openbsd2) */
-	while (inpcb.INP_NEXT_SYMBOL != (struct inpcb *) auto_nlist_value(TCP_SYMBOL))
-#endif /*  defined(freebsd2) || defined(netbsd1) */
 	{
 		next = inpcb.INP_NEXT_SYMBOL;
 
@@ -468,16 +492,7 @@
 		    snmp_log_perror("TCP_Count_Connections - inpcb");
 		    break;
 		}
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
-		if (inpcb.INP_PREV_SYMBOL != prev) {	    /* ??? */
-			sleep(1);
-			goto Again;
-		}
-#endif /*  !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
 		if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) {
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
-			prev = next;
-#endif /*  !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
 			continue;
 		}
 		if(klookup((unsigned long)inpcb.inp_ppcb, (char *)&tcpcb, sizeof (tcpcb)) == 0) {
@@ -488,10 +503,8 @@
 		if ((tcpcb.t_state == TCPS_ESTABLISHED) ||
 		    (tcpcb.t_state == TCPS_CLOSE_WAIT))
 		    Established++;
-#if !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2))
-		prev = next;
-#endif /*  !(defined(freebsd2) || defined(netbsd1) || defined(openbsd2)) */
 	}
+#endif
 	return(Established);
 }
 #endif	/* !linux && !hpux11 */