This patch implements support for the `-d DIR` flag, like kmod has.  When
provided, `DIR` is a directory *beneath which* modprobe will expect to find
$CONFIG_DEFAULT_MODULES_DIR/$(uname -r) (e.g. lib/modules/$(uname -r)).

This is required on nixpkgs-based systems, which do not normally have a
/lib/modules directory.  Instead, a symbolic link at some ephemeral location
in /run points to the proper location.  For example, with mdevd instead of
systemd and the following in mdev.conf:

mdevd-conf = ''
...
$MODALIAS=.* root:root 660 @${pkgs.busybox}/bin/modprobe -d 
/run/booted-system/kernel-modules -b "$MODALIAS"
...
'';

Compared to setting CONFIG_DEFAULT_MODULES_DIR, a command line flag is
preferable since it allows the same busybox binary to be used both in early
userspace (where the initrd layout often follows FHS and uses /lib/modules) as
well as after switch_root.
---
 modutils/modprobe.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index 543f53e99..d3690ebc1 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -114,6 +114,7 @@
 //usage:       " MODULE" IF_FEATURE_CMDLINE_MODULE_OPTIONS(" 
[SYMBOL=VALUE]...")
 //usage:#define modprobe_full_usage "\n\n"
 //usage:       "       -a      Load multiple MODULEs"
+//usage:     "\n       -d DIR  Use DIR as filesystem root"
 //usage:     "\n       -l      List (MODULE is a pattern)"
 //usage:     "\n       -r      Remove MODULE (stacks) or do autoclean"
 //usage:     "\n       -q      Quiet"
@@ -130,7 +131,7 @@
  * Note2: -b is always accepted, but if !FEATURE_MODPROBE_BLACKLIST,
  * it is a no-op.
  */
-#define MODPROBE_OPTS  "alrDb"
+#define MODPROBE_OPTS  "ad:lrDb"
 /* -a and -D _are_ in fact compatible */
 #define MODPROBE_COMPLEMENTARY "q-v:v-q:l--arD:r--alD:a--lr:D--rl"
 //#define MODPROBE_OPTS  "acd:lnrt:C:b"
@@ -138,20 +139,21 @@
 enum {
        OPT_INSERT_ALL   = (INSMOD_OPT_UNUSED << 0), /* a */
        //OPT_DUMP_ONLY  = (INSMOD_OPT_UNUSED << x), /* c */
-       //OPT_DIRNAME    = (INSMOD_OPT_UNUSED << x), /* d */
-       OPT_LIST_ONLY    = (INSMOD_OPT_UNUSED << 1), /* l */
+       OPT_DIRNAME      = (INSMOD_OPT_UNUSED << 1), /* d */
+       OPT_LIST_ONLY    = (INSMOD_OPT_UNUSED << 2), /* l */
        //OPT_SHOW_ONLY  = (INSMOD_OPT_UNUSED << x), /* n */
-       OPT_REMOVE       = (INSMOD_OPT_UNUSED << 2), /* r */
+       OPT_REMOVE       = (INSMOD_OPT_UNUSED << 3), /* r */
        //OPT_RESTRICT   = (INSMOD_OPT_UNUSED << x), /* t */
        //OPT_VERONLY    = (INSMOD_OPT_UNUSED << x), /* V */
        //OPT_CONFIGFILE = (INSMOD_OPT_UNUSED << x), /* C */
-       OPT_SHOW_DEPS    = (INSMOD_OPT_UNUSED << 3), /* D */
-       OPT_BLACKLIST    = (INSMOD_OPT_UNUSED << 4) * 
ENABLE_FEATURE_MODPROBE_BLACKLIST,
+       OPT_SHOW_DEPS    = (INSMOD_OPT_UNUSED << 4), /* D */
+       OPT_BLACKLIST    = (INSMOD_OPT_UNUSED << 5) * 
ENABLE_FEATURE_MODPROBE_BLACKLIST,
 };
 #if ENABLE_LONG_OPTS
 static const char modprobe_longopts[] ALIGN1 =
        /* nobody asked for long opts (yet) */
        // "all\0"          No_argument "a"
+       // "dirname\0"      required_argument "d"
        // "list\0"         No_argument "l"
        // "remove\0"       No_argument "r"
        // "quiet\0"        No_argument "q"
@@ -559,17 +561,25 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
        int rc;
        unsigned opt;
        struct module_entry *me;
+       const char* dirname;
 
        INIT_G();
 
        opt = getopt32long(argv, "^" INSMOD_OPTS MODPROBE_OPTS "\0" 
MODPROBE_COMPLEMENTARY,
                        modprobe_longopts
                        INSMOD_ARGS
+                       , &dirname
        );
        argv += optind;
 
        /* Goto modules location */
-       xchdir(CONFIG_DEFAULT_MODULES_DIR);
+       if (opt & OPT_DIRNAME) {
+               xchdir(dirname);
+               xchdir(&CONFIG_DEFAULT_MODULES_DIR[1]);
+       } else {
+               xchdir(CONFIG_DEFAULT_MODULES_DIR);
+       }
+
        uname(&G.uts);
        xchdir(G.uts.release);
 
-- 
2.44.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to