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"
#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;
}
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;
}