Module Name:    src
Committed By:   christos
Date:           Fri Jan 17 03:28:01 UTC 2014

Modified Files:
        src/usr.bin/fstat: fstat.c

Log Message:
make fstat -f search for unix sockets.


To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/usr.bin/fstat/fstat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/fstat/fstat.c
diff -u src/usr.bin/fstat/fstat.c:1.106 src/usr.bin/fstat/fstat.c:1.107
--- src/usr.bin/fstat/fstat.c:1.106	Sun Dec 15 13:56:59 2013
+++ src/usr.bin/fstat/fstat.c	Thu Jan 16 22:28:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fstat.c,v 1.106 2013/12/15 18:56:59 mlelstv Exp $	*/
+/*	$NetBSD: fstat.c,v 1.107 2014/01/17 03:28:01 christos Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)fstat.c	8.3 (Berkeley) 5/2/95";
 #else
-__RCSID("$NetBSD: fstat.c,v 1.106 2013/12/15 18:56:59 mlelstv Exp $");
+__RCSID("$NetBSD: fstat.c,v 1.107 2014/01/17 03:28:01 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -510,8 +510,7 @@ ftrans(fdfile_t *fp, int i)
 		vtrans(file.f_data, i, file.f_flag, (long)fdfile.ff_file);
 		break;
 	case DTYPE_SOCKET:
-		if (checkfile == 0)
-			socktrans(file.f_data, i);
+		socktrans(file.f_data, i);
 		break;
 	case DTYPE_PIPE:
 		if (checkfile == 0)
@@ -598,37 +597,49 @@ vfilestat(struct vnode *vp, struct files
 	return badtype;
 }
 
-static void
-vtrans(struct vnode *vp, int i, int flag, long addr)
+static int
+checkfs(struct vnode *vp, struct vnode *vn, struct filestat *fst,
+    const char **type, const char **fname)
 {
-	struct vnode vn;
-	struct filestat fst;
-	char mode[15], rw[3];
-	const char *badtype, *filename;
-
-	filename = NULL;
-	if (!KVM_READ(vp, &vn, sizeof(struct vnode))) {
+	*fname = NULL;
+	if (!KVM_READ(vp, vn, sizeof(*vn))) {
 		dprintf("can't read vnode at %p for pid %d", vp, Pid);
-		return;
+		return 0;
 	}
-	badtype = vfilestat(&vn, &fst);
+	*type = vfilestat(vn, fst);
 	if (checkfile) {
 		int fsmatch = 0;
 		DEVS *d;
-
-		if (badtype && badtype != dead)
-			return;
-		for (d = devs; d != NULL; d = d->next)
-			if (d->fsid == fst.fsid) {
+#if 0
+		if (*type && *type != dead)
+			return 0;
+#endif
+		for (d = devs; d != NULL; d = d->next) {
+			if (d->fsid == fst->fsid) {
 				fsmatch = 1;
-				if (d->ino == fst.fileid) {
-					filename = d->name;
+				if (d->ino == fst->fileid) {
+					*fname = d->name;
 					break;
 				}
 			}
-		if (fsmatch == 0 || (filename == NULL && fsflg == 0))
-			return;
+		}
+		if (fsmatch == 0 || (*fname == NULL && fsflg == 0))
+			return 0;
 	}
+	return 1;
+}
+
+static void
+vtrans(struct vnode *vp, int i, int flag, long addr)
+{
+	struct vnode vn;
+	char mode[15], rw[3];
+	const char *badtype, *filename;
+	struct filestat fst;
+
+	if (!checkfs(vp, &vn, &fst, &badtype, &filename))
+		return;
+
 	if (Aflg)
 		(void)printf("%*lx ", 2*(int)(sizeof(void*)), addr);
 	PREFIX(i);
@@ -999,7 +1010,6 @@ socktrans(struct socket *sock, int i)
 	int len;
 	char dname[32];
 	char lbuf[512], fbuf[512];
-	PREFIX(i);
 
 	/* fill in socket */
 	if (!KVM_READ(sock, &so, sizeof(struct socket))) {
@@ -1019,6 +1029,9 @@ socktrans(struct socket *sock, int i)
 		goto bad;
 	}
 
+	if (checkfile && dom.dom_family != AF_LOCAL)
+		return;
+
 	if ((len = kvm_read(kd, (u_long)dom.dom_name, dname,
 	    sizeof(dname) - 1)) != sizeof(dname) -1) {
 		dprintf("can't read domain name at %p", dom.dom_name);
@@ -1027,11 +1040,6 @@ socktrans(struct socket *sock, int i)
 	else
 		dname[len] = '\0';
 
-	if ((u_short)so.so_type > STYPEMAX)
-		(void)printf("* %s ?%d", dname, so.so_type);
-	else
-		(void)printf("* %s %s", dname, stypename[so.so_type]);
-
 	/* 
 	 * protocol specific formatting
 	 *
@@ -1112,6 +1120,16 @@ again:
 				dprintf("can't read unpcb at %p", so.so_pcb);
 				goto bad;
 			}
+			if (checkfile) {
+				struct vnode vn;
+				struct filestat fst;
+				const char *badtype, *filename;
+				if (unpcb.unp_vnode == NULL)
+					return;
+				if (!checkfs(unpcb.unp_vnode, &vn, &fst,
+				    &badtype, &filename))
+					return;
+			}
 
 			if (unpcb.unp_addr) {
 				struct sockaddr_un *sun = 
@@ -1162,6 +1180,12 @@ again:
 		    (uintmax_t)(uintptr_t)sock);
 		break;
 	}
+	PREFIX(i);
+	if ((u_short)so.so_type > STYPEMAX)
+		(void)printf("* %s ?%d", dname, so.so_type);
+	else
+		(void)printf("* %s %s", dname, stypename[so.so_type]);
+
 	if (fbuf[0] || lbuf[0])
 		printf(" %s%s%s", fbuf, (fbuf[0] && lbuf[0]) ? " <-> " : "",
 		    lbuf);

Reply via email to