Module Name: src Committed By: christos Date: Fri Sep 6 17:08:22 UTC 2019
Modified Files: src/usr.bin/fstat: fstat.1 fstat.c fstat.h misc.c Log Message: Add -O to print offsets; align columns properly. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/usr.bin/fstat/fstat.1 cvs rdiff -u -r1.112 -r1.113 src/usr.bin/fstat/fstat.c cvs rdiff -u -r1.9 -r1.10 src/usr.bin/fstat/fstat.h cvs rdiff -u -r1.21 -r1.22 src/usr.bin/fstat/misc.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.1 diff -u src/usr.bin/fstat/fstat.1:1.34 src/usr.bin/fstat/fstat.1:1.35 --- src/usr.bin/fstat/fstat.1:1.34 Mon Jul 3 17:34:57 2017 +++ src/usr.bin/fstat/fstat.1 Fri Sep 6 13:08:22 2019 @@ -1,4 +1,4 @@ -.\" $NetBSD: fstat.1,v 1.34 2017/07/03 21:34:57 wiz Exp $ +.\" $NetBSD: fstat.1,v 1.35 2019/09/06 17:08:22 christos Exp $ .\" .\" Copyright (c) 1987, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)fstat.1 8.3 (Berkeley) 2/25/94 .\" -.Dd December 15, 2013 +.Dd September 6, 2019 .Dt FSTAT 1 .Os .Sh NAME @@ -37,7 +37,7 @@ .Nd display status of open files .Sh SYNOPSIS .Nm -.Op Fl Afnv +.Op Fl AfnOv .Op Fl M Ar core .Op Fl N Ar system .Op Fl p Ar pid @@ -54,7 +54,7 @@ If no options are specified, reports on all open files in the system. .Pp Options: -.Bl -tag -width Ds +.Bl -tag -width XXXXXXXXXX .It Fl A Add an output column with the address of the kernel object (vnode or file), that can be matched with @@ -72,12 +72,15 @@ resides, type Please see the .Sx BUGS section for issues with this option. -.It Fl M -Extract values associated with the name list from the specified core +.It Fl M Ar core +Extract values associated with the name list from the specified +.Ar core instead of the default .Pa /dev/kmem . -.It Fl N -Extract the name list from the specified system instead of the default +.It Fl N Ar system +Extract the name list from the specified +.Ar system +instead of the default .Pa /netbsd . .It Fl n Numerical format. @@ -88,10 +91,14 @@ device number that the special device re in .Pa /dev ; and print the mode of the file in octal instead of symbolic form. -.It Fl p -Report all files open by the specified process. -.It Fl u -Report all files open by the specified user. +.It Fl O +Report file offsets instead of sizes. +.It Fl p Ar process +Report all files open by the specified +.Ar process . +.It Fl u Ar user +Report all files open by the specified +.Ar user . .It Fl v Verbose mode. Print error messages upon failures to locate particular @@ -161,9 +168,11 @@ using a symbolic format (see .Xr strmode 3 ) ; otherwise, the mode is printed as an octal number. -.It Li SZ\&|DV +.It Li SZ\&|DV or OFFS If the file is not a character or block special file, prints the size of -the file in bytes. +the file in bytes (or the offset if the +.Fl O +is specified). Otherwise, if the .Fl n flag is not specified, prints Index: src/usr.bin/fstat/fstat.c diff -u src/usr.bin/fstat/fstat.c:1.112 src/usr.bin/fstat/fstat.c:1.113 --- src/usr.bin/fstat/fstat.c:1.112 Sat Feb 2 22:19:29 2019 +++ src/usr.bin/fstat/fstat.c Fri Sep 6 13:08:22 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fstat.c,v 1.112 2019/02/03 03:19:29 mrg Exp $ */ +/* $NetBSD: fstat.c,v 1.113 2019/09/06 17:08:22 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.112 2019/02/03 03:19:29 mrg Exp $"); +__RCSID("$NetBSD: fstat.c,v 1.113 2019/09/06 17:08:22 christos Exp $"); #endif #endif /* not lint */ @@ -134,6 +134,7 @@ static int fsflg, /* show files on same static int checkfile; /* true if restricting to particular files or filesystems */ static int nflg; /* (numerical) display f.s. and rdev as dev_t */ static int Aflg; /* prefix with address of file structure */ +static int Oflg; /* print offset instead of size */ int vflg; /* display errors in locating kernel data objects etc... */ static fdfile_t **ofiles; /* buffer of pointers to file structures */ @@ -171,12 +172,12 @@ static const char *inet6_addrstr(char *, uint16_t, bool); #endif static const char *at_addrstr(char *, size_t, const struct sockaddr_at *); -static void socktrans(struct socket *, int); +static void socktrans(struct file *, struct socket *, int); static void misctrans(struct file *, int); static int ufs_filestat(struct vnode *, struct filestat *); static void usage(void) __dead; static const char *vfilestat(struct vnode *, struct filestat *); -static void vtrans(struct vnode *, int, int, long); +static void vtrans(struct file *, struct vnode *, int, int, long); static void ftrans(fdfile_t *, int); static void ptrans(struct file *, struct pipe *, int); static void kdriver_init(void); @@ -196,7 +197,7 @@ main(int argc, char **argv) arg = 0; what = KERN_PROC_ALL; nlistf = memf = NULL; - while ((ch = getopt(argc, argv, "fnAp:u:vN:M:")) != -1) + while ((ch = getopt(argc, argv, "fnAOp:u:vN:M:")) != -1) switch((char)ch) { case 'f': fsflg = 1; @@ -213,6 +214,9 @@ main(int argc, char **argv) case 'A': Aflg = 1; break; + case 'O': + Oflg = 1; + break; case 'p': if (pflg++) usage(); @@ -284,11 +288,14 @@ main(int argc, char **argv) if (Aflg) (void)printf("%-*s ", 2*(int)(sizeof(void*)), "ADDR"); if (nflg) - (void)printf("%s", -"USER CMD PID FD DEV INUM MODE SZ|DV R/W"); + (void)printf( +"USER CMD PID FD DEV INUM MODE %s R/W", + Oflg ? " OFFS" : "SZ|DV" ); else - (void)printf("%s", -"USER CMD PID FD MOUNT INUM MODE SZ|DV R/W"); + (void)printf( +"USER CMD PID FD MOUNT INUM MODE %s R/W", + Oflg ? " OFFS" : "SZ|DV" ); + if (checkfile && fsflg == 0) (void)printf(" NAME\n"); else @@ -450,11 +457,11 @@ dofiles(struct kinfo_proc2 *p) * root directory vnode, if one */ if (cwdi.cwdi_rdir) - vtrans(cwdi.cwdi_rdir, RDIR, FREAD, (long)cwdi.cwdi_rdir); + vtrans(NULL, cwdi.cwdi_rdir, RDIR, FREAD, (long)cwdi.cwdi_rdir); /* * current working directory vnode */ - vtrans(cwdi.cwdi_cdir, CDIR, FREAD, (long)cwdi.cwdi_cdir); + vtrans(NULL, cwdi.cwdi_cdir, CDIR, FREAD, (long)cwdi.cwdi_cdir); #if 0 /* * Disable for now, since p->p_tracep appears to point to a ktr_desc * @@ -507,10 +514,10 @@ ftrans(fdfile_t *fp, int i) 2*(int)(sizeof(void*)), (long)fdfile.ff_file); switch (file.f_type) { case DTYPE_VNODE: - vtrans(file.f_data, i, file.f_flag, (long)fdfile.ff_file); + vtrans(&file, file.f_data, i, file.f_flag, (long)fdfile.ff_file); break; case DTYPE_SOCKET: - socktrans(file.f_data, i); + socktrans(&file, file.f_data, i); break; case DTYPE_PIPE: if (checkfile == 0) @@ -634,7 +641,37 @@ checkfs(struct vnode *vp, struct vnode * } static void -vtrans(struct vnode *vp, int i, int flag, long addr) +vprint(struct vnode *vn, struct filestat *fst) +{ + switch (vn->v_type) { + case VBLK: + case VCHR: { + const char *name; + + if (nflg || ((name = devname(fst->rdev, vn->v_type == VCHR ? + S_IFCHR : S_IFBLK)) == NULL)) + (void)printf(" %s,%-2llu", + kdriver_search(vn->v_type, major(fst->rdev)), + (unsigned long long)minor(fst->rdev)); + else + (void)printf(" %6s", name); + break; + } + default: + (void)printf(" %6lld", (long long)fst->size); + } +} + +void +oprint(struct file *fp, const char *str) +{ + if (Oflg) + (void)printf(" %6lld", (long long)(fp ? fp->f_offset : 0)); + fputs(str, stdout); +} + +static void +vtrans(struct file *fp, struct vnode *vp, int i, int flag, long addr) { struct vnode vn; char mode[15], rw[3]; @@ -658,32 +695,20 @@ vtrans(struct vnode *vp, int i, int flag return; } if (nflg) - (void)printf(" %2llu,%-2llu", + (void)printf(" %3llu,%-2llu", (unsigned long long)major(fst.fsid), (unsigned long long)minor(fst.fsid)); else (void)printf(" %-8s", getmnton(vn.v_mount)); if (nflg) - (void)snprintf(mode, sizeof mode, "%o", fst.mode); + (void)snprintf(mode, sizeof mode, "%6o", fst.mode); else strmode(fst.mode, mode); - (void)printf(" %7"PRIu64" %*s", fst.fileid, nflg ? 5 : 10, mode); - switch (vn.v_type) { - case VBLK: - case VCHR: { - char *name; - - if (nflg || ((name = devname(fst.rdev, vn.v_type == VCHR ? - S_IFCHR : S_IFBLK)) == NULL)) - (void)printf(" %s,%-2llu", - kdriver_search(vn.v_type, major(fst.rdev)), - (unsigned long long)minor(fst.rdev)); - else - (void)printf(" %6s", name); - break; - } - default: - (void)printf(" %6lld", (long long)fst.size); + (void)printf(" %8"PRIu64" %*s", fst.fileid, nflg ? 5 : 10, mode); + if (Oflg) { + oprint(fp, ""); + } else { + vprint(&vn, &fst); } rw[0] = '\0'; if (flag & FREAD) @@ -996,7 +1021,7 @@ at_addrstr(char *buf, size_t len, const } static void -socktrans(struct socket *sock, int i) +socktrans(struct file *f, struct socket *sock, int i) { static const char *stypename[] = { "unused", /* 0 */ @@ -1209,7 +1234,7 @@ again: lbuf); else if (so.so_pcb) printf(" %jx", (uintmax_t)(uintptr_t)so.so_pcb); - (void)printf("\n"); + oprint(f, "\n"); return; bad: (void)printf("* error\n"); @@ -1235,7 +1260,7 @@ ptrans(struct file *fp, struct pipe *cpi (fp->f_flag & FWRITE) ? "w" : "r", (fp->f_flag & FNONBLOCK) ? "n" : "", (cp.pipe_state & PIPE_ASYNC) ? "a" : ""); - (void)printf("\n"); + oprint(fp, "\n"); return; bad: (void)printf("* error\n"); Index: src/usr.bin/fstat/fstat.h diff -u src/usr.bin/fstat/fstat.h:1.9 src/usr.bin/fstat/fstat.h:1.10 --- src/usr.bin/fstat/fstat.h:1.9 Sun Apr 12 02:36:12 2009 +++ src/usr.bin/fstat/fstat.h Fri Sep 6 13:08:22 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fstat.h,v 1.9 2009/04/12 06:36:12 lukem Exp $ */ +/* $NetBSD: fstat.h,v 1.10 2019/09/06 17:08:22 christos Exp $ */ /*- * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. @@ -60,3 +60,4 @@ int isofs_filestat(struct vnode *, struc int ntfs_filestat(struct vnode *, struct filestat *); int ptyfs_filestat(struct vnode *, struct filestat *); int tmpfs_filestat(struct vnode *, struct filestat *); +void oprint(struct file *, const char *); Index: src/usr.bin/fstat/misc.c diff -u src/usr.bin/fstat/misc.c:1.21 src/usr.bin/fstat/misc.c:1.22 --- src/usr.bin/fstat/misc.c:1.21 Sat Feb 2 22:20:24 2019 +++ src/usr.bin/fstat/misc.c Fri Sep 6 13:08:22 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: misc.c,v 1.21 2019/02/03 03:20:24 thorpej Exp $ */ +/* $NetBSD: misc.c,v 1.22 2019/09/06 17:08:22 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: misc.c,v 1.21 2019/02/03 03:20:24 thorpej Exp $"); +__RCSID("$NetBSD: misc.c,v 1.22 2019/09/06 17:08:22 christos Exp $"); #include <stdbool.h> #include <sys/param.h> @@ -159,7 +159,7 @@ p_bpf(struct file *f) (void)printf(", waiting"); else if (bpf.bd_state == BPF_TIMED_OUT) (void)printf(", timeout"); - (void)printf("\n"); + oprint(f, "\n"); return 0; } @@ -183,11 +183,12 @@ p_sem(struct file *f) ks.ks_name, Pid); } else { buf[ks.ks_namelen] = '\0'; - (void)printf(", name=%s\n", buf); + (void)printf(", name=%s", buf); + oprint(f, "\n"); return 0; } } - (void)printf("\n"); + oprint(f, "\n"); return 0; } @@ -200,7 +201,8 @@ p_mqueue(struct file *f) dprintf("can't read mqueue at %p for pid %d", f->f_data, Pid); return 0; } - (void)printf("* mqueue \"%s\"\n", mq.mq_name); + (void)printf("* mqueue \"%s\"", mq.mq_name); + oprint(f, "\n"); return 0; } @@ -228,7 +230,8 @@ p_rnd(struct file *f) return 0; } snprintb(buf, sizeof(buf), CPRNG_FMT, str.cs_flags); - (void)printf("* rnd \"%s\" flags %s\n", str.cs_name, buf); + (void)printf("* rnd \"%s\" flags %s", str.cs_name, buf); + oprint(f, "\n"); return 0; } @@ -241,7 +244,8 @@ p_kqueue(struct file *f) dprintf("can't read kqueue at %p for pid %d", f->f_data, Pid); return 0; } - (void)printf("* kqueue pending %d\n", kq.kq_count); + (void)printf("* kqueue pending %d", kq.kq_count); + oprint(f, "\n"); return 0; } @@ -281,22 +285,24 @@ pmisc(struct file *f, const char *name) case NL_SEM: return p_sem(f); case NL_TAP: - printf("* tap %lu\n", (unsigned long)(intptr_t)f->f_data); - return 0; + printf("* tap %lu", (unsigned long)(intptr_t)f->f_data); + break; case NL_CRYPTO: - printf("* crypto %p\n", f->f_data); - return 0; + printf("* crypto %p", f->f_data); + break; case NL_AUDIO: - printf("* audio %p\n", f->f_data); - return 0; + printf("* audio %p", f->f_data); + break; case NL_PAD: - printf("* pad %p\n", f->f_data); - return 0; + printf("* pad %p", f->f_data); + break; case NL_MAX: - printf("* %s ops=%p %p\n", name, f->f_ops, f->f_data); - return 0; + printf("* %s ops=%p %p", name, f->f_ops, f->f_data); + break; default: - printf("* %s %p\n", nl[i].n_name, f->f_data); - return 0; + printf("* %s %p", nl[i].n_name, f->f_data); + break; } + oprint(f, "\n"); + return 0; }