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.
+
 .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;
 }
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to