diff --git a/Makefile.am b/Makefile.am index 213a1fe6..e27f366b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,6 +32,7 @@ AM_CPPFLAGS = \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDISTCONFDIR=\""$(distconfdir)"\" \ -DMODULE_DIRECTORY=\""$(module_directory)"\" \ + -DMODULE_FALLBACK_DIRECTORY=\""$(module_fallback_directory)"\" \ ${zlib_CFLAGS} AM_CFLAGS = $(OUR_CFLAGS) @@ -196,7 +197,7 @@ MODULE_PLAYGROUND = testsuite/module-playground BUILD_MODULES = $(AM_V_GEN) $(top_srcdir)/scripts/setup-modules.sh $(top_srcdir) $(top_builddir) $(MODULE_PLAYGROUND) ROOTFS = testsuite/rootfs ROOTFS_PRISTINE = $(top_srcdir)/testsuite/rootfs-pristine -CREATE_ROOTFS = $(AM_V_GEN) $(top_srcdir)/scripts/setup-rootfs.sh $(ROOTFS_PRISTINE) $(ROOTFS) $(MODULE_PLAYGROUND) $(top_builddir)/config.h $(sysconfdir) $(module_directory) +CREATE_ROOTFS = $(AM_V_GEN) $(top_srcdir)/scripts/setup-rootfs.sh $(ROOTFS_PRISTINE) $(ROOTFS) $(MODULE_PLAYGROUND) $(top_builddir)/config.h $(sysconfdir) $(module_directory) $(module_fallback_directory) build-module-playground: $(BUILD_MODULES) diff --git a/configure.ac b/configure.ac index c204570d..b62882f1 100644 --- a/configure.ac +++ b/configure.ac @@ -85,8 +85,13 @@ AC_ARG_WITH([module_directory], [], [with_module_directory=/lib/modules]) AC_SUBST([module_directory], [$with_module_directory]) +AC_ARG_WITH([module_fallback_directory], + AS_HELP_STRING([--with-module-fallback_directory=DIR], [alternative directory in which to look for kernel modules @<:@default=/run/modules@:>@]), + [], [with_module_fallback_directory=/run/modules]) +AC_SUBST([module_fallback_directory], [$with_module_fallback_directory]) + # Check all directory arguments for consistency. -for ac_var in distconfdir module_directory +for ac_var in distconfdir module_directory module_fallback_directory do eval ac_val=\$$ac_var # Remove trailing slashes. diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index d1e5a82c..4ebd4f35 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -164,6 +164,7 @@ static int log_priority(const char *priority) } static const char *dirname_default_prefix = MODULE_DIRECTORY; +static const char *dirname_fallback_prefix = MODULE_FALLBACK_DIRECTORY; static char *get_kernel_release(const char *dirname) { @@ -179,6 +180,13 @@ static char *get_kernel_release(const char *dirname) if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) return NULL; + /* If main path doesn't exist, try fallback */ + if (is_dir(p) <= 0) { + free(p); + if (asprintf(&p, "%s/%s", dirname_fallback_prefix, u.release) < 0) + return NULL; + } + return p; } diff --git a/man/Makefile.am b/man/Makefile.am index 6356d878..2f9fa6ee 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -18,6 +18,7 @@ define generate_manpage sed -e 's|@SYSCONFDIR@|$(sysconfdir)|g' | \ sed -e 's|@DISTCONFDIR@|$(distconfdir)|g' | \ sed -e 's|@MODULE_DIRECTORY@|$(module_directory)|g' | \ + sed -e 's|@MODULE_FALLBACK_DIRECTORY@|$(module_fallback_directory)|g' | \ $(SCDOC) > $@ endef diff --git a/meson.build b/meson.build index 1c87fe0e..7b199ba8 100644 --- a/meson.build +++ b/meson.build @@ -191,6 +191,12 @@ if moduledir == '' endif cdata.set_quoted('MODULE_DIRECTORY', moduledir) +moduledir = get_option('modulefallbackdir') +if moduledir == '' + moduledir = '/run/modules' +endif +cdata.set_quoted('MODULE_FALLBACK_DIRECTORY', moduledir) + _completiondirs = [ ['bashcompletiondir', 'bash-completion', 'bash-completion/completions', 'shell-completion/bash/@0@'], ['fishcompletiondir', 'fish', 'fish/vendor_functions.d', 'shell-completion/fish/@0@.fish'], diff --git a/meson_options.txt b/meson_options.txt index 4a25fb0e..9b5e341b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,6 +12,12 @@ option( description : 'Directory to look for kernel modules. Default: /lib/modules', ) +option( + 'modulefallbackdir', + type : 'string', + description : 'Alternative directory to look for kernel modules. Default: /run/modules', +) + option( 'bashcompletiondir', type : 'string', diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 92c5d2dd..f6b47fc7 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -8,6 +8,7 @@ MODULE_PLAYGROUND=$3 CONFIG_H=$4 SYSCONFDIR=$5 MODULE_DIRECTORY=$6 +MODULE_FALLBACK_DIRECTORY=$7 ANOTHER_MODULE_DIRECTORY=/foobar # create rootfs from rootfs-pristine @@ -98,6 +99,8 @@ map=( ["test-modprobe/external/lib/modules/external/"]="mod-simple.ko" ["test-modprobe/module-from-abspath/home/foo/"]="mod-simple.ko" ["test-modprobe/module-from-relpath/home/foo/"]="mod-simple.ko" + ["test-modprobe/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modprobe/fallback-custom$MODULE_FALLBACK_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/block/cciss.ko"]="mod-fake-cciss.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/hpsa.ko"]="mod-fake-hpsa.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/scsi_mod.ko"]="mod-fake-scsi-mod.ko" @@ -111,6 +114,8 @@ map=( ["test-modinfo/mod-simple-sha256.ko"]="mod-simple.ko" ["test-modinfo/mod-simple-pkcs7.ko"]="mod-simple.ko" ["test-modinfo/external/lib/modules/external/mod-simple.ko"]="mod-simple.ko" + ["test-modinfo/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modinfo/fallback-custom$MODULE_FALLBACK_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-a.ko"]="mod-loop-a.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-b.ko"]="mod-loop-b.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" diff --git a/shared/util.c b/shared/util.c index 5102879f..1cd7fc81 100644 --- a/shared/util.c +++ b/shared/util.c @@ -377,7 +377,7 @@ char *path_make_absolute_cwd(const char *p) return r; } -static inline int is_dir(const char *path) +int is_dir(const char *path) { struct stat st; diff --git a/shared/util.h b/shared/util.h index bcd834e5..3e0ece32 100644 --- a/shared/util.h +++ b/shared/util.h @@ -44,6 +44,7 @@ _nonnull_(1) char *freadline_wrapped(FILE *fp, unsigned int *linenum); /* path handling functions */ /* ************************************************************************ */ _must_check_ _nonnull_all_ char *path_make_absolute_cwd(const char *p); +int is_dir(const char *path); int mkdir_p(const char *path, int len, mode_t mode); int mkdir_parents(const char *path, mode_t mode); unsigned long long stat_mstamp(const struct stat *st); diff --git a/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt b/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt new file mode 100644 index 00000000..92d85ff0 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt @@ -0,0 +1 @@ +/run/modules/3.3.3/kernel/mod-simple.ko diff --git a/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt b/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt new file mode 100644 index 00000000..30d00414 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt @@ -0,0 +1 @@ +/run/modules/4.4.4/kernel/mod-simple.ko diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/proc/modules b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin new file mode 100644 index 00000000..b09a8543 Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/proc/modules b/testsuite/rootfs-pristine/test-modinfo/fallback/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin new file mode 100644 index 00000000..b09a8543 Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/proc/modules b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin new file mode 100644 index 00000000..b09a8543 Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/proc/modules b/testsuite/rootfs-pristine/test-modprobe/fallback/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin new file mode 100644 index 00000000..b09a8543 Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin differ diff --git a/testsuite/test-modinfo.c b/testsuite/test-modinfo.c index a8e8e552..f4c5b4b4 100644 --- a/testsuite/test-modinfo.c +++ b/testsuite/test-modinfo.c @@ -124,4 +124,53 @@ DEFINE_TEST(test_modinfo_builtin, .out = TESTSUITE_ROOTFS "test-modinfo/correct-builtin.txt", }) +static noreturn int test_modinfo_fallback(const struct test *t) +{ + const char *const args[] = { + // clang-format off + progname, + "-F", "filename", + "mod-simple", + NULL, + // clang-format on + }; + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(test_modinfo_fallback, + .description = "check if modinfo finds external module", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/fallback", + [TC_UNAME_R] = "4.4.4", + }, + .output = { + .out = TESTSUITE_ROOTFS "test-modinfo/correct-fallback.txt", + }) + +static noreturn int test_modinfo_fallback_custom(const struct test *t) +{ + const char *const args[] = { + // clang-format off + progname, + "-F", "filename", + "--set-version", + "3.3.3", + "mod-simple", + NULL, + // clang-format on + }; + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(test_modinfo_fallback_custom, + .description = "check if modinfo finds external module", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/fallback-custom", + [TC_UNAME_R] = "4.4.4", + }, + .output = { + .out = TESTSUITE_ROOTFS "test-modinfo/correct-fallback-custom.txt", + }) + + TESTSUITE_MAIN(); diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index cbdd9c75..d36ede9b 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -484,4 +484,51 @@ DEFINE_TEST(modprobe_module_from_relpath, .modules_loaded = "mod-simple", ); +static noreturn int modprobe_fallback(const struct test *t) +{ + const char *progname = TOOLS_DIR "/modprobe"; + const char *const args[] = { + progname, + "mod-simple", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_fallback, + .description = "check modprobe able to load module from fallback path", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/fallback", + [TC_INIT_MODULE_RETCODES] = "", + }, + .need_spawn = true, + .modules_loaded = "mod-simple", + ); + +static noreturn int modprobe_fallback_custom(const struct test *t) +{ + const char *progname = TOOLS_DIR "/modprobe"; + const char *const args[] = { + progname, + "--set-version", + "3.3.3", + "mod-simple", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_fallback_custom, + .description = "check modprobe able to load module from fallback path with --set-version", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/fallback-custom", + [TC_INIT_MODULE_RETCODES] = "", + }, + .need_spawn = true, + .modules_loaded = "mod-simple", + ); + TESTSUITE_MAIN(); diff --git a/tools/modinfo.c b/tools/modinfo.c index f1323c50..cc0fd538 100644 --- a/tools/modinfo.c +++ b/tools/modinfo.c @@ -443,6 +443,17 @@ static int do_modinfo(int argc, char *argv[]) root, kversion); return EXIT_FAILURE; } + + if (is_dir(dirname_buf) <= 0) { + n = snprintf(dirname_buf, sizeof(dirname_buf), + "%s" MODULE_FALLBACK_DIRECTORY "/%s", root, kversion); + if (n >= (int)sizeof(dirname_buf)) { + ERR("bad directory %s" MODULE_FALLBACK_DIRECTORY "/%s: path too long\n", + root, kversion); + return EXIT_FAILURE; + } + } + dirname = dirname_buf; } diff --git a/tools/modprobe.c b/tools/modprobe.c index 26b252c5..f027c01f 100644 --- a/tools/modprobe.c +++ b/tools/modprobe.c @@ -983,6 +983,18 @@ static int do_modprobe(int argc, char **orig_argv) err = -1; goto done; } + + if (is_dir(dirname_buf) <= 0) { + n = snprintf(dirname_buf, sizeof(dirname_buf), + "%s" MODULE_FALLBACK_DIRECTORY "/%s", root, kversion); + if (n >= (int)sizeof(dirname_buf)) { + ERR("bad directory %s" MODULE_FALLBACK_DIRECTORY "/%s: path too long\n", + root, kversion); + err = -1; + goto done; + } + } + dirname = dirname_buf; }