Re: [PATCH] modprobe: implement -d DIR flag like the modprobe in kmod

2024-04-25 Thread tito
On Thu, 25 Apr 2024 09:13:09 +0200
tito  wrote:

> On Wed, 24 Apr 2024 21:22:28 -0700
> Adam Joseph  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

Hi again, I see now what this is about something like:

if (opt & OPT_DIRNAME) {
xchdir(dirname);
/* remove first / */
CONFIG_DEFAULT_MODULES_DIR+=1;
}
xchdir(CONFIG_DEFAULT_MODULES_DIR);

This spares a xchdir call and from my point of view
makes it easier to understand.

Sorry for the noise.

Ciao,
Tito


> 
> > +   xchdir(dirname);
> > +   xchdir(&CONFIG_DEFAULT_MODULES_DIR[1]);
> 
> 
> > 

Re: [PATCH] modprobe: implement -d DIR flag like the modprobe in kmod

2024-04-25 Thread tito
On Wed, 24 Apr 2024 21:22:28 -0700
Adam Joseph  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


[PATCH] modprobe: implement -d DIR flag like the modprobe in kmod

2024-04-24 Thread Adam Joseph
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