/*
- * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2009 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
}
for (i = 0; i < ARRAY_SIZE(map); i++) {
- if (strncasecmp(&from[1], map[i].name, strlen(map[i].name)) == 0) {
+ if (strncmp(&from[1], map[i].name, strlen(map[i].name)) == 0) {
type = map[i].type;
from += strlen(map[i].name)+1;
dbg(event->udev, "will substitute format name '%s'\n", map[i].name);
attrbuf[i] = '\0';
from += i+1;
attr = attrbuf;
+ } else {
+ attr = NULL;
}
switch (type) {
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;
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: {
monitor = udev_monitor_new_from_socket(event->udev, &cmd[strlen("socket:")]);
if (monitor == NULL)
continue;
- udev_monitor_send_device(monitor, event->dev);
+ udev_monitor_send_device(monitor, NULL, event->dev);
udev_monitor_unref(monitor);
} else {
char program[UTIL_PATH_SIZE];
char **envp;
udev_event_apply_format(event, cmd, program, sizeof(program));
- if (event->trace)
- fprintf(stderr, "run %s (%llu) '%s'\n",
- udev_device_get_syspath(event->dev),
- udev_device_get_seqnum(event->dev),
- program);
envp = udev_device_get_properties_envp(event->dev);
if (util_run_program(event->udev, program, envp, NULL, 0, NULL) != 0) {
- if (!udev_list_entry_get_flag(list_entry))
+ if (udev_list_entry_get_flag(list_entry))
err = -1;
}
}