summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev/udev-event.c44
1 files changed, 21 insertions, 23 deletions
diff --git a/udev/udev-event.c b/udev/udev-event.c
index 3f69c0bb7a..2f32805f30 100644
--- a/udev/udev-event.c
+++ b/udev/udev-event.c
@@ -180,6 +180,8 @@ subst:
attrbuf[i] = '\0';
from += i+1;
attr = attrbuf;
+ } else {
+ attr = NULL;
}
switch (type) {
@@ -276,8 +278,8 @@ subst:
break;
}
case SUBST_ATTR: {
- const char *val;
- char value[UTIL_NAME_SIZE];
+ const char *value = NULL;
+ char vbuf[UTIL_NAME_SIZE];
size_t len;
int count;
@@ -286,36 +288,32 @@ subst:
break;
}
- value[0] = '\0';
- /* read the value specified by "[dmi/id]product_name" */
- util_resolve_subsys_kernel(event->udev, attr, value, sizeof(value), 1);
+ /* try to read the value specified by "[dmi/id]product_name" */
+ if (util_resolve_subsys_kernel(event->udev, attr, vbuf, sizeof(vbuf), 1) == 0)
+ value = vbuf;
- /* try to read attribute of the current device */
- if (value[0] == '\0') {
- val = udev_device_get_sysattr_value(event->dev, attr);
- if (val != NULL)
- util_strscpy(value, sizeof(value), val);
- }
+ /* try to read the attribute the device */
+ if (value == NULL)
+ value = udev_device_get_sysattr_value(event->dev, attr);
/* try to read the attribute of the parent device, other matches have selected */
- if (value[0] == '\0' && event->dev_parent != NULL && event->dev_parent != event->dev) {
- val = udev_device_get_sysattr_value(event->dev_parent, attr);
- if (val != NULL)
- util_strscpy(value, sizeof(value), val);
- }
+ if (value == NULL && event->dev_parent != NULL && event->dev_parent != event->dev)
+ value = udev_device_get_sysattr_value(event->dev_parent, attr);
- if (value[0]=='\0')
+ if (value == NULL)
break;
/* strip trailing whitespace, and replace unwanted characters */
- len = strlen(value);
- while (len > 0 && isspace(value[--len]))
- value[len] = '\0';
- count = udev_util_replace_chars(value, UDEV_ALLOWED_CHARS_INPUT);
+ if (value != vbuf)
+ util_strscpy(vbuf, sizeof(vbuf), value);
+ len = strlen(vbuf);
+ while (len > 0 && isspace(vbuf[--len]))
+ vbuf[len] = '\0';
+ count = udev_util_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT);
if (count > 0)
info(event->udev, "%i character(s) replaced\n" , count);
- l = util_strpcpy(&s, l, value);
- dbg(event->udev, "substitute sysfs value '%s'\n", value);
+ l = util_strpcpy(&s, l, vbuf);
+ dbg(event->udev, "substitute sysfs value '%s'\n", vbuf);
break;
}
case SUBST_PARENT: {