chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libudev: monitor- add netlink uevent support
[elogind.git]
/
udev
/
udev_rules_parse.c
diff --git
a/udev/udev_rules_parse.c
b/udev/udev_rules_parse.c
index 273f92f4863b65dffa5e6a9807bd7a39fa09bf51..81f0edb6f59a0df758eb7db3f496ff8e8eafbe4e 100644
(file)
--- a/
udev/udev_rules_parse.c
+++ b/
udev/udev_rules_parse.c
@@
-17,6
+17,8
@@
*
*/
*
*/
+#include "config.h"
+
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
@@
-31,57
+33,61
@@
#include "udev_selinux.h"
#include "udev_selinux.h"
-void udev_rules_iter_init(struct udev_rules *rules)
+void udev_rules_iter_init(struct udev_rules
_iter *iter, struct udev_rules
*rules)
{
{
- dbg("bufsize=%zi\n", rules->bufsize);
- rules->current = 0;
+ dbg(iter->rules->udev, "bufsize=%zi\n", rules->bufsize);
+ iter->rules = rules;
+ iter->current = 0;
}
}
-struct udev_rule *udev_rules_iter_next(struct udev_rules
*rules
)
+struct udev_rule *udev_rules_iter_next(struct udev_rules
_iter *iter
)
{
{
- static struct udev_rule *rule;
+ struct udev_rules *rules;
+ struct udev_rule *rule;
+ rules = iter->rules;
if (!rules)
return NULL;
if (!rules)
return NULL;
- dbg(
"current=%zi\n", rules
->current);
- if (
rules
->current >= rules->bufsize) {
- dbg("no more rules\n");
+ dbg(
iter->rules->udev, "current=%zi\n", iter
->current);
+ if (
iter
->current >= rules->bufsize) {
+ dbg(
iter->rules->udev,
"no more rules\n");
return NULL;
}
/* get next rule */
return NULL;
}
/* get next rule */
- rule = (struct udev_rule *) (rules->buf +
rules
->current);
-
rules
->current += sizeof(struct udev_rule) + rule->bufsize;
+ rule = (struct udev_rule *) (rules->buf +
iter
->current);
+
iter
->current += sizeof(struct udev_rule) + rule->bufsize;
return rule;
}
return rule;
}
-struct udev_rule *udev_rules_iter_label(struct udev_rules
*rules
, const char *label)
+struct udev_rule *udev_rules_iter_label(struct udev_rules
_iter *iter
, const char *label)
{
{
- static struct udev_rule *rule;
- size_t start = rules->current;
+ struct udev_rule *rule;
+ struct udev_rules *rules = iter->rules;
+ size_t start = iter->current;
next:
next:
- dbg(
"current=%zi\n", rules
->current);
- if (
rules
->current >= rules->bufsize) {
- err("LABEL='%s' not found, GOTO will be ignored\n", label);
-
rules
->current = start;
+ dbg(
iter->rules->udev, "current=%zi\n", iter
->current);
+ if (
iter
->current >= rules->bufsize) {
+ err(
rules->udev,
"LABEL='%s' not found, GOTO will be ignored\n", label);
+
iter
->current = start;
return NULL;
}
return NULL;
}
- rule = (struct udev_rule *) (rules->buf +
rules
->current);
+ rule = (struct udev_rule *) (rules->buf +
iter
->current);
if (strcmp(&rule->buf[rule->label.val_off], label) != 0) {
if (strcmp(&rule->buf[rule->label.val_off], label) != 0) {
- dbg("moving forward, looking for label '%s'\n", label);
-
rules
->current += sizeof(struct udev_rule) + rule->bufsize;
+ dbg(
rules->udev,
"moving forward, looking for label '%s'\n", label);
+
iter
->current += sizeof(struct udev_rule) + rule->bufsize;
goto next;
}
goto next;
}
- dbg("found label '%s'\n", label);
+ dbg(
rules->udev,
"found label '%s'\n", label);
return rule;
}
return rule;
}
-static int get_key(char **line, char **key, enum key_operation *operation, char **value)
+static int get_key(
struct udev_rules *rules,
char **line, char **key, enum key_operation *operation, char **value)
{
char *linepos;
char *temp;
{
char *linepos;
char *temp;
@@
-125,29
+131,29
@@
static int get_key(char **line, char **key, enum key_operation *operation, char
if (linepos[0] == '=' && linepos[1] == '=') {
*operation = KEY_OP_MATCH;
linepos += 2;
if (linepos[0] == '=' && linepos[1] == '=') {
*operation = KEY_OP_MATCH;
linepos += 2;
- dbg("operator=match\n");
+ dbg(
rules->udev,
"operator=match\n");
} else if (linepos[0] == '!' && linepos[1] == '=') {
*operation = KEY_OP_NOMATCH;
linepos += 2;
} else if (linepos[0] == '!' && linepos[1] == '=') {
*operation = KEY_OP_NOMATCH;
linepos += 2;
- dbg("operator=nomatch\n");
+ dbg(
rules->udev,
"operator=nomatch\n");
} else if (linepos[0] == '+' && linepos[1] == '=') {
*operation = KEY_OP_ADD;
linepos += 2;
} else if (linepos[0] == '+' && linepos[1] == '=') {
*operation = KEY_OP_ADD;
linepos += 2;
- dbg("operator=add\n");
+ dbg(
rules->udev,
"operator=add\n");
} else if (linepos[0] == '=') {
*operation = KEY_OP_ASSIGN;
linepos++;
} else if (linepos[0] == '=') {
*operation = KEY_OP_ASSIGN;
linepos++;
- dbg("operator=assign\n");
+ dbg(
rules->udev,
"operator=assign\n");
} else if (linepos[0] == ':' && linepos[1] == '=') {
*operation = KEY_OP_ASSIGN_FINAL;
linepos += 2;
} else if (linepos[0] == ':' && linepos[1] == '=') {
*operation = KEY_OP_ASSIGN_FINAL;
linepos += 2;
- dbg("operator=assign_final\n");
+ dbg(
rules->udev,
"operator=assign_final\n");
} else
return -1;
/* terminate key */
temp[0] = '\0';
} else
return -1;
/* terminate key */
temp[0] = '\0';
- dbg("key='%s'\n", *key);
+ dbg(
rules->udev,
"key='%s'\n", *key);
/* skip whitespace after operator */
while (isspace(linepos[0]))
/* skip whitespace after operator */
while (isspace(linepos[0]))
@@
-167,7
+173,7
@@
static int get_key(char **line, char **key, enum key_operation *operation, char
return -1;
temp[0] = '\0';
temp++;
return -1;
temp[0] = '\0';
temp++;
- dbg("value='%s'\n", *value);
+ dbg(
rules->udev,
"value='%s'\n", *value);
/* move line to next key */
*line = temp;
/* move line to next key */
*line = temp;
@@
-176,7
+182,7
@@
static int get_key(char **line, char **key, enum key_operation *operation, char
}
/* extract possible KEY{attr} */
}
/* extract possible KEY{attr} */
-static char *get_key_attribute(char *str)
+static char *get_key_attribute(
struct udev_rules *rules,
char *str)
{
char *pos;
char *attr;
{
char *pos;
char *attr;
@@
-186,11
+192,11
@@
static char *get_key_attribute(char *str)
attr++;
pos = strchr(attr, '}');
if (pos == NULL) {
attr++;
pos = strchr(attr, '}');
if (pos == NULL) {
- err("missing closing brace for format\n");
+ err(
rules->udev,
"missing closing brace for format\n");
return NULL;
}
pos[0] = '\0';
return NULL;
}
pos[0] = '\0';
- dbg("attribute='%s'\n", attr);
+ dbg(
rules->udev,
"attribute='%s'\n", attr);
return attr;
}
return attr;
}
@@
-211,13
+217,13
@@
static int add_rule_key(struct udev_rule *rule, struct key *key,
return 0;
}
return 0;
}
-static int add_rule_key_pair(struct udev_rule *rule, struct key_pairs *pairs,
+static int add_rule_key_pair(struct udev_rule
s *rules, struct udev_rule
*rule, struct key_pairs *pairs,
enum key_operation operation, const char *key, const char *value)
{
size_t key_len = strnlen(key, PATH_SIZE);
if (pairs->count >= PAIRS_MAX) {
enum key_operation operation, const char *key, const char *value)
{
size_t key_len = strnlen(key, PATH_SIZE);
if (pairs->count >= PAIRS_MAX) {
- err("skip, too many keys of the same type in a single rule\n");
+ err(
rules->udev,
"skip, too many keys of the same type in a single rule\n");
return -1;
}
return -1;
}
@@
-257,14
+263,14
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
char *value;
enum key_operation operation = KEY_OP_UNSET;
char *value;
enum key_operation operation = KEY_OP_UNSET;
- retval = get_key(&linepos, &key, &operation, &value);
+ retval = get_key(
rules,
&linepos, &key, &operation, &value);
if (retval)
break;
if (strcasecmp(key, "ACTION") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (retval)
break;
if (strcasecmp(key, "ACTION") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid ACTION operation\n");
+ err(
rules->udev,
"invalid ACTION operation\n");
goto invalid;
}
add_rule_key(rule, &rule->action, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->action, operation, value);
@@
-275,7
+281,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "DEVPATH") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "DEVPATH") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid DEVPATH operation\n");
+ err(
rules->udev,
"invalid DEVPATH operation\n");
goto invalid;
}
add_rule_key(rule, &rule->devpath, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->devpath, operation, value);
@@
-286,7
+292,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "KERNEL") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "KERNEL") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid KERNEL operation\n");
+ err(
rules->udev,
"invalid KERNEL operation\n");
goto invalid;
}
add_rule_key(rule, &rule->kernel, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->kernel, operation, value);
@@
-297,7
+303,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "SUBSYSTEM") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "SUBSYSTEM") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid SUBSYSTEM operation\n");
+ err(
rules->udev,
"invalid SUBSYSTEM operation\n");
goto invalid;
}
/* bus, class, subsystem events should all be the same */
goto invalid;
}
/* bus, class, subsystem events should all be the same */
@@
-305,7
+311,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strcmp(value, "bus") == 0 ||
strcmp(value, "class") == 0) {
if (strcmp(value, "bus") == 0 || strcmp(value, "class") == 0)
strcmp(value, "bus") == 0 ||
strcmp(value, "class") == 0) {
if (strcmp(value, "bus") == 0 || strcmp(value, "class") == 0)
- err("'%s' must be specified as 'subsystem' \n"
+ err(
rules->udev,
"'%s' must be specified as 'subsystem' \n"
"please fix it in %s:%u", value, filename, lineno);
add_rule_key(rule, &rule->subsystem, operation, "subsystem|class|bus");
} else
"please fix it in %s:%u", value, filename, lineno);
add_rule_key(rule, &rule->subsystem, operation, "subsystem|class|bus");
} else
@@
-317,7
+323,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "DRIVER") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "DRIVER") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid DRIVER operation\n");
+ err(
rules->udev,
"invalid DRIVER operation\n");
goto invalid;
}
add_rule_key(rule, &rule->driver, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->driver, operation, value);
@@
-326,12
+332,12
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
}
if (strncasecmp(key, "ATTR{", sizeof("ATTR{")-1) == 0) {
}
if (strncasecmp(key, "ATTR{", sizeof("ATTR{")-1) == 0) {
- attr = get_key_attribute(key + sizeof("ATTR")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("ATTR")-1);
if (attr == NULL) {
if (attr == NULL) {
- err("error parsing ATTR attribute\n");
+ err(
rules->udev,
"error parsing ATTR attribute\n");
goto invalid;
}
goto invalid;
}
- if (add_rule_key_pair(rule, &rule->attr, operation, attr, value) != 0)
+ if (add_rule_key_pair(rule
s, rule
, &rule->attr, operation, attr, value) != 0)
goto invalid;
valid = 1;
continue;
goto invalid;
valid = 1;
continue;
@@
-341,7
+347,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strcasecmp(key, "ID") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
strcasecmp(key, "ID") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid KERNELS operation\n");
+ err(
rules->udev,
"invalid KERNELS operation\n");
goto invalid;
}
add_rule_key(rule, &rule->kernels, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->kernels, operation, value);
@@
-353,7
+359,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strcasecmp(key, "BUS") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
strcasecmp(key, "BUS") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid SUBSYSTEMS operation\n");
+ err(
rules->udev,
"invalid SUBSYSTEMS operation\n");
goto invalid;
}
add_rule_key(rule, &rule->subsystems, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->subsystems, operation, value);
@@
-364,7
+370,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "DRIVERS") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "DRIVERS") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid DRIVERS operation\n");
+ err(
rules->udev,
"invalid DRIVERS operation\n");
goto invalid;
}
add_rule_key(rule, &rule->drivers, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->drivers, operation, value);
@@
-376,35
+382,35
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strncasecmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
strncasecmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid ATTRS operation\n");
+ err(
rules->udev,
"invalid ATTRS operation\n");
goto invalid;
}
goto invalid;
}
- attr = get_key_attribute(key + sizeof("ATTRS")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("ATTRS")-1);
if (attr == NULL) {
if (attr == NULL) {
- err("error parsing ATTRS attribute\n");
+ err(
rules->udev,
"error parsing ATTRS attribute\n");
goto invalid;
}
if (strncmp(attr, "device/", 7) == 0)
goto invalid;
}
if (strncmp(attr, "device/", 7) == 0)
- err("the 'device' link is deprecated and will be removed from a future kernel, \n"
+ err(
rules->udev,
"the 'device' link is deprecated and will be removed from a future kernel, \n"
"please fix it in %s:%u", filename, lineno);
else if (strstr(attr, "../") != NULL)
"please fix it in %s:%u", filename, lineno);
else if (strstr(attr, "../") != NULL)
- err("do not reference parent sysfs directories directly, that may break with a future kernel, \n"
+ err(
rules->udev,
"do not reference parent sysfs directories directly, that may break with a future kernel, \n"
"please fix it in %s:%u", filename, lineno);
"please fix it in %s:%u", filename, lineno);
- if (add_rule_key_pair(rule, &rule->attrs, operation, attr, value) != 0)
+ if (add_rule_key_pair(rule
s, rule
, &rule->attrs, operation, attr, value) != 0)
goto invalid;
valid = 1;
continue;
}
if (strncasecmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
goto invalid;
valid = 1;
continue;
}
if (strncasecmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
- attr = get_key_attribute(key + sizeof("ENV")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("ENV")-1);
if (attr == NULL) {
if (attr == NULL) {
- err("error parsing ENV attribute\n");
+ err(
rules->udev,
"error parsing ENV attribute\n");
goto invalid;
}
if (strncmp(attr, "PHYSDEV", 7) == 0)
physdev = 1;
goto invalid;
}
if (strncmp(attr, "PHYSDEV", 7) == 0)
physdev = 1;
- if (add_rule_key_pair(rule, &rule->env, operation, attr, value) != 0)
+ if (add_rule_key_pair(rule
s, rule
, &rule->env, operation, attr, value) != 0)
goto invalid;
valid = 1;
continue;
goto invalid;
valid = 1;
continue;
@@
-419,7
+425,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strcasecmp(key, "RESULT") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strcasecmp(key, "RESULT") == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid RESULT operation\n");
+ err(
rules->udev,
"invalid RESULT operation\n");
goto invalid;
}
add_rule_key(rule, &rule->result, operation, value);
goto invalid;
}
add_rule_key(rule, &rule->result, operation, value);
@@
-428,15
+434,15
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
}
if (strncasecmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) {
}
if (strncasecmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) {
- attr = get_key_attribute(key + sizeof("IMPORT")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("IMPORT")-1);
if (attr != NULL && strstr(attr, "program")) {
if (attr != NULL && strstr(attr, "program")) {
- dbg("IMPORT will be executed\n");
+ dbg(
rules->udev,
"IMPORT will be executed\n");
rule->import_type = IMPORT_PROGRAM;
} else if (attr != NULL && strstr(attr, "file")) {
rule->import_type = IMPORT_PROGRAM;
} else if (attr != NULL && strstr(attr, "file")) {
- dbg("IMPORT will be included as file\n");
+ dbg(
rules->udev,
"IMPORT will be included as file\n");
rule->import_type = IMPORT_FILE;
} else if (attr != NULL && strstr(attr, "parent")) {
rule->import_type = IMPORT_FILE;
} else if (attr != NULL && strstr(attr, "parent")) {
- dbg("IMPORT will include the parent values\n");
+ dbg(
rules->udev,
"IMPORT will include the parent values\n");
rule->import_type = IMPORT_PARENT;
} else {
/* figure it out if it is executable */
rule->import_type = IMPORT_PARENT;
} else {
/* figure it out if it is executable */
@@
-458,12
+464,12
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
pos[0] = '\0';
}
pos[0] = '\0';
}
- dbg("IMPORT auto mode for '%s'\n", file);
+ dbg(
rules->udev,
"IMPORT auto mode for '%s'\n", file);
if (!lstat(file, &statbuf) && (statbuf.st_mode & S_IXUSR)) {
if (!lstat(file, &statbuf) && (statbuf.st_mode & S_IXUSR)) {
- dbg("IMPORT is executable, will be executed (autotype)\n");
+ dbg(
rules->udev,
"IMPORT is executable, will be executed (autotype)\n");
rule->import_type = IMPORT_PROGRAM;
} else {
rule->import_type = IMPORT_PROGRAM;
} else {
- dbg("IMPORT is not executable, will be included as file (autotype)\n");
+ dbg(
rules->udev,
"IMPORT is not executable, will be included as file (autotype)\n");
rule->import_type = IMPORT_FILE;
}
}
rule->import_type = IMPORT_FILE;
}
}
@@
-475,10
+481,10
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
if (strncasecmp(key, "TEST", sizeof("TEST")-1) == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
if (strncasecmp(key, "TEST", sizeof("TEST")-1) == 0) {
if (operation != KEY_OP_MATCH &&
operation != KEY_OP_NOMATCH) {
- err("invalid TEST operation\n");
+ err(
rules->udev,
"invalid TEST operation\n");
goto invalid;
}
goto invalid;
}
- attr = get_key_attribute(key + sizeof("TEST")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("TEST")-1);
if (attr != NULL)
rule->test_mode_mask = strtol(attr, NULL, 8);
add_rule_key(rule, &rule->test, operation, value);
if (attr != NULL)
rule->test_mode_mask = strtol(attr, NULL, 8);
add_rule_key(rule, &rule->test, operation, value);
@@
-487,7
+493,7
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
}
if (strncasecmp(key, "RUN", sizeof("RUN")-1) == 0) {
}
if (strncasecmp(key, "RUN", sizeof("RUN")-1) == 0) {
- attr = get_key_attribute(key + sizeof("RUN")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("RUN")-1);
if (attr != NULL) {
if (strstr(attr, "ignore_error"))
rule->run_ignore_error = 1;
if (attr != NULL) {
if (strstr(attr, "ignore_error"))
rule->run_ignore_error = 1;
@@
-516,19
+522,19
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
}
if (strncasecmp(key, "NAME", sizeof("NAME")-1) == 0) {
}
if (strncasecmp(key, "NAME", sizeof("NAME")-1) == 0) {
- attr = get_key_attribute(key + sizeof("NAME")-1);
+ attr = get_key_attribute(
rules,
key + sizeof("NAME")-1);
if (attr != NULL) {
if (strstr(attr, "all_partitions") != NULL) {
if (attr != NULL) {
if (strstr(attr, "all_partitions") != NULL) {
- dbg("creation of partition nodes requested\n");
+ dbg(
rules->udev,
"creation of partition nodes requested\n");
rule->partitions = DEFAULT_PARTITIONS_COUNT;
}
if (strstr(attr, "ignore_remove") != NULL) {
rule->partitions = DEFAULT_PARTITIONS_COUNT;
}
if (strstr(attr, "ignore_remove") != NULL) {
- dbg("remove event should be ignored\n");
+ dbg(
rules->udev,
"remove event should be ignored\n");
rule->ignore_remove = 1;
}
}
if (value[0] == '\0')
rule->ignore_remove = 1;
}
}
if (value[0] == '\0')
- dbg("name empty, node creation supressed\n");
+ dbg(
rules->udev,
"name empty, node creation supressed\n");
add_rule_key(rule, &rule->name, operation, value);
continue;
}
add_rule_key(rule, &rule->name, operation, value);
continue;
}
@@
-550,8
+556,8
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strtoul(value, &endptr, 10);
if (endptr[0] != '\0') {
char owner[32];
strtoul(value, &endptr, 10);
if (endptr[0] != '\0') {
char owner[32];
- uid_t uid = lookup_user(value);
- dbg("replacing username='%s' by id=%i\n", value, uid);
+ uid_t uid = lookup_user(
rules->udev,
value);
+ dbg(
rules->udev,
"replacing username='%s' by id=%i\n", value, uid);
sprintf(owner, "%u", (unsigned int) uid);
add_rule_key(rule, &rule->owner, operation, owner);
continue;
sprintf(owner, "%u", (unsigned int) uid);
add_rule_key(rule, &rule->owner, operation, owner);
continue;
@@
-569,8
+575,8
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
strtoul(value, &endptr, 10);
if (endptr[0] != '\0') {
char group[32];
strtoul(value, &endptr, 10);
if (endptr[0] != '\0') {
char group[32];
- gid_t gid = lookup_group(value);
- dbg("replacing groupname='%s' by id=%i\n", value, gid);
+ gid_t gid = lookup_group(
rules->udev,
value);
+ dbg(
rules->udev,
"replacing groupname='%s' by id=%i\n", value, gid);
sprintf(group, "%u", (unsigned int) gid);
add_rule_key(rule, &rule->group, operation, group);
continue;
sprintf(group, "%u", (unsigned int) gid);
add_rule_key(rule, &rule->group, operation, group);
continue;
@@
-591,26
+597,26
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
const char *pos;
if (strstr(value, "last_rule") != NULL) {
const char *pos;
if (strstr(value, "last_rule") != NULL) {
- dbg("last rule to be applied\n");
+ dbg(
rules->udev,
"last rule to be applied\n");
rule->last_rule = 1;
}
if (strstr(value, "ignore_device") != NULL) {
rule->last_rule = 1;
}
if (strstr(value, "ignore_device") != NULL) {
- dbg("device should be ignored\n");
+ dbg(
rules->udev,
"device should be ignored\n");
rule->ignore_device = 1;
}
if (strstr(value, "ignore_remove") != NULL) {
rule->ignore_device = 1;
}
if (strstr(value, "ignore_remove") != NULL) {
- dbg("remove event should be ignored\n");
+ dbg(
rules->udev,
"remove event should be ignored\n");
rule->ignore_remove = 1;
}
pos = strstr(value, "link_priority=");
if (pos != NULL) {
rule->link_priority = atoi(&pos[strlen("link_priority=")]);
rule->ignore_remove = 1;
}
pos = strstr(value, "link_priority=");
if (pos != NULL) {
rule->link_priority = atoi(&pos[strlen("link_priority=")]);
- dbg("link priority=%i\n", rule->link_priority);
+ dbg(
rules->udev,
"link priority=%i\n", rule->link_priority);
}
pos = strstr(value, "event_timeout=");
if (pos != NULL) {
rule->event_timeout = atoi(&pos[strlen("event_timeout=")]);
}
pos = strstr(value, "event_timeout=");
if (pos != NULL) {
rule->event_timeout = atoi(&pos[strlen("event_timeout=")]);
- dbg("event timout=%i\n", rule->event_timeout);
+ dbg(
rules->udev,
"event timout=%i\n", rule->event_timeout);
}
pos = strstr(value, "string_escape=");
if (pos != NULL) {
}
pos = strstr(value, "string_escape=");
if (pos != NULL) {
@@
-621,18
+627,18
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
rule->string_escape = ESCAPE_REPLACE;
}
if (strstr(value, "all_partitions") != NULL) {
rule->string_escape = ESCAPE_REPLACE;
}
if (strstr(value, "all_partitions") != NULL) {
- dbg("creation of partition nodes requested\n");
+ dbg(
rules->udev,
"creation of partition nodes requested\n");
rule->partitions = DEFAULT_PARTITIONS_COUNT;
}
valid = 1;
continue;
}
rule->partitions = DEFAULT_PARTITIONS_COUNT;
}
valid = 1;
continue;
}
- err("unknown key '%s' in %s:%u\n", key, filename, lineno);
+ err(
rules->udev,
"unknown key '%s' in %s:%u\n", key, filename, lineno);
}
if (physdev && rule->wait_for.operation == KEY_OP_UNSET)
}
if (physdev && rule->wait_for.operation == KEY_OP_UNSET)
- err("PHYSDEV* values are deprecated and will be removed from a future kernel, \n"
+ err(
rules->udev,
"PHYSDEV* values are deprecated and will be removed from a future kernel, \n"
"please fix it in %s:%u", filename, lineno);
/* skip line if not any valid key was found */
"please fix it in %s:%u", filename, lineno);
/* skip line if not any valid key was found */
@@
-642,23
+648,23
@@
static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
/* grow buffer and add rule */
rule_size = sizeof(struct udev_rule) + rule->bufsize;
padding = (sizeof(size_t) - rule_size % sizeof(size_t)) % sizeof(size_t);
/* grow buffer and add rule */
rule_size = sizeof(struct udev_rule) + rule->bufsize;
padding = (sizeof(size_t) - rule_size % sizeof(size_t)) % sizeof(size_t);
- dbg("add %zi padding bytes\n", padding);
+ dbg(
rules->udev,
"add %zi padding bytes\n", padding);
rule_size += padding;
rule->bufsize += padding;
rules->buf = realloc(rules->buf, rules->bufsize + rule_size);
if (!rules->buf) {
rule_size += padding;
rule->bufsize += padding;
rules->buf = realloc(rules->buf, rules->bufsize + rule_size);
if (!rules->buf) {
- err("realloc failed\n");
+ err(
rules->udev,
"realloc failed\n");
goto exit;
}
goto exit;
}
- dbg("adding rule to offset %zi\n", rules->bufsize);
+ dbg(
rules->udev,
"adding rule to offset %zi\n", rules->bufsize);
memcpy(rules->buf + rules->bufsize, rule, rule_size);
rules->bufsize += rule_size;
exit:
return 0;
invalid:
memcpy(rules->buf + rules->bufsize, rule, rule_size);
rules->bufsize += rule_size;
exit:
return 0;
invalid:
- err("invalid rule '%s:%u'\n", filename, lineno);
+ err(
rules->udev,
"invalid rule '%s:%u'\n", filename, lineno);
return -1;
}
return -1;
}
@@
-674,10
+680,10
@@
static int parse_file(struct udev_rules *rules, const char *filename)
int retval = 0;
if (file_map(filename, &buf, &bufsize) != 0) {
int retval = 0;
if (file_map(filename, &buf, &bufsize) != 0) {
- err("can't open '%s' as rules file: %s\n", filename, strerror(errno));
+ err(
rules->udev,
"can't open '%s' as rules file: %s\n", filename, strerror(errno));
return -1;
}
return -1;
}
- info("reading '%s' as rules file\n", filename);
+ info(
rules->udev,
"reading '%s' as rules file\n", filename);
/* loop through the whole file */
cur = 0;
/* loop through the whole file */
cur = 0;
@@
-703,7
+709,7
@@
static int parse_file(struct udev_rules *rules, const char *filename)
continue;
if (count >= sizeof(line)) {
continue;
if (count >= sizeof(line)) {
- err("line too long, rule skipped '%s:%u'\n", filename, lineno);
+ err(
rules->udev,
"line too long, rule skipped '%s:%u'\n", filename, lineno);
continue;
}
continue;
}
@@
-716,7
+722,7
@@
static int parse_file(struct udev_rules *rules, const char *filename)
}
line[j] = '\0';
}
line[j] = '\0';
- dbg("read '%s'\n", line);
+ dbg(
rules->udev,
"read '%s'\n", line);
add_to_rules(rules, line, filename, lineno);
}
add_to_rules(rules, line, filename, lineno);
}
@@
-724,7
+730,7
@@
static int parse_file(struct udev_rules *rules, const char *filename)
return retval;
}
return retval;
}
-int udev_rules_init(struct udev_rules *rules, int resolve_names)
+int udev_rules_init(struct udev
*udev, struct udev
_rules *rules, int resolve_names)
{
struct stat statbuf;
char filename[PATH_MAX];
{
struct stat statbuf;
char filename[PATH_MAX];
@@
-735,28
+741,29
@@
int udev_rules_init(struct udev_rules *rules, int resolve_names)
int retval = 0;
memset(rules, 0x00, sizeof(struct udev_rules));
int retval = 0;
memset(rules, 0x00, sizeof(struct udev_rules));
+ rules->udev = udev;
rules->resolve_names = resolve_names;
rules->resolve_names = resolve_names;
- if (udev_
rules_dir[0] != '\0'
) {
+ if (udev_
get_rules_path(udev) != NULL
) {
/* custom rules location for testing */
/* custom rules location for testing */
- add_matching_files(
&name_list, udev_rules_dir
, ".rules");
+ add_matching_files(
udev, &name_list, udev_get_rules_path(udev)
, ".rules");
} else {
} else {
- /* read default rules */
- add_matching_files(&name_list, UDEV_PREFIX "/lib/udev/rules.d", ".rules");
-
/* read user/custom rules */
/* read user/custom rules */
- add_matching_files(
&sort
_list, SYSCONFDIR "/udev/rules.d", ".rules");
+ add_matching_files(
udev, &name
_list, SYSCONFDIR "/udev/rules.d", ".rules");
/* read dynamic/temporary rules */
/* read dynamic/temporary rules */
- strlcpy(filename, udev_
root
, sizeof(filename));
+ strlcpy(filename, udev_
get_dev_path(udev)
, sizeof(filename));
strlcat(filename, "/.udev/rules.d", sizeof(filename));
if (stat(filename, &statbuf) != 0) {
strlcat(filename, "/.udev/rules.d", sizeof(filename));
if (stat(filename, &statbuf) != 0) {
- create_path(filename);
- selinux_setfscreatecon(filename, NULL, S_IFDIR|0755);
+ create_path(
udev,
filename);
+ selinux_setfscreatecon(
udev,
filename, NULL, S_IFDIR|0755);
mkdir(filename, 0755);
mkdir(filename, 0755);
- selinux_resetfscreatecon();
+ selinux_resetfscreatecon(
udev
);
}
}
- add_matching_files(&sort_list, filename, ".rules");
+ add_matching_files(udev, &sort_list, filename, ".rules");
+
+ /* read default rules */
+ add_matching_files(udev, &sort_list, UDEV_PREFIX "/lib/udev/rules.d", ".rules");
/* sort all rules files by basename into list of files */
list_for_each_entry_safe(sort_loop, sort_tmp, &sort_list, node) {
/* sort all rules files by basename into list of files */
list_for_each_entry_safe(sort_loop, sort_tmp, &sort_list, node) {
@@
-771,10
+778,20
@@
int udev_rules_init(struct udev_rules *rules, int resolve_names)
if (name_base == NULL)
continue;
if (name_base == NULL)
continue;
+ if (strcmp(name_base, sort_base) == 0) {
+ info(udev, "rule file '%s' already added, ignoring '%s'\n",
+ name_loop->name, sort_loop->name);
+ list_del(&sort_loop->node);
+ free(sort_loop);
+ sort_loop = NULL;
+ continue;
+ }
+
if (strcmp(name_base, sort_base) > 0)
break;
}
if (strcmp(name_base, sort_base) > 0)
break;
}
- list_move_tail(&sort_loop->node, &name_loop->node);
+ if (sort_loop != NULL)
+ list_move_tail(&sort_loop->node, &name_loop->node);
}
}
}
}
@@
-784,9
+801,9
@@
int udev_rules_init(struct udev_rules *rules, int resolve_names)
if (statbuf.st_size)
parse_file(rules, name_loop->name);
else
if (statbuf.st_size)
parse_file(rules, name_loop->name);
else
- dbg("empty rules file '%s'\n", name_loop->name);
+ dbg(
udev,
"empty rules file '%s'\n", name_loop->name);
} else
} else
- err("could not read '%s': %s\n", name_loop->name, strerror(errno));
+ err(
udev,
"could not read '%s': %s\n", name_loop->name, strerror(errno));
list_del(&name_loop->node);
free(name_loop);
}
list_del(&name_loop->node);
free(name_loop);
}