chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
udevtest: print message before log output
[elogind.git]
/
udev_rules.c
diff --git
a/udev_rules.c
b/udev_rules.c
index d77d5ec19691c4c664c2cb1ddb3314352f76a67c..526993e21ca64043ac483f26488a2c8698b3484c 100644
(file)
--- a/
udev_rules.c
+++ b/
udev_rules.c
@@
-79,14
+79,9
@@
static int get_key(char **line, char **key, char **value)
char *temp;
linepos = *line;
char *temp;
linepos = *line;
- if (
!linepos
)
+ if (
linepos == NULL
)
return -1;
return -1;
- if (strchr(linepos, '\\')) {
- dbg("escaped characters are not supported, skip");
- return -1;
- }
-
/* skip whitespace */
while (isspace(linepos[0]))
linepos++;
/* skip whitespace */
while (isspace(linepos[0]))
linepos++;
@@
-217,7
+212,7
@@
static int import_file_into_env(struct udevice *udev, const char *filename)
static int import_program_into_env(struct udevice *udev, const char *program)
{
static int import_program_into_env(struct udevice *udev, const char *program)
{
- char result[
1024
];
+ char result[
2048
];
size_t reslen;
if (run_program(program, udev->dev->subsystem, result, sizeof(result), &reslen, (udev_log_priority >= LOG_INFO)) != 0)
size_t reslen;
if (run_program(program, udev->dev->subsystem, result, sizeof(result), &reslen, (udev_log_priority >= LOG_INFO)) != 0)
@@
-496,15
+491,15
@@
found:
if (value == NULL)
break;
if (value == NULL)
break;
- /* strip trailing whitespace
and replace untrusted characters of sysfs value
*/
+ /* strip trailing whitespace
, and replace unwanted characters
*/
size = strlcpy(temp2, value, sizeof(temp2));
if (size >= sizeof(temp2))
size = sizeof(temp2)-1;
while (size > 0 && isspace(temp2[size-1]))
temp2[--size] = '\0';
size = strlcpy(temp2, value, sizeof(temp2));
if (size >= sizeof(temp2))
size = sizeof(temp2)-1;
while (size > 0 && isspace(temp2[size-1]))
temp2[--size] = '\0';
- count = replace_
untrusted_chars(temp2
);
+ count = replace_
chars(temp2, ALLOWED_CHARS_INPUT
);
if (count > 0)
if (count > 0)
- info("%i
untrusted
character(s) replaced" , count);
+ info("%i character(s) replaced" , count);
strlcat(string, temp2, maxsize);
dbg("substitute sysfs value '%s'", temp2);
}
strlcat(string, temp2, maxsize);
dbg("substitute sysfs value '%s'", temp2);
}
@@
-532,7
+527,7
@@
found:
}
break;
case SUBST_TEMP_NODE:
}
break;
case SUBST_TEMP_NODE:
- if (udev->tmp_node[0] == '\0') {
+ if (udev->tmp_node[0] == '\0'
&& major(udev->devt) > 0
) {
dbg("create temporary device node for callout");
snprintf(udev->tmp_node, sizeof(udev->tmp_node), "%s/.tmp-%u-%u",
udev_root, major(udev->devt), minor(udev->devt));
dbg("create temporary device node for callout");
snprintf(udev->tmp_node, sizeof(udev->tmp_node), "%s/.tmp-%u-%u",
udev_root, major(udev->devt), minor(udev->devt));
@@
-781,9
+776,9
@@
try_parent:
dbg("PROGRAM matches");
remove_trailing_chars(result, '\n');
dbg("PROGRAM matches");
remove_trailing_chars(result, '\n');
- count = replace_
untrusted_chars(result
);
+ count = replace_
chars(result, ALLOWED_CHARS_INPUT
);
if (count)
if (count)
- info("%i
untrusted
character(s) replaced" , count);
+ info("%i character(s) replaced" , count);
dbg("result is '%s'", result);
strlcpy(udev->program_result, result, sizeof(udev->program_result));
dbg("PROGRAM returned successful");
dbg("result is '%s'", result);
strlcpy(udev->program_result, result, sizeof(udev->program_result));
dbg("PROGRAM returned successful");
@@
-831,22
+826,27
@@
try_parent:
char temp_value[NAME_SIZE];
const char *key_name = key_pair_name(rule, pair);
const char *value = key_val(rule, &pair->key);
char temp_value[NAME_SIZE];
const char *key_name = key_pair_name(rule, pair);
const char *value = key_val(rule, &pair->key);
- char *key_value;
/* make sure we don't write to the same string we possibly read from */
strlcpy(temp_value, value, sizeof(temp_value));
udev_rules_apply_format(udev, temp_value, NAME_SIZE);
/* make sure we don't write to the same string we possibly read from */
strlcpy(temp_value, value, sizeof(temp_value));
udev_rules_apply_format(udev, temp_value, NAME_SIZE);
- key_value = name_list_key_add(&udev->env_list, key_name, temp_value);
- if (key_value == NULL)
- break;
+ if (temp_value[0] == '\0') {
+ name_list_key_remove(&udev->env_list, key_name);
+ unsetenv(key_name);
+ info("unset ENV '%s'", key_name);
+ } else {
+ char *key_value = name_list_key_add(&udev->env_list, key_name, temp_value);
- putenv(key_value);
- dbg("export ENV '%s'", key_value);
+ if (key_value == NULL)
+ break;
+ putenv(key_value);
+ info("set ENV '%s'", key_value);
+ }
}
}
}
}
- /* if we have ATTR assign
ements
write value to sysfs file */
+ /* if we have ATTR assign
ments,
write value to sysfs file */
for (i = 0; i < rule->attr.count; i++) {
struct key_pair *pair = &rule->attr.keys[i];
for (i = 0; i < rule->attr.count; i++) {
struct key_pair *pair = &rule->attr.keys[i];
@@
-914,7
+914,7
@@
int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
udev->ignore_remove = 1;
dbg("remove event should be ignored");
}
udev->ignore_remove = 1;
dbg("remove event should be ignored");
}
- if (rule->link_priority) {
+ if (rule->link_priority
!= 0
) {
udev->link_priority = rule->link_priority;
info("link_priority=%i", udev->link_priority);
}
udev->link_priority = rule->link_priority;
info("link_priority=%i", udev->link_priority);
}
@@
-959,14
+959,13
@@
int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
info("reset symlink list");
name_list_cleanup(&udev->symlink_list);
}
info("reset symlink list");
name_list_cleanup(&udev->symlink_list);
}
+ /* allow multiple symlinks separated by spaces */
strlcpy(temp, key_val(rule, &rule->symlink), sizeof(temp));
udev_rules_apply_format(udev, temp, sizeof(temp));
strlcpy(temp, key_val(rule, &rule->symlink), sizeof(temp));
udev_rules_apply_format(udev, temp, sizeof(temp));
- count = replace_
untrusted_chars(temp
);
+ count = replace_
chars(temp, ALLOWED_CHARS_FILE " "
);
if (count)
if (count)
- info("%i
untrusted
character(s) replaced" , count);
+ info("%i character(s) replaced" , count);
dbg("rule applied, added symlink(s) '%s'", temp);
dbg("rule applied, added symlink(s) '%s'", temp);
-
- /* add multiple symlinks separated by spaces */
pos = temp;
while (isspace(pos[0]))
pos++;
pos = temp;
while (isspace(pos[0]))
pos++;
@@
-995,9
+994,9
@@
int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
name_set = 1;
strlcpy(udev->name, key_val(rule, &rule->name), sizeof(udev->name));
udev_rules_apply_format(udev, udev->name, sizeof(udev->name));
name_set = 1;
strlcpy(udev->name, key_val(rule, &rule->name), sizeof(udev->name));
udev_rules_apply_format(udev, udev->name, sizeof(udev->name));
- count = replace_
untrusted_chars(udev->name
);
+ count = replace_
chars(udev->name, ALLOWED_CHARS_FILE
);
if (count)
if (count)
- info("%i
untrusted
character(s) replaced", count);
+ info("%i character(s) replaced", count);
info("rule applied, '%s' becomes '%s'", udev->dev->kernel, udev->name);
if (strcmp(udev->dev->subsystem, "net") != 0)
info("rule applied, '%s' becomes '%s'", udev->dev->kernel, udev->name);
if (strcmp(udev->dev->subsystem, "net") != 0)