udev: support ENV{}=="" global property matches
This commit is contained in:
parent
41b848b0ea
commit
adeba5008e
|
@ -149,8 +149,14 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
udev_event_execute_rules(event, 3 * USEC_PER_SEC, USEC_PER_SEC, rules, &sigmask_orig);
|
udev_event_execute_rules(event,
|
||||||
udev_event_execute_run(event, 3 * USEC_PER_SEC, USEC_PER_SEC, NULL);
|
3 * USEC_PER_SEC, USEC_PER_SEC,
|
||||||
|
NULL,
|
||||||
|
rules,
|
||||||
|
&sigmask_orig);
|
||||||
|
udev_event_execute_run(event,
|
||||||
|
3 * USEC_PER_SEC, USEC_PER_SEC,
|
||||||
|
NULL);
|
||||||
out:
|
out:
|
||||||
if (event != NULL && event->fd_signal >= 0)
|
if (event != NULL && event->fd_signal >= 0)
|
||||||
close(event->fd_signal);
|
close(event->fd_signal);
|
||||||
|
|
|
@ -787,9 +787,10 @@ static int rename_netif(struct udev_event *event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udev_event_execute_rules(struct udev_event *event,
|
void udev_event_execute_rules(struct udev_event *event,
|
||||||
usec_t timeout_usec,
|
usec_t timeout_usec, usec_t timeout_warn_usec,
|
||||||
usec_t timeout_warn_usec,
|
struct udev_list *properties_list,
|
||||||
struct udev_rules *rules, const sigset_t *sigmask) {
|
struct udev_rules *rules,
|
||||||
|
const sigset_t *sigmask) {
|
||||||
struct udev_device *dev = event->dev;
|
struct udev_device *dev = event->dev;
|
||||||
|
|
||||||
if (udev_device_get_subsystem(dev) == NULL)
|
if (udev_device_get_subsystem(dev) == NULL)
|
||||||
|
@ -803,7 +804,10 @@ void udev_event_execute_rules(struct udev_event *event,
|
||||||
if (major(udev_device_get_devnum(dev)) != 0)
|
if (major(udev_device_get_devnum(dev)) != 0)
|
||||||
udev_watch_end(event->udev, dev);
|
udev_watch_end(event->udev, dev);
|
||||||
|
|
||||||
udev_rules_apply_to_event(rules, event, timeout_usec, timeout_warn_usec, sigmask);
|
udev_rules_apply_to_event(rules, event,
|
||||||
|
timeout_usec, timeout_warn_usec,
|
||||||
|
properties_list,
|
||||||
|
sigmask);
|
||||||
|
|
||||||
if (major(udev_device_get_devnum(dev)) != 0)
|
if (major(udev_device_get_devnum(dev)) != 0)
|
||||||
udev_node_remove(dev);
|
udev_node_remove(dev);
|
||||||
|
@ -837,7 +841,10 @@ void udev_event_execute_rules(struct udev_event *event,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
udev_rules_apply_to_event(rules, event, timeout_usec, timeout_warn_usec, sigmask);
|
udev_rules_apply_to_event(rules, event,
|
||||||
|
timeout_usec, timeout_warn_usec,
|
||||||
|
properties_list,
|
||||||
|
sigmask);
|
||||||
|
|
||||||
/* rename a new network interface, if needed */
|
/* rename a new network interface, if needed */
|
||||||
if (udev_device_get_ifindex(dev) > 0 && streq(udev_device_get_action(dev), "add") &&
|
if (udev_device_get_ifindex(dev) > 0 && streq(udev_device_get_action(dev), "add") &&
|
||||||
|
|
|
@ -1876,6 +1876,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
|
||||||
struct udev_event *event,
|
struct udev_event *event,
|
||||||
usec_t timeout_usec,
|
usec_t timeout_usec,
|
||||||
usec_t timeout_warn_usec,
|
usec_t timeout_warn_usec,
|
||||||
|
struct udev_list *properties_list,
|
||||||
const sigset_t *sigmask) {
|
const sigset_t *sigmask) {
|
||||||
struct token *cur;
|
struct token *cur;
|
||||||
struct token *rule;
|
struct token *rule;
|
||||||
|
@ -1941,7 +1942,18 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
|
||||||
const char *value;
|
const char *value;
|
||||||
|
|
||||||
value = udev_device_get_property_value(event->dev, key_name);
|
value = udev_device_get_property_value(event->dev, key_name);
|
||||||
if (value == NULL)
|
|
||||||
|
/* check global properties */
|
||||||
|
if (!value && properties_list) {
|
||||||
|
struct udev_list_entry *list_entry;
|
||||||
|
|
||||||
|
list_entry = udev_list_get_entry(properties_list);
|
||||||
|
list_entry = udev_list_entry_get_by_name(list_entry, key_name);
|
||||||
|
if (list_entry != NULL)
|
||||||
|
value = udev_list_entry_get_value(list_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!value)
|
||||||
value = "";
|
value = "";
|
||||||
if (match_key(rules, cur, value))
|
if (match_key(rules, cur, value))
|
||||||
goto nomatch;
|
goto nomatch;
|
||||||
|
|
|
@ -73,7 +73,9 @@ struct udev_rules;
|
||||||
struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names);
|
struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names);
|
||||||
struct udev_rules *udev_rules_unref(struct udev_rules *rules);
|
struct udev_rules *udev_rules_unref(struct udev_rules *rules);
|
||||||
bool udev_rules_check_timestamp(struct udev_rules *rules);
|
bool udev_rules_check_timestamp(struct udev_rules *rules);
|
||||||
int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec,
|
int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event,
|
||||||
|
usec_t timeout_usec, usec_t timeout_warn_usec,
|
||||||
|
struct udev_list *properties_list,
|
||||||
const sigset_t *sigmask);
|
const sigset_t *sigmask);
|
||||||
int udev_rules_apply_static_dev_perms(struct udev_rules *rules);
|
int udev_rules_apply_static_dev_perms(struct udev_rules *rules);
|
||||||
|
|
||||||
|
@ -88,8 +90,11 @@ int udev_event_spawn(struct udev_event *event,
|
||||||
usec_t timeout_warn_usec,
|
usec_t timeout_warn_usec,
|
||||||
const char *cmd, char **envp, const sigset_t *sigmask,
|
const char *cmd, char **envp, const sigset_t *sigmask,
|
||||||
char *result, size_t ressize);
|
char *result, size_t ressize);
|
||||||
void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec,
|
void udev_event_execute_rules(struct udev_event *event,
|
||||||
struct udev_rules *rules, const sigset_t *sigset);
|
usec_t timeout_usec, usec_t timeout_warn_usec,
|
||||||
|
struct udev_list *properties_list,
|
||||||
|
struct udev_rules *rules,
|
||||||
|
const sigset_t *sigset);
|
||||||
void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, const sigset_t *sigset);
|
void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, const sigset_t *sigset);
|
||||||
int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]);
|
int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]);
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,11 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
udev_event_execute_rules(event, 60 * USEC_PER_SEC, 20 * USEC_PER_SEC, rules, &sigmask_orig);
|
udev_event_execute_rules(event,
|
||||||
|
60 * USEC_PER_SEC, 20 * USEC_PER_SEC,
|
||||||
|
NULL,
|
||||||
|
rules,
|
||||||
|
&sigmask_orig);
|
||||||
|
|
||||||
udev_list_entry_foreach(entry, udev_device_get_properties_list_entry(dev))
|
udev_list_entry_foreach(entry, udev_device_get_properties_list_entry(dev))
|
||||||
printf("%s=%s\n", udev_list_entry_get_name(entry), udev_list_entry_get_value(entry));
|
printf("%s=%s\n", udev_list_entry_get_name(entry), udev_list_entry_get_value(entry));
|
||||||
|
|
|
@ -75,8 +75,8 @@ static sigset_t sigmask_orig;
|
||||||
static UDEV_LIST(event_list);
|
static UDEV_LIST(event_list);
|
||||||
static UDEV_LIST(worker_list);
|
static UDEV_LIST(worker_list);
|
||||||
static char *udev_cgroup;
|
static char *udev_cgroup;
|
||||||
static bool udev_exit;
|
|
||||||
static struct udev_list properties_list;
|
static struct udev_list properties_list;
|
||||||
|
static bool udev_exit;
|
||||||
|
|
||||||
enum event_state {
|
enum event_state {
|
||||||
EVENT_UNDEF,
|
EVENT_UNDEF,
|
||||||
|
@ -305,9 +305,15 @@ static void worker_new(struct event *event) {
|
||||||
udev_event->rtnl = rtnl;
|
udev_event->rtnl = rtnl;
|
||||||
|
|
||||||
/* apply rules, create node, symlinks */
|
/* apply rules, create node, symlinks */
|
||||||
udev_event_execute_rules(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, rules, &sigmask_orig);
|
udev_event_execute_rules(udev_event,
|
||||||
|
arg_event_timeout_usec, arg_event_timeout_warn_usec,
|
||||||
|
&properties_list,
|
||||||
|
rules,
|
||||||
|
&sigmask_orig);
|
||||||
|
|
||||||
udev_event_execute_run(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, &sigmask_orig);
|
udev_event_execute_run(udev_event,
|
||||||
|
arg_event_timeout_usec, arg_event_timeout_warn_usec,
|
||||||
|
&sigmask_orig);
|
||||||
|
|
||||||
/* in case rtnl was initialized */
|
/* in case rtnl was initialized */
|
||||||
rtnl = sd_rtnl_ref(udev_event->rtnl);
|
rtnl = sd_rtnl_ref(udev_event->rtnl);
|
||||||
|
|
Loading…
Reference in a new issue