On Wed, 24 Apr 2024 21:22:28 -0700
Adam Joseph <[email protected]> wrote:
> 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) {
Hi,
just out of curiosity what are you trying to achieve here?
To which directory you want to change? dirname or
&CONFIG_DEFAULT_MODULES_DIR[1]?
and why not xchdir(CONFIG_DEFAULT_MODULES_DIR) like later on in the code?
Also I would like to point out that if the first xchdir call fails the program
will exit
and the second will never be executed.
Ciao,
Tito
> + xchdir(dirname);
> + xchdir(&CONFIG_DEFAULT_MODULES_DIR[1]);
> + } else {
> + xchdir(CONFIG_DEFAULT_MODULES_DIR);
> + }
> +
> uname(&G.uts);
> xchdir(G.uts.release);
>
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox