summaryrefslogtreecommitdiff
path: root/src/udev/udev-rules.c
diff options
context:
space:
mode:
authorIan Stakenvicius <axs@gentoo.org>2015-09-22 13:53:41 -0400
committerIan Stakenvicius <axs@gentoo.org>2015-09-25 12:38:07 -0400
commit305f0eef4de67c09598271caf1d19c5436cd40d7 (patch)
tree6f822c59180e10f4e742536bb32e3fbe763d9aa3 /src/udev/udev-rules.c
parent389b9ce2288eecbbefabc0c486b5979f2be3d8ae (diff)
Forward-ported network rule-generator code from eudev-1.10eudev/v3.1.4
Diffstat (limited to 'src/udev/udev-rules.c')
-rw-r--r--src/udev/udev-rules.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index c5e85faaaf..e2bb99ca7d 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -2755,3 +2755,69 @@ finish:
return r;
}
+
+#ifdef ENABLE_RULE_GENERATOR
+/* function to return the count of rules that assign NAME= to a value matching arg#2 - returns 0,1 */
+int udev_rules_assigning_name_to(struct udev_rules *rules, const char *match_name)
+{
+ struct token *cur;
+ struct token *rule;
+ enum escape_type esc = ESCAPE_UNSET;
+ bool name_final = false;
+
+ if (rules->tokens == NULL)
+ return 0;
+
+ /* loop through token list, match, run actions or forward to next rule */
+ cur = &rules->tokens[0];
+ rule = cur;
+ for (;;) {
+ dump_token(rules, cur);
+ switch (cur->type) {
+ case TK_RULE:
+ /* current rule */
+ rule = cur;
+ if (!rule->rule.can_set_name)
+ goto nomatch;
+ break;
+ case TK_M_SUBSYSTEM:
+ if (match_key(rules, cur, "net") != 0)
+ goto nomatch;
+ break;
+ case TK_M_ACTION:
+ if (match_key(rules, cur, "add") != 0)
+ goto nomatch;
+ break;
+ case TK_A_NAME: {
+ const char *name = rules_str(rules, cur->key.value_off);
+ char name_str[UTIL_PATH_SIZE];
+ int count;
+
+ strscpy(name_str,UTIL_PATH_SIZE,name);
+ count = util_replace_chars(name_str, "/");
+ if (count > 0)
+ log_debug("%i character(s) replaced\n", count);
+ if (streq(name_str,match_name)) {
+ log_debug("found a match! NAME assigns %s in: %s:%u\n",
+ name,
+ rules_str(rules, rule->rule.filename_off),
+ rule->rule.filename_line);
+ return 1; /* no need to find more than one */
+ }
+
+ /* skip to next rule */
+ goto nomatch;
+ }
+ case TK_END:
+ return 0;
+ }
+
+ cur++;
+ continue;
+ nomatch:
+ /* fast-forward to next rule */
+ cur = rule + rule->rule.token_count;
+ }
+}
+#endif
+