From owner-freebsd-hackers@FreeBSD.ORG Sun Apr 24 13:20:37 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 1233) id 5A5E31065670; Sun, 24 Apr 2011 13:20:37 +0000 (UTC) Date: Sun, 24 Apr 2011 13:20:37 +0000 From: Alexander Best To: freebsd-hackers@freebsd.org Message-ID: <20110424132037.GA14286@freebsd.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="jI8keyz6grp/JLjh" Content-Disposition: inline Subject: [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:20:37 -0000 --jI8keyz6grp/JLjh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --jI8keyz6grp/JLjh Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="kldstat.diff" 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. + .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; } --jI8keyz6grp/JLjh--