kldload(8): Add -n for checking if a module is already loaded.
authorSascha Wildner <saw@online.de>
Wed, 12 Mar 2014 18:32:18 +0000 (19:32 +0100)
committerSascha Wildner <saw@online.de>
Wed, 12 Mar 2014 19:16:00 +0000 (20:16 +0100)
Also, give better error messages upon EEXISTS and ENOEXEC.

Taken-from: FreeBSD

sbin/kldload/kldload.8
sbin/kldload/kldload.c

index 587ea99..a6e2c18 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/sbin/kldload/kldload.8,v 1.7.2.10 2002/12/07 08:44:02 jmallett Exp $
 .\"
-.Dd September 2, 2008
+.Dd March 12, 2014
 .Dt KLDLOAD 8
 .Os
 .Sh NAME
@@ -33,7 +33,7 @@
 .Nd load a file into the kernel
 .Sh SYNOPSIS
 .Nm
-.Op Fl v
+.Op Fl nv
 .Ar
 .Sh DESCRIPTION
 The
@@ -44,8 +44,10 @@ into the kernel using the kernel linker.
 Note that if multiple modules are specified then an attempt will
 be made to load them all, even if some fail.
 .Pp
-The following option is available:
+The following options are available:
 .Bl -tag -width indent
+.It Fl n
+Do not try to load module if already loaded.
 .It Fl v
 Be more verbose.
 .El
index 2988b27..6706f57 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/linker.h>
 
 #include <err.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -37,7 +38,7 @@
 static void
 usage(void)
 {
-    fprintf(stderr, "usage: kldload [-v] file ...\n");
+    fprintf(stderr, "usage: kldload [-nv] file ...\n");
     exit(1);
 }
 
@@ -48,12 +49,17 @@ main(int argc, char **argv)
     int errors;
     int fileid;
     int verbose;
+    int check_loaded;
 
     errors = 0;
     verbose = 0;
+    check_loaded = 0;
 
-    while ((c = getopt(argc, argv, "v")) != -1)
+    while ((c = getopt(argc, argv, "nv")) != -1)
        switch (c) {
+       case 'n':
+           check_loaded = 1;
+           break;
        case 'v':
            verbose = 1;
            break;
@@ -69,11 +75,29 @@ main(int argc, char **argv)
     while (argc-- != 0) {
        fileid = kldload(argv[0]);
        if (fileid < 0) {
-           warn("can't load %s", argv[0]);
-           errors++;
-       } else
+           if (check_loaded != 0 && errno == EEXIST) {
+               if (verbose)
+                   printf("%s is already loaded\n", argv[0]);
+           } else {
+               switch (errno) {
+               case EEXIST:
+                   warnx("can't load %s: module already loaded or "
+                       "in kernel", argv[0]);
+                   break;
+               case ENOEXEC:
+                   warnx("an error occurred while loading the module. "
+                       "Please check dmesg(8) for more details.");
+                   break;
+               default:
+                   warn("can't load %s", argv[0]);
+                   break;
+               }
+               errors++;
+           }
+       } else {
            if (verbose)
                printf("Loaded %s, id=%d\n", argv[0], fileid);
+       }
        argv++;
     }