PERFORCE change 163702 for review
Gabor Pali
pgj at FreeBSD.org
Sun Jun 7 11:22:42 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163702
Change 163702 by pgj at petymeg-current on 2009/06/07 11:22:36
Move capability to return all local sockets (of all protocols) from
netstat(1) to libnetstat
Affected files ...
.. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#4 edit
.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/unix.c#5 edit
Differences ...
==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#4 (text+ko) ====
@@ -158,37 +158,62 @@
struct socket_type_list *list, int flags, void *kvm_handle)
{
kvm_t *kvm;
- struct xsocket *so;
- struct xunpgen *xug, oxug;
- struct xunpcb *xunp;
+ int use_kvm;
+
+ use_kvm = flags & ~NETSTAT_SOCKET_KVM;
+ if (use_kvm) {
+ /* Use KVM to retrieve data. */
+ kvm = (kvm_t *)kvm_handle;
+ if (kvm_nlist(kvm, nl) < 0) {
+ list->stl_error = NETSTAT_ERROR_KVM;
+ return (-1);
+ }
+ }
+
+#define NLP_KVM(type, list, kvm, nl) do { \
+ if (net_local_pcblist_kvm((type), (list), (kvm), (nl)) != 0) { \
+ list->stl_error = NETSTAT_ERROR_UNDEFINED; \
+ return (-1); \
+ } \
+} while (0)
+
+#define NLP_SCT(type, list) do { \
+ if (net_local_pcblist_sysctl((type), (list)) != 0) { \
+ list->stl_error = NETSTAT_ERROR_UNDEFINED; \
+ return (-1); \
+ } \
+} while (0)
switch (domain) {
case PF_LOCAL:
switch (type) {
case SOCK_STREAM:
case SOCK_DGRAM:
- if (flags & ~NETSTAT_SOCKET_KVM) {
- /* Use KVM to retrieve data. */
- kvm = (kvm_t *)kvm_handle;
- if (kvm_nlist(kvm, nl) < 0) {
- list->stl_error = NETSTAT_ERROR_KVM;
- return (-1);
- }
-
- return (net_local_pcblist_kvm(type, list, kvm,
- nl));
+ if (use_kvm)
+ NLP_KVM(type, list, kvm, nl);
+ else
+ /* Use sysctl (or something else). */
+ NLP_SCT(type, list);
+ /* All PF_LOCAL */
+ case 0:
+ if (use_kvm) {
+ NLP_KVM(SOCK_STREAM, list, kvm, nl);
+ NLP_KVM(SOCK_DGRAM, list, kvm, nl);
} else {
- /* Use sysctl (or something else). */
- return (net_local_pcblist_sysctl(type, list));
+ NLP_SCT(SOCK_STREAM, list);
+ NLP_SCT(SOCK_DGRAM, list);
}
+ break;
default:
list->stl_error = NETSTAT_ERROR_UNSUPPORTED;
return (-1);
}
+ break;
default:
list->stl_error = NETSTAT_ERROR_UNSUPPORTED;
return (-1);
}
-
+#undef NLP_KVM
+#undef NLP_SCT
return (0);
}
==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/unix.c#5 (text+ko) ====
@@ -71,10 +71,9 @@
void
unixpr(void *kvmd)
{
- int ret, type;
struct socket_type_list *stlp;
struct socket_type *stp;
- int error;
+ int error, st_flags;
kvm_t *kvm;
kvm = (kvm_t *)kvmd;
@@ -84,31 +83,28 @@
return;
}
- for (type = SOCK_STREAM; type <= SOCK_SEQPACKET; type++) {
- ret = netstat_socket(PF_LOCAL, type, 0, stlp,
- live ? 0 : NETSTAT_SOCKET_KVM, kvm);
- if (ret < 0 &&
- netstat_stl_geterror(stlp) == NETSTAT_ERROR_UNSUPPORTED)
- continue;
- if (ret < 0) {
- error = netstat_stl_geterror(stlp);
- if (error == NETSTAT_ERROR_KVM)
- warnx("netstat_socket: %s", kvm_geterr(kvm));
- else
- warnx("netstat_socket: %s",
- netstat_strerror(error));
- return;
- }
+ st_flags = 0;
+ if (live)
+ st_flags |= NETSTAT_SOCKET_KVM;
+
+ /* Get all the local sockets, regardless their types. */
+ if (netstat_socket(PF_LOCAL, 0, 0, stlp, st_flags, kvm) < 0) {
+ error = netstat_stl_geterror(stlp);
+ if (error == NETSTAT_ERROR_KVM)
+ warnx("netstat_socket: %s", kvm_geterr(kvm));
+ else
+ warnx("netstat_socket: %s", netstat_strerror(error));
+ return;
+ }
- /*
- * It should be guaranteed that only active PCBs are
- * returned.
- */
- for (stp = netstat_stl_first(stlp);
- stp != NULL;
- stp = netstat_stl_next(stp)) {
- unixdomainpr(stp);
- }
+ /*
+ * It should be guaranteed that only active PCBs are
+ * returned.
+ */
+ for (stp = netstat_stl_first(stlp);
+ stp != NULL;
+ stp = netstat_stl_next(stp)) {
+ unixdomainpr(stp);
}
}
More information about the p4-projects
mailing list