summaryrefslogtreecommitdiff
path: root/usr.bin/fstat
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2014-01-17 03:28:01 +0000
committerchristos <christos@NetBSD.org>2014-01-17 03:28:01 +0000
commit58ca391bb52f550e2fefe3599d46ac4e1bbfbada (patch)
tree0c69ce73d31c9ae3957d5aea0f57712c46ccd5e5 /usr.bin/fstat
parenta09b113a5428172b00212f6e80d568ccf87dcea6 (diff)
make fstat -f search for unix sockets.
Diffstat (limited to 'usr.bin/fstat')
-rw-r--r--usr.bin/fstat/fstat.c84
1 files changed, 54 insertions, 30 deletions
diff --git a/usr.bin/fstat/fstat.c b/usr.bin/fstat/fstat.c
index c8d40c341b4..53511f57981 100644
--- a/usr.bin/fstat/fstat.c
+++ b/usr.bin/fstat/fstat.c
@@ -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, 1993\
#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 filestat *fsp)
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);