[PATCH] modutils: fix config options dependency (2)

Kang-Che Sung explorer09 at gmail.com
Wed Feb 1 09:22:43 UTC 2017


- The modprobe-small implementation of rmmod no longer chdir's to
  "/lib/modules/`uname -r`" as it was not necessary for rmmod's
  operation. (And it no longer need to die if such modules directory
  doesn't exist.)
- Configs DEFAULT_MODULES_DIR and DEFAULT_DEPMOD_FILE no longer depend
  on MODPROBE_SMALL as the latter may not enable depmod or modprobe
  that requires these configs.
- Clarify DEFAULT_DEPMOD_FILE's description regarding the ".bb" name
  suffix.

Signed-off-by: Kang-Che Sung <explorer09 at gmail.com>
---
 modutils/Config.src       | 10 +++++++---
 modutils/modprobe-small.c | 36 +++++++++++++++++++++++++++++++-----
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/modutils/Config.src b/modutils/Config.src
index a15cce518..d0bae2ea3 100644
--- a/modutils/Config.src
+++ b/modutils/Config.src
@@ -159,7 +159,7 @@ config FEATURE_MODUTILS_SYMBOLS
 config DEFAULT_MODULES_DIR
 	string "Default directory containing modules"
 	default "/lib/modules"
-	depends on DEPMOD || MODPROBE || MODPROBE_SMALL || MODINFO
+	depends on DEPMOD || MODPROBE || MODINFO
 	help
 	  Directory that contains kernel modules.
 	  Defaults to "/lib/modules"
@@ -167,9 +167,13 @@ config DEFAULT_MODULES_DIR
 config DEFAULT_DEPMOD_FILE
 	string "Default name of modules.dep"
 	default "modules.dep"
-	depends on DEPMOD || MODPROBE || MODPROBE_SMALL || MODINFO
+	depends on DEPMOD || MODPROBE || MODINFO
 	help
 	  Filename that contains kernel modules dependencies.
-	  Defaults to "modules.dep"
+	  Defaults to "modules.dep".
+	  If you configured the "simplified modutils" (MODPROBE_SMALL), a
+	  ".bb" suffix will be added after this name. Do not specify ".bb"
+	  here unless you intend your depmod or modprobe to work on
+	  "modules.dep.bb.bb" or such.
 
 endmenu
diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c
index 04242634b..a3ba846a7 100644
--- a/modutils/modprobe-small.c
+++ b/modutils/modprobe-small.c
@@ -84,6 +84,22 @@ int lsmod_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 #define is_insmod   (ENABLE_INSMOD   && (ONLY_APPLET || applet_name[0] == 'i'))
 #define is_rmmod    (ENABLE_RMMOD    && (ONLY_APPLET || applet_name[0] == 'r'))
 
+/* Applets that need to chdir to /lib/modules/`uname -r` */
+/* Note: the last conditional is used when all 4 applets are configured, and
+ * employs an ASCII trick so that one check would suffice:
+ * 'm' -> 01101101
+ * 'd' -> 01100100
+ * 'i' -> 01101001
+ * 'r' -> 01110010    ('d' & 'm' & '\x1f') == '\x04' -> 00000100
+ *        .....^.. note this bit! */
+#define is_depmod_or_modprobe ((ENABLE_MODPROBE || ENABLE_DEPMOD) \
+	&& ((!ENABLE_INSMOD && !ENABLE_RMMOD) \
+	|| (!ENABLE_MODPROBE && applet_name[0] == 'd') \
+	|| (!ENABLE_DEPMOD   && applet_name[0] == 'm') \
+	|| (!ENABLE_INSMOD   && applet_name[0] != 'r') \
+	|| (!ENABLE_RMMOD    && applet_name[0] != 'i') \
+	|| ((applet_name[0] & ('d' & 'm' & '\x1f')) != 0)))
+
 enum {
 	OPT_q = (1 << 0), /* be quiet */
 	OPT_r = (1 << 1), /* module removal instead of loading */
@@ -923,23 +939,30 @@ The following options are useful for people managing distributions:
 int modprobe_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int modprobe_main(int argc UNUSED_PARAM, char **argv)
 {
+#if ENABLE_DEPMOD || ENABLE_MODPROBE
+	struct utsname uts;
+#endif
 #if ENABLE_MODPROBE || ENABLE_INSMOD || ENABLE_RMMOD
 	int exitcode;
+# if ENABLE_FEATURE_CMDLINE_MODULE_OPTIONS
+	char *options = NULL;
+# endif
 #endif
-	struct utsname uts;
-	IF_FEATURE_CMDLINE_MODULE_OPTIONS(char *options = NULL;)
 
 	INIT_G();
 
 	/* Prevent ugly corner cases with no modules at all */
 	modinfo = xzalloc(sizeof(modinfo[0]));
 
-	if (!is_insmod) {
+#if ENABLE_DEPMOD || ENABLE_MODPROBE
+	if (is_depmod_or_modprobe) {
 		/* Goto modules directory */
 		xchdir(CONFIG_DEFAULT_MODULES_DIR);
+		uname(&uts); /* never fails */
 	}
-	uname(&uts); /* never fails */
+#endif
 
+#if ENABLE_DEPMOD
 	/* depmod? */
 	if (is_depmod) {
 		/* Supported:
@@ -971,6 +994,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 		process_module((char*)"/", NULL);
 		return !wrote_dep_bb_ok;
 	}
+#endif /* DEPMOD */
 
 #if ENABLE_MODPROBE || ENABLE_INSMOD || ENABLE_RMMOD
 	/* modprobe, insmod, rmmod require at least one argument */
@@ -980,10 +1004,12 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 	getopt32(argv, "qrfsvwb");
 	argv += optind;
 
-	if (!is_insmod) {
+# if ENABLE_MODPROBE
+	if (is_modprobe) {
 		/* Goto $VERSION directory */
 		xchdir(uts.release);
 	}
+# endif
 
 	/* are we rmmod? -> simulate modprobe -r, but don't bother the flag if
 	 * there're no other applets here */
-- 
2.11.0



More information about the busybox mailing list