Beispiel #1
0
void
vtrans(struct vnode *vp, struct nchandle *ncr, int i, int flag, off_t off)
{
    struct vnode vn;
    struct filestat fst;
    char rw[3], mode[15];
    const char *badtype = NULL, *filename;
    char *name;

    fst.offset = off;
    filename = badtype = NULL;
    if (!kread(vp, &vn, sizeof (struct vnode))) {
        dprintf(stderr, "can't read vnode at %p for pid %d\n",
                (void *)vp, Pid);
        return;
    }
    if (vn.v_type == VNON || vn.v_tag == VT_NON)
        badtype = "none";
    else if (vn.v_type == VBAD)
        badtype = "bad";
    else
        switch (vn.v_tag) {
        case VT_UFS:
            if (!ufs_filestat(&vn, &fst))
                badtype = "error";
            break;
        case VT_MFS:
            if (!ufs_filestat(&vn, &fst))
                badtype = "error";
            break;
        case VT_NFS:
            if (!nfs_filestat(&vn, &fst))
                badtype = "error";
            break;

        case VT_MSDOSFS:
            if (!msdosfs_filestat(&vn, &fst))
                badtype = "error";
            break;

        case VT_ISOFS:
            if (!isofs_filestat(&vn, &fst))
                badtype = "error";
            break;

        case VT_DEVFS:
            if (!devfs_filestat(&vn, &fst))
                badtype = "error";
            break;

        default: {
            static char unknown[10];
            sprintf(unknown, "?(%x)", vn.v_tag);
            badtype=unknown;
            break;
        }
        }
    if (checkfile) {
        int fsmatch = 0;
        DEVS *d;

        if (badtype)
            return;
        for (d = devs; d != NULL; d = d->next)
            if (d->fsid == fst.fsid) {
                fsmatch = 1;
                if (d->ino == (ino_t)fst.fileid) {
                    filename = d->name;
                    break;
                }
            }
        if (fsmatch == 0 || (filename == NULL && fsflg == 0))
            return;
    }
    PREFIX(i);
    if (badtype) {
        (void)printf(" %-*s  %10s    %jd\n",
                     wflg_mnt,
                     getmnton(vn.v_mount, &vn.v_namecache, ncr),
                     badtype,
                     (intmax_t)off);
        return;
    }
    if (nflg)
        (void)printf(" %3d,%-9d   ", major(fst.fsid), minor(fst.fsid));
    else
        (void)printf(" %-*s", wflg_mnt, getmnton(vn.v_mount, &vn.v_namecache, ncr));
    if (nflg)
        (void)sprintf(mode, "%o", fst.mode);
    else
        strmode(fst.mode, mode);
    (void)printf(" %*ld %10s", ino_width, fst.fileid, mode);
    switch (vn.v_type) {
    case VBLK:
    case VCHR:
        if (nflg || ((name = devname(fst.rdev, vn.v_type == VCHR ?
                                     S_IFCHR : S_IFBLK)) == NULL))
            printf(" %3d,%-4d", major(fst.rdev), minor(fst.rdev));
        else
            printf(" %8s", name);
        break;
    case VREG:
        printf(" %jd", (intmax_t)fst.offset);
        break;
    default:
        printf(" %8ju", (uintmax_t)fst.size);
    }
    rw[0] = '\0';
    if (flag & FREAD)
        strcat(rw, "r");
    if (flag & FWRITE)
        strcat(rw, "w");
    printf(" %2s", rw);
    if (filename && !fsflg)
        printf("  %s", filename);
    putchar('\n');
}
Beispiel #2
0
void
vtrans(struct vnode *vp, int i, int flag)
{
	struct vnode vn;
	struct filestat fst;
	char rw[3], mode[15], tagstr[12], *tagptr;
	const char *badtype, *filename;

	filename = badtype = NULL;
	if (!KVM_READ(vp, &vn, sizeof (struct vnode))) {
		dprintf(stderr, "can't read vnode at %p for pid %d\n",
		    (void *)vp, Pid);
		return;
	}
	if (!KVM_READ(&vp->v_tag, &tagptr, sizeof tagptr) ||
	    !KVM_READ(tagptr, tagstr, sizeof tagstr)) {
		dprintf(stderr, "can't read v_tag at %p for pid %d\n",
		    (void *)vp, Pid);
		return;
	}
	tagstr[sizeof(tagstr) - 1] = '\0';
	if (vn.v_type == VNON)
		badtype = "none";
	else if (vn.v_type == VBAD)
		badtype = "bad";
	else {
		if (!strcmp("ufs", tagstr)) {
			if (!ufs_filestat(&vn, &fst))
				badtype = "error";
		} else if (!strcmp("devfs", tagstr)) {
			if (!devfs_filestat(&vn, &fst))
				badtype = "error";
		} else if (!strcmp("nfs", tagstr)) {
			if (!nfs_filestat(&vn, &fst))
				badtype = "error";
		} else if (!strcmp("msdosfs", tagstr)) {
			if (!msdosfs_filestat(&vn, &fst))
				badtype = "error";
		} else if (!strcmp("isofs", tagstr)) {
			if (!isofs_filestat(&vn, &fst))
				badtype = "error";
#ifdef ZFS
		} else if (!strcmp("zfs", tagstr)) {
			if (!zfs_filestat(&vn, &fst))
				badtype = "error";
#endif
		} else {
			static char unknown[32];
			snprintf(unknown, sizeof unknown, "?(%s)", tagstr);
			badtype = unknown;
		}
	}
	if (checkfile) {
		int fsmatch = 0;
		DEVS *d;

		if (badtype)
			return;
		for (d = devs; d != NULL; d = d->next)
			if (d->fsid == fst.fsid) {
				fsmatch = 1;
				if (d->ino == fst.fileid) {
					filename = d->name;
					break;
				}
			}
		if (fsmatch == 0 || (filename == NULL && fsflg == 0))
			return;
	}
	PREFIX(i);
	if (badtype) {
		(void)printf(" -         -  %10s    -\n", badtype);
		return;
	}
	if (nflg)
		(void)printf(" %2d,%-2d", major(fst.fsid), minor(fst.fsid));
	else
		(void)printf(" %-8s", getmnton(vn.v_mount));
	if (nflg)
		(void)sprintf(mode, "%o", fst.mode);
	else
		strmode(fst.mode, mode);
	(void)printf(" %6ld %10s", fst.fileid, mode);
	switch (vn.v_type) {
	case VBLK:
	case VCHR: {
		char *name;

		name = kdevtoname(vn.v_rdev);
		if (nflg || !name)
			printf("  %2d,%-2d", major(fst.rdev), minor(fst.rdev));
		else {
			printf(" %6s", name);
			free(name);
		}
		break;
	}
	default:
		printf(" %6lu", fst.size);
	}
	rw[0] = '\0';
	if (flag & FREAD)
		strcat(rw, "r");
	if (flag & FWRITE)
		strcat(rw, "w");
	printf(" %2s", rw);
	if (filename && !fsflg)
		printf("  %s", filename);
	putchar('\n');
}