Browse Source

dracut-install: install kernel modules to /lib/modules/$kernelversion

Specifying a different kernel module directory with --kmoddir would
result in the same directory being the destination directory.

Strip everything before the "/lib/modules" for the destination dir.

https://github.com/dracutdevs/dracut/issues/194
master
Harald Hoyer 8 years ago
parent
commit
be5025bf55
  1. 21
      install/dracut-install.c

21
install/dracut-install.c

@ -59,6 +59,7 @@ static bool arg_resolvedeps = false;
static bool arg_hostonly = false; static bool arg_hostonly = false;
static char *destrootdir = NULL; static char *destrootdir = NULL;
static char *kerneldir = NULL; static char *kerneldir = NULL;
static size_t kerneldirlen = 0;
static char **firmwaredirs = NULL; static char **firmwaredirs = NULL;
static char **pathdirs; static char **pathdirs;
static char *logdir = NULL; static char *logdir = NULL;
@ -910,6 +911,13 @@ static int parse_argv(int argc, char *argv[])
break; break;
case ARG_KERNELDIR: case ARG_KERNELDIR:
kerneldir = strdup(optarg); kerneldir = strdup(optarg);
if ((strncmp("/lib/modules/", kerneldir, 13) != 0)
&& (strncmp("/usr/lib/modules/", kerneldir, 17) != 0)) {
char *p;
p = strstr(kerneldir, "/lib/modules/");
if (p != NULL)
kerneldirlen = p - kerneldir;
}
break; break;
case ARG_FIRMWAREDIRS: case ARG_FIRMWAREDIRS:
firmwaredirs = strv_split(optarg, ":"); firmwaredirs = strv_split(optarg, ":");
@ -1241,8 +1249,9 @@ static int install_module(struct kmod_module *mod)
return 1; return 1;
} }


log_debug("dracut_install '%s'", path); log_debug("dracut_install '%s' '%s'", path, &path[kerneldirlen]);
ret = dracut_install(path, path, false, false, true);
ret = dracut_install(path, &path[kerneldirlen], false, false, true);
if (ret == 0) { if (ret == 0) {
log_debug("dracut_install '%s' OK", kmod_module_get_name(mod)); log_debug("dracut_install '%s' OK", kmod_module_get_name(mod));
} else if (!arg_optional) { } else if (!arg_optional) {
@ -1256,17 +1265,18 @@ static int install_module(struct kmod_module *mod)
kmod_list_foreach(itr, modlist) { kmod_list_foreach(itr, modlist) {
mod = kmod_module_get_module(itr); mod = kmod_module_get_module(itr);
path = kmod_module_get_path(mod); path = kmod_module_get_path(mod);

name = kmod_module_get_name(mod); name = kmod_module_get_name(mod);
if (arg_mod_filter_noname && (regexec(&mod_filter_noname, name, 0, NULL, 0) == 0)) { if (arg_mod_filter_noname && (regexec(&mod_filter_noname, name, 0, NULL, 0) == 0)) {
kmod_module_unref(mod); kmod_module_unref(mod);
continue; continue;
} }
ret = dracut_install(path, path, false, false, true); ret = dracut_install(path, &path[kerneldirlen], false, false, true);
if (ret == 0) { if (ret == 0) {
log_debug("dracut_install '%s' OK", kmod_module_get_name(mod)); log_debug("dracut_install '%s' '%s' OK", path, &path[kerneldirlen]);
install_firmware(mod); install_firmware(mod);
} else { } else {
log_error("dracut_install '%s' ERROR", kmod_module_get_name(mod)); log_error("dracut_install '%s' '%s' ERROR", path, &path[kerneldirlen]);
} }
kmod_module_unref(mod); kmod_module_unref(mod);
} }
@ -1287,7 +1297,6 @@ static int install_modules(int argc, char **argv)
int i; int i;


ctx = kmod_new(kerneldir, NULL); ctx = kmod_new(kerneldir, NULL);

if (arg_hostonly) { if (arg_hostonly) {
err = kmod_module_new_from_loaded(ctx, &loaded_list); err = kmod_module_new_from_loaded(ctx, &loaded_list);
if (err < 0) { if (err < 0) {

Loading…
Cancel
Save