chiark / gitweb /
build-sys: use use ${ac_default_prefix}
[elogind.git] / udev / udev-rules.c
index 0de44054b75b29401e85272f67ce12d4942ae238..7e795451241e4a71bedd1171bbd48034900fb818 100644 (file)
@@ -1750,6 +1750,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
        struct udev_list file_list;
        struct udev_list_entry *file_loop;
        struct token end_token;
+       char **s;
 
        rules = calloc(1, sizeof(struct udev_rules));
        if (rules == NULL)
@@ -1791,22 +1792,8 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
        memset(rules->trie_nodes, 0x00, sizeof(struct trie_node));
        rules->trie_nodes_cur = 1;
 
-       if (udev_get_rules_path(udev) == NULL) {
-               char filename[UTIL_PATH_SIZE];
-
-               /* /usr/lib/udev -- system rules */
-               add_matching_files(udev, &file_list, LIBEXECDIR "/rules.d", ".rules");
-
-               /* /etc/udev -- local administration rules */
-               add_matching_files(udev, &file_list, SYSCONFDIR "/udev/rules.d", ".rules");
-
-               /* /run/udev -- runtime rules */
-               util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/rules.d", NULL);
-               add_matching_files(udev, &file_list, filename, ".rules");
-       } else {
-               /* custom rules files location for testing */
-               add_matching_files(udev, &file_list, udev_get_rules_path(udev), ".rules");
-       }
+       for (udev_get_rules_path(udev, &s, NULL); *s != NULL; s++)
+               add_matching_files(udev, &file_list, *s, ".rules");
 
        /* add all filenames to the string buffer */
        udev_list_entry_foreach(file_loop, udev_list_get_entry(&file_list)) {
@@ -1890,16 +1877,17 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
        return rules;
 }
 
-void udev_rules_unref(struct udev_rules *rules)
+struct udev_rules *udev_rules_unref(struct udev_rules *rules)
 {
        if (rules == NULL)
-               return;
+               return NULL;
        free(rules->tokens);
        free(rules->buf);
        free(rules->trie_nodes);
        free(rules->uids);
        free(rules->gids);
        free(rules);
+       return NULL;
 }
 
 static int match_key(struct udev_rules *rules, struct token *token, const char *val)
@@ -2304,7 +2292,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                        break;
                }
                case TK_M_IMPORT_BUILTIN: {
-                       const char *command = &rules->buf[cur->key.value_off];
+                       char command[UTIL_PATH_SIZE];
 
                        if (udev_builtin_run_once(cur->key.builtin_cmd)) {
                                /* check if we ran already */
@@ -2322,10 +2310,13 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                                /* mark as ran */
                                event->builtin_run |= (1 << cur->key.builtin_cmd);
                        }
+
+                       udev_event_apply_format(event, &rules->buf[cur->key.value_off], command, sizeof(command));
                        info(event->udev, "IMPORT builtin '%s' %s:%u\n",
                             udev_builtin_name(cur->key.builtin_cmd),
                             &rules->buf[rule->rule.filename_off],
                             rule->rule.filename_line);
+
                        if (udev_builtin_run(event->dev, cur->key.builtin_cmd, command, false) != 0) {
                                /* remember failure */
                                info(rules->udev, "IMPORT builtin '%s' returned non-zero\n",
@@ -2513,9 +2504,6 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                             &rules->buf[rule->rule.filename_off],
                             rule->rule.filename_line);
                        break;
-               case TK_A_STATIC_NODE:
-                       event->static_node = true;
-                       break;
                case TK_A_ENV: {
                        const char *name = &rules->buf[cur->key.attr_off];
                        char *value = &rules->buf[cur->key.value_off];
@@ -2738,8 +2726,6 @@ void udev_rules_apply_static_dev_perms(struct udev_rules *rules)
                                else
                                        mode = 0600;
                        }
-                       /* set sticky bit, so we do not remove the node on module unload */
-                       mode |= 01000;
                        if (mode != (stats.st_mode & 01777)) {
                                chmod(filename, mode);
                                info(rules->udev, "chmod '%s' %#o\n", filename, mode);