+ufs_header()
+{
+ printf(" FILEID IFLAG RDEV|SZ");
+}
+
+ufs_print(vp)
+ struct vnode *vp;
+{
+ struct inode *ip = VTOI(vp);
+ char flagbuf[16], *flags = flagbuf;
+ register flag;
+ char *name;
+ mode_t type;
+ extern char *devname();
+
+ flag = ip->i_flag;
+ if (flag & ILOCKED)
+ *flags++ = 'L';
+ if (flag & IWANT)
+ *flags++ = 'W';
+ if (flag & IRENAME)
+ *flags++ = 'R';
+ if (flag & IUPD)
+ *flags++ = 'U';
+ if (flag & IACC)
+ *flags++ = 'A';
+ if (flag & ICHG)
+ *flags++ = 'C';
+ if (flag & IMOD)
+ *flags++ = 'M';
+ if (flag & ISHLOCK)
+ *flags++ = 'S';
+ if (flag & IEXLOCK)
+ *flags++ = 'E';
+ if (flag & ILWAIT)
+ *flags++ = 'Z';
+ if (flag == 0)
+ *flags++ = '-';
+ *flags = '\0';
+
+ printf(" %6d %5s", ip->i_number, flagbuf);
+ type = ip->i_mode & S_IFMT;
+ if (type == S_IFCHR || type == S_IFBLK)
+ if (nflg || ((name = devname(ip->i_rdev, type)) == NULL))
+ printf(" %2d,%-2d",
+ major(ip->i_rdev), minor(ip->i_rdev));
+ else
+ printf(" %7s", name);
+ else
+ printf(" %7d", ip->i_size);
+}
+
+nfs_header()
+{
+ printf(" FILEID NFLAG RDEV|SZ");
+}
+
+nfs_print(vp)
+ struct vnode *vp;
+{
+ struct nfsnode *np = VTONFS(vp);
+ char flagbuf[16], *flags = flagbuf;
+ register flag;
+ char *name;
+ mode_t type;
+ extern char *devname();
+
+ flag = np->n_flag;
+ if (flag & NLOCKED)
+ *flags++ = 'L';
+ if (flag & NWANT)
+ *flags++ = 'W';
+ if (flag & NMODIFIED)
+ *flags++ = 'M';
+ if (flag & NWRITEERR)
+ *flags++ = 'E';
+ if (flag == 0)
+ *flags++ = '-';
+ *flags = '\0';
+
+#define VT np->n_vattr
+ printf(" %6d %5s", VT.va_fileid, flagbuf);
+ type = VT.va_mode & S_IFMT;
+ if (type == S_IFCHR || type == S_IFBLK)
+ if (nflg || ((name = devname(VT.va_rdev, type)) == NULL))
+ printf(" %2d,%-2d",
+ major(VT.va_rdev), minor(VT.va_rdev));
+ else
+ printf(" %7s", name);
+ else
+ printf(" %7d", np->n_size);
+}
+
+/*
+ * Given a pointer to a mount structure in kernel space,
+ * read it in and return a usable pointer to it.
+ */
+struct mount *
+getmnt(maddr)
+ struct mount *maddr;
+{
+ static struct mtab {
+ struct mtab *next;
+ struct mount *maddr;
+ struct mount mount;
+ } *mhead = NULL;
+ register struct mtab *mt;
+
+ for (mt = mhead; mt != NULL; mt = mt->next)
+ if (maddr == mt->maddr)
+ return (&mt->mount);
+ if ((mt = (struct mtab *)malloc(sizeof (struct mtab))) == NULL) {
+ error("out of memory");
+ exit(1);
+ }
+ if (kvm_read((off_t)maddr, &mt->mount, sizeof(struct mount)) !=
+ sizeof(struct mount)) {
+ error("can't read mount table at %x", maddr);
+ return (NULL);
+ }
+ mt->maddr = maddr;
+ mt->next = mhead;
+ mhead = mt;
+ return (&mt->mount);
+}
+
+mount_print(mp)
+ struct mount *mp;
+{
+ char *type = "unknown";
+ register flags;
+
+#define ST mp->mnt_stat
+ printf("*** MOUNT ");
+ switch (ST.f_type) {
+ case MOUNT_NONE:
+ type = "none";
+ break;
+ case MOUNT_UFS:
+ type = "ufs";
+ break;
+ case MOUNT_NFS:
+ type = "nfs";
+ break;
+ case MOUNT_MFS:
+ type = "mfs";
+ break;
+ case MOUNT_PC:
+ type = "pc";
+ break;
+ }
+ printf("%s %s on %s", type, ST.f_mntfromname, ST.f_mntonname);
+ if (flags = mp->mnt_flag) {
+ char *comma = "(";
+
+ putchar(' ');
+ /* user visable flags */
+ if (flags & MNT_RDONLY) {
+ printf("%srdonly", comma);
+ flags &= ~MNT_RDONLY;
+ comma = ",";
+ }
+ if (flags & MNT_SYNCHRONOUS) {
+ printf("%ssynchronous", comma);
+ flags &= ~MNT_SYNCHRONOUS;
+ comma = ",";
+ }
+ if (flags & MNT_NOEXEC) {
+ printf("%snoexec", comma);
+ flags &= ~MNT_NOEXEC;
+ comma = ",";
+ }
+ if (flags & MNT_NOSUID) {
+ printf("%snosuid", comma);
+ flags &= ~MNT_NOSUID;
+ comma = ",";
+ }
+ if (flags & MNT_NODEV) {
+ printf("%snodev", comma);
+ flags &= ~MNT_NODEV;
+ comma = ",";
+ }
+ if (flags & MNT_EXPORTED) {
+ printf("%sexport", comma);
+ flags &= ~MNT_EXPORTED;
+ comma = ",";
+ }
+ if (flags & MNT_EXRDONLY) {
+ printf("%sexrdonly", comma);
+ flags &= ~MNT_EXRDONLY;
+ comma = ",";
+ }
+ if (flags & MNT_LOCAL) {
+ printf("%slocal", comma);
+ flags &= ~MNT_LOCAL;
+ comma = ",";
+ }
+ if (flags & MNT_QUOTA) {
+ printf("%squota", comma);
+ flags &= ~MNT_QUOTA;
+ comma = ",";
+ }
+ /* filesystem control flags */
+ if (flags & MNT_UPDATE) {
+ printf("%supdate", comma);
+ flags &= ~MNT_UPDATE;
+ comma = ",";
+ }
+ if (flags & MNT_MLOCK) {
+ printf("%slock", comma);
+ flags &= ~MNT_MLOCK;
+ comma = ",";
+ }
+ if (flags & MNT_MWAIT) {
+ printf("%swait", comma);
+ flags &= ~MNT_MWAIT;
+ comma = ",";
+ }
+ if (flags & MNT_MPBUSY) {
+ printf("%sbusy", comma);
+ flags &= ~MNT_MPBUSY;
+ comma = ",";
+ }
+ if (flags & MNT_MPWANT) {
+ printf("%swant", comma);
+ flags &= ~MNT_MPWANT;
+ comma = ",";
+ }
+ if (flags & MNT_UNMOUNT) {
+ printf("%sunmount", comma);
+ flags &= ~MNT_UNMOUNT;
+ comma = ",";
+ }
+ if (flags)
+ printf("%sunknown_flags:%x", flags);
+ printf(")");
+ }
+ printf("\n");
+#undef ST
+}
+
+struct e_vnode *
+loadvnodes(avnodes)
+ int *avnodes;
+{
+ int ret, copysize, i;
+ struct e_vnode *vnodebase;
+
+ if (fcore != NULL) {
+ error("vnodes on dead kernel, not impl yet\n");
+ exit(1);
+ }
+ if ((ret = getkerninfo(KINFO_VNODE, NULL, NULL, 0)) == -1) {
+ syserror("can't get estimate for kerninfo");
+ exit(1);
+ }
+ copysize = ret;
+ if ((vnodebase = (struct e_vnode *)malloc(copysize))
+ == NULL) {
+ error("out of memory");
+ exit(1);
+ }
+ if ((ret = getkerninfo(KINFO_VNODE, vnodebase, ©size, 0))
+ == -1) {
+ syserror("can't get vnode list");
+ exit(1);
+ }
+ if (copysize % sizeof (struct e_vnode)) {
+ error("vnode size mismatch");
+ error(1);
+ }
+ *avnodes = copysize / sizeof (struct e_vnode);
+
+ return (vnodebase);
+}
+
+u_long
+getword(loc)