diff options
-rw-r--r-- | rules.d/80-drivers.rules | 2 | ||||
-rw-r--r-- | src/udev/udev-builtin-kmod.c | 26 |
2 files changed, 22 insertions, 6 deletions
diff --git a/rules.d/80-drivers.rules b/rules.d/80-drivers.rules index 57d69b8232..4bf942f3d7 100644 --- a/rules.d/80-drivers.rules +++ b/rules.d/80-drivers.rules @@ -2,7 +2,7 @@ ACTION!="add", GOTO="drivers_end" -ENV{MODALIAS}=="?*", RUN{builtin}+="kmod load '$env{MODALIAS}'" +ENV{MODALIAS}=="?*", RUN{builtin}+="kmod load" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN{builtin}+="kmod load tifm_sd" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN{builtin}+="kmod load tifm_ms" SUBSYSTEM=="memstick", RUN{builtin}+="kmod load ms_block mspro_block" diff --git a/src/udev/udev-builtin-kmod.c b/src/udev/udev-builtin-kmod.c index 0ba2d2bd13..eade042f35 100644 --- a/src/udev/udev-builtin-kmod.c +++ b/src/udev/udev-builtin-kmod.c @@ -10,8 +10,10 @@ #include <stdio.h> #include <stdlib.h> +#include "device-util.h" #include "module-util.h" #include "string-util.h" +#include "strv.h" #include "udev-builtin.h" static struct kmod_ctx *ctx = NULL; @@ -21,15 +23,29 @@ _printf_(6,0) static void udev_kmod_log(void *data, int priority, const char *fi } static int builtin_kmod(sd_device *dev, sd_netlink **rtnl, int argc, char *argv[], bool test) { + int r; + + assert(dev); + if (!ctx) return 0; - if (argc < 3 || !streq(argv[1], "load")) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: expected: load <module>…", argv[0]); + if (argc < 2 || !streq(argv[1], "load")) + return log_device_warning_errno(dev, SYNTHETIC_ERRNO(EINVAL), + "%s: expected: load [module…]", argv[0]); + + char **modules = strv_skip(argv, 2); + if (strv_isempty(modules)) { + const char *modalias; + + r = sd_device_get_property_value(dev, "MODALIAS", &modalias); + if (r < 0) + return log_device_warning_errno(dev, r, "Failed to read property \"MODALIAS\"."); - for (int i = 2; argv[i]; i++) - (void) module_load_and_warn(ctx, argv[i], false); + (void) module_load_and_warn(ctx, modalias, /* verbose = */ false); + } else + STRV_FOREACH(module, modules) + (void) module_load_and_warn(ctx, *module, /* verbose = */ false); return 0; } |