From owner-freebsd-hackers@FreeBSD.ORG Sun Apr 24 13:31:53 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 1233) id BBD31106566B; Sun, 24 Apr 2011 13:31:53 +0000 (UTC) Date: Sun, 24 Apr 2011 13:31:53 +0000 From: Alexander Best To: freebsd-hackers@freebsd.org Message-ID: <20110424133153.GA16850@freebsd.org> References: <20110424132037.GA14286@freebsd.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110424132037.GA14286@freebsd.org> Subject: Re: [RFC] a few kldstat(8) improvements X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Apr 2011 13:31:53 -0000 On Sun Apr 24 11, Alexander Best wrote: > hi there, > > i hacked up kldstat(8) a bit. just wanted to hear what people think of it. the > changes are as follows: > > - make -i , -m and -n flags mutually exclusive > - when iterating through kernel files and kernel modules, don't bail out when > an error occurs, but hand down the error via "int error" > - improve handling of -q and -v flags and call usage() when used improperly > - use errx(3) and warnx(3) rather than err(3) and warn(3) in order to keep > stderr at a sensible user information level > - adjust white space handling in order to improve formating > - a few kldstat(8) man page improvements > > cheers. > alex > > -- > a13x > diff --git a/sbin/kldstat/kldstat.8 b/sbin/kldstat/kldstat.8 > index 6f040e2..10b8fd5 100644 > --- a/sbin/kldstat/kldstat.8 > +++ b/sbin/kldstat/kldstat.8 > @@ -25,7 +25,7 @@ > .\" > .\" $FreeBSD$ > .\" > -.Dd September 23, 2005 > +.Dd April 24, 2011 > .Dt KLDSTAT 8 > .Os > .Sh NAME > @@ -35,10 +35,12 @@ > .Nm > .Op Fl v > .Op Fl i Ar id > -.Op Fl n Ar filename > .Nm > .Op Fl q > .Op Fl m Ar modname > +.Nm > +.Op Fl v > +.Op Fl n Ar filename > .Sh DESCRIPTION > The > .Nm > @@ -47,16 +49,17 @@ kernel. > .Pp > The following options are available: > .Bl -tag -width indentXX > -.It Fl v > -Be more verbose. > + ^^ my bad > .It Fl i Ar id > Display the status of only the file with this ID. > +.It Fl m Ar modname > +Display the status of only the module with this name. > .It Fl n Ar filename > -Display the status of only the file with this filename. > +Display the status of only the file with this name. > .It Fl q > -Only check if module is loaded or compiled into the kernel. > -.It Fl m Ar modname > -Display the status of only the module with this modname. > +Only check if the module is loaded or compiled into the kernel. > +.It Fl v > +Be more verbose. > .El > .Sh EXIT STATUS > .Ex -std > diff --git a/sbin/kldstat/kldstat.c b/sbin/kldstat/kldstat.c > index 575fca8..0b73f74 100644 > --- a/sbin/kldstat/kldstat.c > +++ b/sbin/kldstat/kldstat.c > @@ -39,38 +39,42 @@ __FBSDID("$FreeBSD$"); > #define POINTER_WIDTH ((int)(sizeof(void *) * 2 + 2)) > > static void > -printmod(int modid) > +printmod(int modid, int error) > { > struct module_stat stat; > > stat.version = sizeof(struct module_stat); > - if (modstat(modid, &stat) < 0) > - warn("can't stat module id %d", modid); > + if (modstat(modid, &stat) < 0) { > + warnx("can't stat module id %d", modid); > + error = 1; > + } > else > - printf("\t\t%2d %s\n", stat.id, stat.name); > + printf(" %-4d %s\n", stat.id, stat.name); > } > > static void > -printfile(int fileid, int verbose) > +printfile(int fileid, int verbose, int error) > { > struct kld_file_stat stat; > int modid; > > stat.version = sizeof(struct kld_file_stat); > - if (kldstat(fileid, &stat) < 0) > - err(1, "can't stat file id %d", fileid); > + if (kldstat(fileid, &stat) < 0) { > + warnx("can't stat file id %d", fileid); > + error = 1; > + } > else > - printf("%2d %4d %p %-8zx %s", > - stat.id, stat.refs, stat.address, stat.size, > + printf("%-3d %4d %p %-8zx %s", > + stat.id, stat.refs, stat.address, stat.size, > stat.name); > > if (verbose) { > printf(" (%s)\n", stat.pathname); > - printf("\tContains modules:\n"); > - printf("\t\tId Name\n"); > + printf(" Contains modules:\n"); > + printf(" Id Name\n"); > for (modid = kldfirstmod(fileid); modid > 0; > modid = modfnext(modid)) > - printmod(modid); > + printmod(modid, error); > } else > printf("\n"); > } > @@ -78,21 +82,20 @@ printfile(int fileid, int verbose) > static void > usage(void) > { > - fprintf(stderr, "usage: kldstat [-v] [-i id] [-n filename]\n"); > + fprintf(stderr, "usage: kldstat [-v] [-i id]\n"); > fprintf(stderr, " kldstat [-q] [-m modname]\n"); > + fprintf(stderr, " kldstat [-v] [-n filename]\n"); > exit(1); > } > > int > main(int argc, char** argv) > { > - int c; > - int verbose = 0; > - int fileid = 0; > - int quiet = 0; > - char* filename = NULL; > - char* modname = NULL; > - char* p; > + int c, error, fileid, quiet, verbose; > + char *filename, *modname, *p; > + > + error = fileid = quiet = verbose = 0; > + filename = modname = NULL; > > while ((c = getopt(argc, argv, "i:m:n:qv")) != -1) > switch (c) { > @@ -122,13 +125,21 @@ main(int argc, char** argv) > if (argc != 0) > usage(); > > + if ((*p == '\0' && modname != NULL) || (*p == '\0' && filename != NULL) || > + (modname != NULL && filename != NULL)) > + errx(1, "-i, -m and -n flags are mutually exclusive"); > + > + if ((*p == '\0' && quiet) || (modname != NULL && verbose) || > + (filename != NULL && quiet)) > + usage(); > + > if (modname != NULL) { > int modid; > struct module_stat stat; > > if ((modid = modfind(modname)) < 0) { > if (!quiet) > - warn("can't find module %s", modname); > + warnx("can't find module %s", modname); > return 1; > } else if (quiet) { > return 0; > @@ -136,10 +147,10 @@ main(int argc, char** argv) > > stat.version = sizeof(struct module_stat); > if (modstat(modid, &stat) < 0) > - warn("can't stat module id %d", modid); > + errx(1, "can't stat module id %d", modid); > else { > printf("Id Refs Name\n"); > - printf("%3d %4d %s\n", stat.id, stat.refs, stat.name); > + printf("%-3d %4d %s\n", stat.id, stat.refs, stat.name); > } > > return 0; > @@ -147,15 +158,15 @@ main(int argc, char** argv) > > if (filename != NULL) { > if ((fileid = kldfind(filename)) < 0) > - err(1, "can't find file %s", filename); > + errx(1, "can't find file %s", filename); > } > > - printf("Id Refs Address%*c Size Name\n", POINTER_WIDTH - 7, ' '); > + printf("Id Refs Address%*c Size Name\n", POINTER_WIDTH - 7, ' '); > if (fileid != 0) > - printfile(fileid, verbose); > + printfile(fileid, verbose, error); > else > for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) > - printfile(fileid, verbose); > + printfile(fileid, verbose, error); > > - return 0; > + return error; > } -- a13x