Lines Matching full:rules
52 UDEV_CONF_DIR "/rules.d",
54 UDEV_ROOT_RUN "/udev/rules.d",
55 UDEV_LIBEXEC_DIR "/rules.d",
57 "/lib/udev/rules.d",
58 "/usr/lib/udev/rules.d",
67 /* every key in the rules file becomes a token */
84 static char *rules_str(struct udev_rules *rules, unsigned int off) { in rules_str() argument
85 return rules->strbuf->buf + off; in rules_str()
88 static unsigned int rules_add_string(struct udev_rules *rules, const char *s) { in rules_add_string() argument
89 return strbuf_add_string(rules->strbuf, s, strlen(s)); in rules_add_string()
222 struct udev_rules *rules; member
324 static void dump_token(struct udev_rules *rules, struct token *token) { in dump_token() argument
328 const char *value = str(rules, token->key.value_off); in dump_token()
329 const char *attr = &rules->buf[token->key.attr_off]; in dump_token()
334 const char *tks_ptr = (char *)rules->tokens; in dump_token()
339 &rules->buf[token->rule.filename_off], token->rule.filename_line, in dump_token()
341 &rules->buf[token->rule.label_off]); in dump_token()
435 static void dump_rules(struct udev_rules *rules) { in dump_rules() argument
439 rules->token_cur, in dump_rules()
440 rules->token_cur * sizeof(struct token), in dump_rules()
441 rules->buf_count, in dump_rules()
442 rules->buf_cur); in dump_rules()
443 for (i = 0; i < rules->token_cur; i++) in dump_rules()
444 dump_token(rules, &rules->tokens[i]); in dump_rules()
447 static inline void dump_token(struct udev_rules *rules, struct token *token) {} in dump_token() argument
448 static inline void dump_rules(struct udev_rules *rules) {} in dump_rules() argument
451 static int add_token(struct udev_rules *rules, struct token *token) { in add_token() argument
453 if (rules->token_cur+1 >= rules->token_max) { in add_token()
458 add = rules->token_max; in add_token()
462 tokens = realloc(rules->tokens, (rules->token_max + add ) * sizeof(struct token)); in add_token()
465 rules->tokens = tokens; in add_token()
466 rules->token_max += add; in add_token()
468 memcpy(&rules->tokens[rules->token_cur], token, sizeof(struct token)); in add_token()
469 rules->token_cur++; in add_token()
473 static uid_t add_uid(struct udev_rules *rules, const char *owner) { in add_uid() argument
480 for (i = 0; i < rules->uids_cur; i++) { in add_uid()
481 off = rules->uids[i].name_off; in add_uid()
482 if (streq(rules_str(rules, off), owner)) { in add_uid()
483 uid = rules->uids[i].uid; in add_uid()
496 if (rules->uids_cur+1 >= rules->uids_max) { in add_uid()
501 add = rules->uids_max; in add_uid()
505 uids = realloc(rules->uids, (rules->uids_max + add ) * sizeof(struct uid_gid)); in add_uid()
508 rules->uids = uids; in add_uid()
509 rules->uids_max += add; in add_uid()
511 rules->uids[rules->uids_cur].uid = uid; in add_uid()
512 off = rules_add_string(rules, owner); in add_uid()
515 rules->uids[rules->uids_cur].name_off = off; in add_uid()
516 rules->uids_cur++; in add_uid()
520 static gid_t add_gid(struct udev_rules *rules, const char *group) { in add_gid() argument
527 for (i = 0; i < rules->gids_cur; i++) { in add_gid()
528 off = rules->gids[i].name_off; in add_gid()
529 if (streq(rules_str(rules, off), group)) { in add_gid()
530 gid = rules->gids[i].gid; in add_gid()
543 if (rules->gids_cur+1 >= rules->gids_max) { in add_gid()
548 add = rules->gids_max; in add_gid()
552 gids = realloc(rules->gids, (rules->gids_max + add ) * sizeof(struct uid_gid)); in add_gid()
555 rules->gids = gids; in add_gid()
556 rules->gids_max += add; in add_gid()
558 rules->gids[rules->gids_cur].gid = gid; in add_gid()
559 off = rules_add_string(rules, group); in add_gid()
562 rules->gids[rules->gids_cur].name_off = off; in add_gid()
563 rules->gids_cur++; in add_gid()
905 token->key.value_off = rules_add_string(rule_tmp->rules, value); in rule_add_key()
908 token->key.value_off = rules_add_string(rule_tmp->rules, value); in rule_add_key()
920 token->key.value_off = rules_add_string(rule_tmp->rules, value); in rule_add_key()
921 token->key.attr_off = rules_add_string(rule_tmp->rules, attr); in rule_add_key()
924 token->key.value_off = rules_add_string(rule_tmp->rules, value); in rule_add_key()
935 token->key.value_off = rules_add_string(rule_tmp->rules, value); in rule_add_key()
961 /* check if we need to split or call fnmatch() while matching rules */ in rule_add_key()
1013 static int sort_token(struct udev_rules *rules, struct rule_tmp *rule_tmp) { in sort_token() argument
1034 if (add_token(rules, &rule_tmp->token[next_idx]) != 0) in sort_token()
1047 static int add_rule(struct udev_rules *rules, char *line, in add_rule() argument
1054 rule_tmp.rules = rules; in add_rule()
1067 if (get_key(rules->udev, &linepos, &key, &op, &value) != 0) { in add_rule()
1144 attr = get_key_attribute(rules->udev, key + strlen("ATTR")); in add_rule()
1161 attr = get_key_attribute(rules->udev, key + strlen("SYSCTL")); in add_rule()
1178 attr = get_key_attribute(rules->udev, key + strlen("SECLABEL")); in add_rule()
1224 attr = get_key_attribute(rules->udev, key + strlen("ATTRS")); in add_rule()
1249 attr = get_key_attribute(rules->udev, key + strlen("ENV")); in add_rule()
1316 attr = get_key_attribute(rules->udev, key + strlen("IMPORT")); in add_rule()
1366 attr = get_key_attribute(rules->udev, key + strlen("TEST")); in add_rule()
1377 attr = get_key_attribute(rules->udev, key + strlen("RUN")); in add_rule()
1417 rule_tmp.rule.rule.label_off = rules_add_string(rules, value); in add_rule()
1479 } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) { in add_rule()
1480 uid = add_uid(rules, value); in add_rule()
1482 } else if (rules->resolve_names >= 0) { in add_rule()
1501 } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) { in add_rule()
1502 gid = add_gid(rules, value); in add_rule()
1504 } else if (rules->resolve_names >= 0) { in add_rule()
1586 if (add_token(rules, &rule_tmp.rule) != 0) in add_rule()
1590 if (sort_token(rules, &rule_tmp) != 0) in add_rule()
1599 static int parse_file(struct udev_rules *rules, const char *filename) { in parse_file() argument
1619 log_debug("Reading rules file: %s", filename); in parse_file()
1621 first_token = rules->token_cur; in parse_file()
1622 filename_off = rules_add_string(rules, filename); in parse_file()
1656 add_rule(rules, key, filename, filename_off, line_nr); in parse_file()
1659 /* link GOTOs to LABEL rules in this file to be able to fast-forward */ in parse_file()
1660 for (i = first_token+1; i < rules->token_cur; i++) { in parse_file()
1661 if (rules->tokens[i].type == TK_A_GOTO) { in parse_file()
1662 char *label = rules_str(rules, rules->tokens[i].key.value_off); in parse_file()
1665 for (j = i+1; j < rules->token_cur; j++) { in parse_file()
1666 if (rules->tokens[j].type != TK_RULE) in parse_file()
1668 if (rules->tokens[j].rule.label_off == 0) in parse_file()
1670 … if (!streq(label, rules_str(rules, rules->tokens[j].rule.label_off))) in parse_file()
1672 rules->tokens[i].key.rule_goto = j; in parse_file()
1675 if (rules->tokens[i].key.rule_goto == 0) in parse_file()
1683 struct udev_rules *rules; in udev_rules_new() local
1689 rules = new0(struct udev_rules, 1); in udev_rules_new()
1690 if (rules == NULL) in udev_rules_new()
1692 rules->udev = udev; in udev_rules_new()
1693 rules->resolve_names = resolve_names; in udev_rules_new()
1697 rules->tokens = malloc(PREALLOC_TOKEN * sizeof(struct token)); in udev_rules_new()
1698 if (rules->tokens == NULL) in udev_rules_new()
1699 return udev_rules_unref(rules); in udev_rules_new()
1700 rules->token_max = PREALLOC_TOKEN; in udev_rules_new()
1702 rules->strbuf = strbuf_new(); in udev_rules_new()
1703 if (!rules->strbuf) in udev_rules_new()
1704 return udev_rules_unref(rules); in udev_rules_new()
1706 udev_rules_check_timestamp(rules); in udev_rules_new()
1708 r = conf_files_list_strv(&files, ".rules", NULL, rules_dirs); in udev_rules_new()
1710 log_error_errno(r, "failed to enumerate rules files: %m"); in udev_rules_new()
1711 return udev_rules_unref(rules); in udev_rules_new()
1715 * The offset value in the rules strct is limited; add all in udev_rules_new()
1716 * rules file names to the beginning of the string buffer. in udev_rules_new()
1719 rules_add_string(rules, *f); in udev_rules_new()
1722 parse_file(rules, *f); in udev_rules_new()
1728 add_token(rules, &end_token); in udev_rules_new()
1729 log_debug("rules contain %zu bytes tokens (%u * %zu bytes), %zu bytes strings", in udev_rules_new()
1730 …rules->token_max * sizeof(struct token), rules->token_max, sizeof(struct token), rules->strbuf->le… in udev_rules_new()
1734 rules->strbuf->in_count, rules->strbuf->in_len, in udev_rules_new()
1735 rules->strbuf->dedup_count, rules->strbuf->dedup_len, rules->strbuf->nodes_count); in udev_rules_new()
1736 strbuf_complete(rules->strbuf); in udev_rules_new()
1739 free(rules->uids); in udev_rules_new()
1740 rules->uids = NULL; in udev_rules_new()
1741 rules->uids_cur = 0; in udev_rules_new()
1742 rules->uids_max = 0; in udev_rules_new()
1743 free(rules->gids); in udev_rules_new()
1744 rules->gids = NULL; in udev_rules_new()
1745 rules->gids_cur = 0; in udev_rules_new()
1746 rules->gids_max = 0; in udev_rules_new()
1748 dump_rules(rules); in udev_rules_new()
1749 return rules; in udev_rules_new()
1752 struct udev_rules *udev_rules_unref(struct udev_rules *rules) { in udev_rules_unref() argument
1753 if (rules == NULL) in udev_rules_unref()
1755 free(rules->tokens); in udev_rules_unref()
1756 strbuf_cleanup(rules->strbuf); in udev_rules_unref()
1757 free(rules->uids); in udev_rules_unref()
1758 free(rules->gids); in udev_rules_unref()
1759 free(rules); in udev_rules_unref()
1763 bool udev_rules_check_timestamp(struct udev_rules *rules) { in udev_rules_check_timestamp() argument
1764 if (!rules) in udev_rules_check_timestamp()
1767 return paths_check_timestamp(rules_dirs, &rules->dirs_ts_usec, true); in udev_rules_check_timestamp()
1770 static int match_key(struct udev_rules *rules, struct token *token, const char *val) { in match_key() argument
1771 char *key_value = rules_str(rules, token->key.value_off); in match_key()
1790 s = rules_str(rules, token->key.value_off); in match_key()
1814 strscpy(value, sizeof(value), rules_str(rules, token->key.value_off)); in match_key()
1843 static int match_attr(struct udev_rules *rules, struct udev_device *dev, struct udev_event *event, … in match_attr() argument
1850 name = rules_str(rules, cur->key.attr_off); in match_attr()
1876 key_value = rules_str(rules, cur->key.value_off); in match_attr()
1888 return match_key(rules, cur, value); in match_attr()
1897 int udev_rules_apply_to_event(struct udev_rules *rules, in udev_rules_apply_to_event() argument
1908 if (rules->tokens == NULL) in udev_rules_apply_to_event()
1916 cur = &rules->tokens[0]; in udev_rules_apply_to_event()
1919 dump_token(rules, cur); in udev_rules_apply_to_event()
1924 … /* possibly skip rules which want to set NAME, SYMLINK, OWNER, GROUP, MODE */ in udev_rules_apply_to_event()
1930 if (match_key(rules, cur, udev_device_get_action(event->dev)) != 0) in udev_rules_apply_to_event()
1934 if (match_key(rules, cur, udev_device_get_devpath(event->dev)) != 0) in udev_rules_apply_to_event()
1938 if (match_key(rules, cur, udev_device_get_sysname(event->dev)) != 0) in udev_rules_apply_to_event()
1949 if (match_key(rules, cur, devlink) == 0) { in udev_rules_apply_to_event()
1959 if (match_key(rules, cur, event->name) != 0) in udev_rules_apply_to_event()
1963 const char *key_name = rules_str(rules, cur->key.attr_off); in udev_rules_apply_to_event()
1980 if (match_key(rules, cur, value)) in udev_rules_apply_to_event()
1989 … if (streq(rules_str(rules, cur->key.value_off), udev_list_entry_get_name(list_entry))) { in udev_rules_apply_to_event()
1999 if (match_key(rules, cur, udev_device_get_subsystem(event->dev)) != 0) in udev_rules_apply_to_event()
2003 if (match_key(rules, cur, udev_device_get_driver(event->dev)) != 0) in udev_rules_apply_to_event()
2010 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), filename, sizeof(filename), f… in udev_rules_apply_to_event()
2017 if (match_attr(rules, event->dev, event, cur) != 0) in udev_rules_apply_to_event()
2025 …udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename), fa… in udev_rules_apply_to_event()
2033 if (match_key(rules, cur, value) != 0) in udev_rules_apply_to_event()
2056 dump_token(rules, key); in udev_rules_apply_to_event()
2059 … if (match_key(rules, key, udev_device_get_sysname(event->dev_parent)) != 0) in udev_rules_apply_to_event()
2063 … if (match_key(rules, key, udev_device_get_subsystem(event->dev_parent)) != 0) in udev_rules_apply_to_event()
2067 … if (match_key(rules, key, udev_device_get_driver(event->dev_parent)) != 0) in udev_rules_apply_to_event()
2071 … if (match_attr(rules, event->dev_parent, event, key) != 0) in udev_rules_apply_to_event()
2075 … bool match = udev_device_has_tag(event->dev_parent, rules_str(rules, cur->key.value_off)); in udev_rules_apply_to_event()
2103 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), filename, sizeof(filename), f… in udev_rules_apply_to_event()
2131 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), program, sizeof(program), fal… in udev_rules_apply_to_event()
2135 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2159 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false… in udev_rules_apply_to_event()
2168 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false… in udev_rules_apply_to_event()
2171 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2187 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2199 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), command, sizeof(command), fal… in udev_rules_apply_to_event()
2202 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2216 const char *key = rules_str(rules, cur->key.value_off); in udev_rules_apply_to_event()
2237 const char *key = rules_str(rules, cur->key.value_off); in udev_rules_apply_to_event()
2269 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false… in udev_rules_apply_to_event()
2276 if (match_key(rules, cur, event->program_result) != 0) in udev_rules_apply_to_event()
2307 … udev_event_apply_format(event, rules_str(rules, cur->key.value_off), owner, sizeof(owner), false); in udev_rules_apply_to_event()
2320 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2333 … udev_event_apply_format(event, rules_str(rules, cur->key.value_off), group, sizeof(group), false); in udev_rules_apply_to_event()
2346 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2357 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), mode_str, sizeof(mode_str), f… in udev_rules_apply_to_event()
2369 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2382 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2394 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2406 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2412 name = rules_str(rules, cur->key.attr_off); in udev_rules_apply_to_event()
2413 label = rules_str(rules, cur->key.value_off); in udev_rules_apply_to_event()
2419 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2424 const char *name = rules_str(rules, cur->key.attr_off); in udev_rules_apply_to_event()
2425 char *value = rules_str(rules, cur->key.value_off); in udev_rules_apply_to_event()
2454 … udev_event_apply_format(event, rules_str(rules, cur->key.value_off), tag, sizeof(tag), false); in udev_rules_apply_to_event()
2473 const char *name = rules_str(rules, cur->key.value_off); in udev_rules_apply_to_event()
2492 … rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); in udev_rules_apply_to_event()
2499 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2519 …udev_event_apply_format(event, rules_str(rules, cur->key.value_off), temp, sizeof(temp), esc != ES… in udev_rules_apply_to_event()
2533 … rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); in udev_rules_apply_to_event()
2543 … rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); in udev_rules_apply_to_event()
2550 const char *key_name = rules_str(rules, cur->key.attr_off); in udev_rules_apply_to_event()
2559 … udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value), false); in udev_rules_apply_to_event()
2561 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2578 …udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename), fa… in udev_rules_apply_to_event()
2580 … udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value), false); in udev_rules_apply_to_event()
2582 … rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); in udev_rules_apply_to_event()
2595 rules_str(rules, cur->key.value_off), in udev_rules_apply_to_event()
2596 rules_str(rules, rule->rule.filename_off), in udev_rules_apply_to_event()
2598 … entry = udev_list_entry_add(&event->run_list, rules_str(rules, cur->key.value_off), NULL); in udev_rules_apply_to_event()
2605 cur = &rules->tokens[cur->key.rule_goto]; in udev_rules_apply_to_event()
2626 int udev_rules_apply_static_dev_perms(struct udev_rules *rules) { in udev_rules_apply_static_dev_perms() argument
2638 if (rules->tokens == NULL) in udev_rules_apply_static_dev_perms()
2641 cur = &rules->tokens[0]; in udev_rules_apply_static_dev_perms()
2649 /* skip rules without a static_node tag */ in udev_rules_apply_static_dev_perms()
2669 r = strv_extend(&tags, rules_str(rules, cur->key.value_off)); in udev_rules_apply_static_dev_perms()
2685 … strscpyl(device_node, sizeof(device_node), "/dev/", rules_str(rules, cur->key.value_off), NULL); in udev_rules_apply_static_dev_perms()
2701 … unescaped_filename = xescape(rules_str(rules, cur->key.value_off), "/."); in udev_rules_apply_static_dev_perms()
2772 /* function to return the count of rules that assign NAME= to a value matching arg#2 - returns 0,1 …
2773 int udev_rules_assigning_name_to(struct udev_rules *rules, const char *match_name) in udev_rules_assigning_name_to() argument
2780 if (rules->tokens == NULL) in udev_rules_assigning_name_to()
2784 cur = &rules->tokens[0]; in udev_rules_assigning_name_to()
2787 dump_token(rules, cur); in udev_rules_assigning_name_to()
2796 if (match_key(rules, cur, "net") != 0) in udev_rules_assigning_name_to()
2800 if (match_key(rules, cur, "add") != 0) in udev_rules_assigning_name_to()
2804 const char *name = rules_str(rules, cur->key.value_off); in udev_rules_assigning_name_to()
2815 rules_str(rules, rule->rule.filename_off), in udev_rules_assigning_name_to()