=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/fstat/fstat.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- src/usr.bin/fstat/fstat.c 1999/04/30 02:26:59 1.22 +++ src/usr.bin/fstat/fstat.c 1999/07/01 21:41:58 1.23 @@ -1,4 +1,4 @@ -/* $OpenBSD: fstat.c,v 1.22 1999/04/30 02:26:59 art Exp $ */ +/* $OpenBSD: fstat.c,v 1.23 1999/07/01 21:41:58 deraadt Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -41,7 +41,7 @@ #ifndef lint /*static char sccsid[] = "from: @(#)fstat.c 8.1 (Berkeley) 6/6/93";*/ -static char *rcsid = "$OpenBSD: fstat.c,v 1.22 1999/04/30 02:26:59 art Exp $"; +static char *rcsid = "$OpenBSD: fstat.c,v 1.23 1999/07/01 21:41:58 deraadt Exp $"; #endif /* not lint */ #include @@ -57,13 +57,14 @@ #include #include #include +#include #define _KERNEL #include #include #include +#include #undef _KERNEL #define NFS -#include #include #include #include @@ -412,6 +413,10 @@ if (!xfs_filestat(&vn, &fst)) badtype = "error"; break; + case VT_NULL: + if (!null_filestat(&vn, &fst)) + badtype = "error"; + break; default: { static char unknown[30]; sprintf(badtype = unknown, "?(%x)", vn.v_tag); @@ -600,6 +605,82 @@ fsp->mode = xfs_node.attr.va_mode; fsp->size = xfs_node.attr.va_size; fsp->rdev = xfs_node.attr.va_rdev; + + return 1; +} + +int +null_filestat(vp, fsp) + struct vnode *vp; + struct filestat *fsp; +{ + struct null_node node; + struct filestat fst; + struct vnode vn; + int fail = 1; + + memset(&fst, 0, sizeof fst); + + if (!KVM_READ(VTONULL(vp), &node, sizeof (node))) { + dprintf("can't read node at %p for pid %d", VTONULL(vp), Pid); + return 0; + } + + /* + * Attempt to find information that might be useful. + */ + if (node.null_lowervp) { + if (!KVM_READ(node.null_lowervp, &vn, sizeof (vn))) { + dprintf("can't read vnode at %p for pid %d", + node.null_lowervp, Pid); + return 0; + } + + fail = 0; + if (vn.v_type == VNON || vn.v_tag == VT_NON) + fail = 1; + else if (vn.v_type == VBAD) + fail = 1; + else + switch (vn.v_tag) { + case VT_UFS: + case VT_MFS: + if (!ufs_filestat(&vn, &fst)) + fail = 1; + break; + case VT_NFS: + if (!nfs_filestat(&vn, &fst)) + fail = 1; + break; + case VT_EXT2FS: + if (!ext2fs_filestat(&vn, &fst)) + fail = 1; + break; + case VT_ISOFS: + if (!isofs_filestat(&vn, &fst)) + fail = 1; + break; + case VT_MSDOSFS: + if (!msdos_filestat(&vn, &fst)) + fail = 1; + break; + case VT_XFS: + if (!xfs_filestat(&vn, &fst)) + fail = 1; + break; + default: + break; + } + } + + fsp->fsid = (long)node.null_vnode; + if (fail) + fsp->fileid = (long)node.null_lowervp; + else + fsp->fileid = fst.fileid; + fsp->mode = fst.mode; + fsp->size = fst.mode; + fsp->rdev = fst.mode; return 1; }