diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2014-09-11 13:25:21 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2014-09-11 15:22:16 +0200 |
commit | 8e3ba3772cadf6a8292b0da533062dd4d377af67 (patch) | |
tree | 8d2830f26abacc98a53bd89ae1d7c3bc7d6ba744 /src/libudev | |
parent | 2e1dd622ee7020a608c3397768ea245dcb6409d1 (diff) |
udev: allow removing tags via TAG-="foobar"
This extends the udev parser to support OP_REMOVE (-=) and adds support
for TAG-= to remove previously set tags. We don't fail if the tag didn't
exist.
This is pretty handy if we ship default rules for seat-assignments and
users want to exclude specific devices from that. They can easily add
rules that drop any automatically added "seat" tags again.
Diffstat (limited to 'src/libudev')
-rw-r--r-- | src/libudev/libudev-device.c | 21 | ||||
-rw-r--r-- | src/libudev/libudev-private.h | 1 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c index f26a4c44b5..d61a2ad8f4 100644 --- a/src/libudev/libudev-device.c +++ b/src/libudev/libudev-device.c @@ -1732,9 +1732,14 @@ void udev_device_set_is_initialized(struct udev_device *udev_device) udev_device->is_initialized = true; } +static bool is_valid_tag(const char *tag) +{ + return !strchr(tag, ':') && !strchr(tag, ' '); +} + int udev_device_add_tag(struct udev_device *udev_device, const char *tag) { - if (strchr(tag, ':') != NULL || strchr(tag, ' ') != NULL) + if (!is_valid_tag(tag)) return -EINVAL; udev_device->tags_uptodate = false; if (udev_list_entry_add(&udev_device->tags_list, tag, NULL) != NULL) @@ -1742,6 +1747,20 @@ int udev_device_add_tag(struct udev_device *udev_device, const char *tag) return -ENOMEM; } +void udev_device_remove_tag(struct udev_device *udev_device, const char *tag) +{ + struct udev_list_entry *e; + + if (!is_valid_tag(tag)) + return; + e = udev_list_get_entry(&udev_device->tags_list); + e = udev_list_entry_get_by_name(e, tag); + if (e) { + udev_device->tags_uptodate = false; + udev_list_entry_delete(e); + } +} + void udev_device_cleanup_tags_list(struct udev_device *udev_device) { udev_device->tags_uptodate = false; diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h index cd1c1fb8b3..35ea7ba44c 100644 --- a/src/libudev/libudev-private.h +++ b/src/libudev/libudev-private.h @@ -73,6 +73,7 @@ const char *udev_device_get_devpath_old(struct udev_device *udev_device); const char *udev_device_get_id_filename(struct udev_device *udev_device); void udev_device_set_is_initialized(struct udev_device *udev_device); int udev_device_add_tag(struct udev_device *udev_device, const char *tag); +void udev_device_remove_tag(struct udev_device *udev_device, const char *tag); void udev_device_cleanup_tags_list(struct udev_device *udev_device); usec_t udev_device_get_usec_initialized(struct udev_device *udev_device); void udev_device_set_usec_initialized(struct udev_device *udev_device, usec_t usec_initialized); |