From 9b7641d9ece05083716c0c9ccba91a65b29b80b4 Mon Sep 17 00:00:00 2001 From: illiliti Date: Wed, 29 Jul 2020 12:27:40 +0300 Subject: [PATCH] do not handle unique values when no need --- udev_device.c | 36 ++++++++++++++++++------------------ udev_enumerate.c | 14 +++++++------- udev_list.c | 18 ++++++++++-------- udev_list.h | 2 +- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/udev_device.c b/udev_device.c index 39045c4..8868023 100644 --- a/udev_device.c +++ b/udev_device.c @@ -254,7 +254,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const close(fd); data[strcspn(data, "\n")] = '\0'; - list_entry = udev_list_entry_add(&udev_device->sysattrs, sysattr, data); + list_entry = udev_list_entry_add(&udev_device->sysattrs, sysattr, data, 0); return udev_list_entry_get_value(list_entry); } @@ -286,7 +286,7 @@ int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *s } close(fd); - udev_list_entry_add(&udev_device->sysattrs, sysattr, value); + udev_list_entry_add(&udev_device->sysattrs, sysattr, value, 1); return 0; } @@ -326,14 +326,14 @@ static void udev_device_set_properties_from_uevent(struct udev_device *udev_devi if (strncmp(line, "DEVNAME", 7) == 0) { snprintf(devnode, sizeof(devnode), "/dev/%s", line + 8); - udev_list_entry_add(&udev_device->properties, "DEVNAME", devnode); + udev_list_entry_add(&udev_device->properties, "DEVNAME", devnode, 0); } else if (strchr(line, '=')) { val = strchr(line, '=') + 1; key = line; key[strcspn(key, "=")] = '\0'; - udev_list_entry_add(&udev_device->properties, key, val); + udev_list_entry_add(&udev_device->properties, key, val, 1); } } @@ -357,7 +357,7 @@ static void udev_device_set_properties_from_ioctl(struct udev_device *udev_devic return; } - udev_list_entry_add(&udev_device->properties, "ID_INPUT", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT", "1", 0); fd = open(udev_device_get_devnode(udev_device), O_RDONLY); @@ -374,30 +374,30 @@ static void udev_device_set_properties_from_ioctl(struct udev_device *udev_devic } if (test_bit(bits, EV_SW)) { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_SWITCH", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_SWITCH", "1", 0); } if (test_bit(bits, EV_KEY) && test_bit(key_bits, KEY_ENTER)) { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_KEY", "1"); - udev_list_entry_add(&udev_device->properties, "ID_INPUT_KEYBOARD", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_KEY", "1", 0); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_KEYBOARD", "1", 0); } if (test_bit(bits, EV_REL) && test_bit(rel_bits, REL_Y) && test_bit(rel_bits, REL_X) && test_bit(key_bits, BTN_MOUSE)) { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1", 0); } if (test_bit(bits, EV_ABS) && test_bit(abs_bits, ABS_Y) && test_bit(abs_bits, ABS_X)) { if (test_bit(key_bits, BTN_TOUCH) && !test_bit(key_bits, BTN_TOOL_PEN)) { if (test_bit(key_bits, BTN_TOOL_FINGER)) { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_TOUCHPAD", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_TOUCHPAD", "1", 0); } else { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_TOUCHSCREEN", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_TOUCHSCREEN", "1", 0); } } else if (test_bit(key_bits, BTN_MOUSE)) { - udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1"); + udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1", 0); } } @@ -438,15 +438,15 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char * udev_list_entry_init(&udev_device->properties); udev_list_entry_init(&udev_device->sysattrs); - udev_list_entry_add(&udev_device->properties, "SYSPATH", path); - udev_list_entry_add(&udev_device->properties, "DEVPATH", path + 4); + udev_list_entry_add(&udev_device->properties, "SYSPATH", path, 0); + udev_list_entry_add(&udev_device->properties, "DEVPATH", path + 4, 0); sysname = strrchr(path, '/') + 1; - udev_list_entry_add(&udev_device->properties, "SYSNAME", sysname); + udev_list_entry_add(&udev_device->properties, "SYSNAME", sysname, 0); for (i = 0; sysname[i] != '\0'; i++) { if (sysname[i] >= '0' && sysname[i] <= '9') { - udev_list_entry_add(&udev_device->properties, "SYSNUM", sysname + i); + udev_list_entry_add(&udev_device->properties, "SYSNUM", sysname + i, 0); break; } } @@ -454,14 +454,14 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char * subsystem = udev_device_read_symlink(udev_device, "subsystem"); if (subsystem) { - udev_list_entry_add(&udev_device->properties, "SUBSYSTEM", subsystem); + udev_list_entry_add(&udev_device->properties, "SUBSYSTEM", subsystem, 0); free(subsystem); } driver = udev_device_read_symlink(udev_device, "driver"); if (driver) { - udev_list_entry_add(&udev_device->properties, "DRIVER", driver); + udev_list_entry_add(&udev_device->properties, "DRIVER", driver, 0); free(driver); } diff --git a/udev_enumerate.c b/udev_enumerate.c index 86c9cf3..223b746 100644 --- a/udev_enumerate.c +++ b/udev_enumerate.c @@ -35,7 +35,7 @@ int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, co return -1; } - return udev_list_entry_add(&udev_enumerate->subsystem_match, subsystem, NULL) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->subsystem_match, subsystem, NULL, 0) ? 0 : -1; } int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem) @@ -44,7 +44,7 @@ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, return -1; } - return udev_list_entry_add(&udev_enumerate->subsystem_nomatch, subsystem, NULL) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->subsystem_nomatch, subsystem, NULL, 0) ? 0 : -1; } int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value) @@ -53,7 +53,7 @@ int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, cons return -1; } - return udev_list_entry_add(&udev_enumerate->sysattr_match, sysattr, value) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->sysattr_match, sysattr, value, 0) ? 0 : -1; } int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value) @@ -62,7 +62,7 @@ int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, co return -1; } - return udev_list_entry_add(&udev_enumerate->sysattr_nomatch, sysattr, value) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->sysattr_nomatch, sysattr, value, 0) ? 0 : -1; } int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value) @@ -71,7 +71,7 @@ int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, con return -1; } - return udev_list_entry_add(&udev_enumerate->property_match, property, value) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->property_match, property, value, 0) ? 0 : -1; } int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname) @@ -80,7 +80,7 @@ int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, cons return -1; } - return udev_list_entry_add(&udev_enumerate->sysname_match, sysname, NULL) ? 0 : -1; + return udev_list_entry_add(&udev_enumerate->sysname_match, sysname, NULL, 0) ? 0 : -1; } int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag) @@ -274,7 +274,7 @@ static void *udev_enumerate_add_device(void *ptr) udev_device_unref(udev_device); pthread_mutex_lock(data->mutex); - udev_list_entry_add(&data->udev_enumerate->devices, path, NULL); + udev_list_entry_add(&data->udev_enumerate->devices, path, NULL, 0); pthread_mutex_unlock(data->mutex); return NULL; diff --git a/udev_list.c b/udev_list.c index d9adfdb..e362d49 100644 --- a/udev_list.c +++ b/udev_list.c @@ -31,20 +31,22 @@ void udev_list_entry_free_all(struct udev_list_entry *list_entry) } } -struct udev_list_entry *udev_list_entry_add(struct udev_list_entry *list_entry, const char *name, const char *value) +struct udev_list_entry *udev_list_entry_add(struct udev_list_entry *list_entry, const char *name, const char *value, int uniq) { struct udev_list_entry *new, *old; - old = udev_list_entry_get_by_name(list_entry, name); + if (uniq) { + old = udev_list_entry_get_by_name(list_entry, name); - if (old) { - if (old->value && strcmp(old->value, value) == 0) { + if (old) { + if (old->value && strcmp(old->value, value) == 0) { + return old; + } + + free(old->value); + old->value = value ? strdup(value) : NULL; return old; } - - free(old->value); - old->value = value ? strdup(value) : NULL; - return old; } new = calloc(1, sizeof(struct udev_list_entry)); diff --git a/udev_list.h b/udev_list.h index 270bd14..da84f37 100644 --- a/udev_list.h +++ b/udev_list.h @@ -7,4 +7,4 @@ struct udev_list_entry { void udev_list_entry_init(struct udev_list_entry *list_entry); void udev_list_entry_free(struct udev_list_entry *list_entry); void udev_list_entry_free_all(struct udev_list_entry *list_entry); -struct udev_list_entry *udev_list_entry_add(struct udev_list_entry *list_entry, const char *name, const char *value); +struct udev_list_entry *udev_list_entry_add(struct udev_list_entry *list_entry, const char *name, const char *value, int uniq);