Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Jun 2009 11:22:37 GMT
From:      Gabor Pali <pgj@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 163702 for review
Message-ID:  <200906071122.n57BMbI3086192@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163702

Change 163702 by pgj@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);
 	}
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906071122.n57BMbI3086192>