[RFC] a few kldstat(8) improvements
Alexander Best
arundel at freebsd.org
Sun Apr 24 13:31:53 UTC 2011
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
More information about the freebsd-hackers
mailing list