PERFORCE change 163965 for review
Gabor Pali
pgj at FreeBSD.org
Wed Jun 10 10:37:28 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163965
Change 163965 by pgj at petymeg-current on 2009/06/10 10:37:14
Some code re-organization
Affected files ...
.. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#11 edit
Differences ...
==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#11 (text+ko) ====
@@ -99,6 +99,74 @@
}
static int
+net_inet_pcblist_sysctl(int protocol, struct socket_type_list *list)
+{
+ char *buf;
+ size_t len;
+ char mibvar[64];
+
+ struct xinpgen *xig, *oxig;
+ struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct xsocket *so;
+
+ struct socket_type *stp;
+
+ sprintf(mibvar, "net.inet.%s.pcblist", ipproto[protocol]);
+
+ len = 0;
+ if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
+ if (errno != ENOENT)
+ warn("sysctl: %s", mibvar);
+ return (-1);
+ }
+ if ((buf = malloc(len)) == 0) {
+ warnx("malloc %lu bytes", (u_long)len);
+ return (-2);
+ }
+ if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
+ warn("sysctl: %s", mibvar);
+ free(buf);
+ return (-2);
+ }
+
+ oxig = xig = (struct xinpgen *)buf;
+ for (xig = (struct xinpgen *)((char *)xig + xig->xig_len);
+ xig->xig_len > sizeof(struct xinpgen);
+ xig = (struct xinpgen *)((char *)xig + xig->xig_len)) {
+ if (protocol == IPPROTO_TCP) {
+ tp = &((struct xtcpcb *)xig)->xt_tp;
+ inp = &((struct xtcpcb *)xig)->xt_inp;
+ so = &((struct xtcpcb *)xig)->xt_socket;
+ } else {
+ inp = &((struct xinpcb *)xig)->xi_inp;
+ so = &((struct xinpcb *)xig)->xi_socket;
+ }
+
+ /* Ignore sockets for protocols other than the desired one.
+ XXX: is this needed? */
+ if (so->xso_protocol != protocol)
+ continue;
+
+ if (inp->inp_gencnt <= oxig->xig_gen) {
+ stp = _netstat_st_allocate(list, PF_INET, protocol,
+ ipproto[protocol]);
+ extract_inet_data(tp, inp, so, stp);
+ }
+ }
+
+ free(buf);
+ return (0);
+}
+
+#define KREAD(off, buf, len) do { \
+ if (kread(kvm, (uintptr_t)(off), (buf), (len)) != 0) { \
+ list->stl_error = NETSTAT_ERROR_UNDEFINED; \
+ return (-1); \
+ } \
+} while (0);
+
+static int
net_local_pcblist_kvm(int type, struct socket_type_list *list,
kvm_t *kvm, struct nlist *nlistp)
{
@@ -131,13 +199,6 @@
return (-1);
}
-#define KREAD(off, buf, len) do { \
- if (kread(kvm, (uintptr_t)(off), (buf), (len)) != 0) { \
- list->stl_error = NETSTAT_ERROR_UNDEFINED; \
- return (-1); \
- } \
-} while (0);
-
KREAD(count_off, &unp_count, sizeof(unp_count));
KREAD(gencnt_off, &unp_gencnt, sizeof(unp_gencnt));
KREAD(head_off, &head, sizeof(head));
@@ -171,71 +232,9 @@
}
return (0);
-#undef KREAD
}
static int
-net_inet_pcblist_sysctl(int protocol, struct socket_type_list *list)
-{
- char *buf;
- size_t len;
- char mibvar[64];
-
- struct xinpgen *xig, *oxig;
- struct tcpcb *tp = NULL;
- struct inpcb *inp;
- struct xsocket *so;
-
- struct socket_type *stp;
-
- sprintf(mibvar, "net.inet.%s.pcblist", ipproto[protocol]);
-
- len = 0;
- if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: %s", mibvar);
- return (-1);
- }
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return (-2);
- }
- if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
- warn("sysctl: %s", mibvar);
- free(buf);
- return (-2);
- }
-
- oxig = xig = (struct xinpgen *)buf;
- for (xig = (struct xinpgen *)((char *)xig + xig->xig_len);
- xig->xig_len > sizeof(struct xinpgen);
- xig = (struct xinpgen *)((char *)xig + xig->xig_len)) {
- if (protocol == IPPROTO_TCP) {
- tp = &((struct xtcpcb *)xig)->xt_tp;
- inp = &((struct xtcpcb *)xig)->xt_inp;
- so = &((struct xtcpcb *)xig)->xt_socket;
- } else {
- inp = &((struct xinpcb *)xig)->xi_inp;
- so = &((struct xinpcb *)xig)->xi_socket;
- }
-
- /* Ignore sockets for protocols other than the desired one.
- XXX: is this needed? */
- if (so->xso_protocol != protocol)
- continue;
-
- if (inp->inp_gencnt <= oxig->xig_gen) {
- stp = _netstat_st_allocate(list, PF_INET, protocol,
- ipproto[protocol]);
- extract_inet_data(tp, inp, so, stp);
- }
- }
-
- free(buf);
- return (0);
-}
-
-static int
net_inet_pcblist_kvm(int protocol, struct socket_type_list *list,
kvm_t *kvm, struct nlist *nlistp)
{
@@ -243,6 +242,8 @@
return (0);
}
+#undef KREAD
+
int
netstat_socket(int domain, int type, int protocol,
struct socket_type_list *list, int flags, void *kvm_handle)
More information about the p4-projects
mailing list