summaryrefslogtreecommitdiff
path: root/src/libudev
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-09-11 13:25:21 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2014-09-11 15:22:16 +0200
commit8e3ba3772cadf6a8292b0da533062dd4d377af67 (patch)
tree8d2830f26abacc98a53bd89ae1d7c3bc7d6ba744 /src/libudev
parent2e1dd622ee7020a608c3397768ea245dcb6409d1 (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.c21
-rw-r--r--src/libudev/libudev-private.h1
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);