#include <ctype.h>
#include <unistd.h>
#include <errno.h>
+#include <syslog.h>
#include <sys/wait.h>
#include <sys/stat.h>
if (bufline[0] == COMMENT_CHARACTER)
continue;
- strlcpy(line, bufline, count+1);
+ memcpy(line, bufline, count);
+ line[count] = '\0';
linepos = line;
if (get_key(&linepos, &variable, &value) == 0) {
char result[1024];
size_t reslen;
- if (execute_program(program, udev->subsystem, result, sizeof(result), &reslen) != 0)
+ if (run_program(program, udev->subsystem, result, sizeof(result), &reslen, (udev_log_priority >= LOG_DEBUG)) != 0)
return -1;
return import_keys_into_env(udev, result, reslen);
}
static int find_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device,
const char *name, char *value, size_t len)
{
+ struct sysfs_class_device *class_dev_parent;
struct sysfs_attribute *tmpattr;
dbg("look for device attribute '%s'", name);
tmpattr = sysfs_get_classdev_attr(class_dev, name);
if (tmpattr)
goto attr_found;
+ class_dev_parent = sysfs_get_classdev_parent(class_dev);
+ if (class_dev_parent) {
+ tmpattr = sysfs_get_classdev_attr(class_dev_parent, name);
+ if (tmpattr)
+ goto attr_found;
+ }
}
if (sysfs_device) {
dbg("look for devices attribute '%s/%s'", sysfs_device->path, name);
apply_format(udev, import, sizeof(import), class_dev, sysfs_device);
dbg("check for IMPORT import='%s'", import);
if (rule->import_type == IMPORT_PROGRAM) {
- dbg("run executable file import='%s'", import);
+ info("IMPORT executes '%s'", import);
rc = import_program_into_env(udev, import);
} else if (rule->import_type == IMPORT_FILE) {
dbg("import file import='%s'", import);
strlcpy(program, key_val(rule, &rule->program), sizeof(program));
apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
- dbg("check for PROGRAM program='%s", program);
- if (execute_program(program, udev->subsystem, result, sizeof(result), NULL) != 0) {
+ info("PROGRAM key executes '%s", program);
+ if (run_program(program, udev->subsystem, result, sizeof(result), NULL, (udev_log_priority >= LOG_DEBUG)) != 0) {
dbg("PROGRAM is false");
+ udev->program_result[0] = '\0';
if (rule->program.operation != KEY_OP_NOMATCH)
goto exit;
} else {
if (!name_set) {
strlcpy(udev->name, udev->kernel_name, sizeof(udev->name));
- info("no rule found, will use kernel name '%s'", udev->name);
+ info("no node name set, will use kernel name '%s'", udev->name);
}
if (udev->tmp_node[0] != '\0') {