summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rules.d/80-drivers.rules2
-rw-r--r--src/udev/udev-builtin-kmod.c26
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;
}