chiark / gitweb /
info() PROGRAM and IMPORT execution
[elogind.git] / udev / udev-rules.c
index 226f35296dc763e1fa4c9612c6e02ddaeebb12d2..e07cd3264c4c0d5ae21ef961b5b76d78160941d0 100644 (file)
@@ -1631,7 +1631,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
 
                        if (sort_base == NULL)
                                continue;
-
+                       /* sort entry into existing list */
                        udev_list_entry_foreach_safe(file_loop, file_tmp, udev_list_get_entry(&file_list)) {
                                const char *file_name = udev_list_entry_get_name(file_loop);
                                const char *file_base = strrchr(file_name, '/');
@@ -1641,15 +1641,24 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
                                if (strcmp(file_base, sort_base) == 0) {
                                        info(udev, "rule file basename '%s' already added, ignoring '%s'\n",
                                             file_name, sort_name);
-                                       udev_list_entry_remove(sort_loop);
+                                       udev_list_entry_delete(sort_loop);
                                        sort_loop = NULL;
                                        break;
                                }
-                               if (strcmp(file_base, sort_base) > 0)
+                               if (strcmp(file_base, sort_base) > 0) {
+                                       /* found later file, insert before */
+                                       udev_list_entry_remove(sort_loop);
+                                       udev_list_entry_insert_before(sort_loop, file_loop);
+                                       sort_loop = NULL;
                                        break;
+                               }
                        }
-                       if (sort_loop != NULL)
-                               udev_list_entry_move_before(sort_loop, file_loop);
+                       /* current file already handled */
+                       if (sort_loop == NULL)
+                               continue;
+                       /* no later file, append to end of list */
+                       udev_list_entry_remove(sort_loop);
+                       udev_list_entry_append(sort_loop, &file_list);
                }
        }
 
@@ -1673,7 +1682,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
                        parse_file(rules, filename, filename_off);
                else
                        info(udev, "can not read '%s'\n", filename);
-               udev_list_entry_remove(file_loop);
+               udev_list_entry_delete(file_loop);
        }
 
        memset(&end_token, 0x00, sizeof(struct token));
@@ -2064,6 +2073,10 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                                util_strlcpy(program, &rules->buf[cur->key.value_off], sizeof(program));
                                udev_event_apply_format(event, program, sizeof(program));
                                envp = udev_device_get_properties_envp(event->dev);
+                               info(event->udev, "PROGRAM '%s' %s:%u\n",
+                                    program,
+                                    &rules->buf[rule->rule.filename_off],
+                                    rule->rule.filename_line);
                                if (util_run_program(event->udev, program, envp, result, sizeof(result), NULL) != 0) {
                                        if (cur->key.op != OP_NOMATCH)
                                                goto nomatch;
@@ -2100,6 +2113,10 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
 
                                util_strlcpy(import, &rules->buf[cur->key.value_off], sizeof(import));
                                udev_event_apply_format(event, import, sizeof(import));
+                               info(event->udev, "IMPORT '%s' %s:%u\n",
+                                    import,
+                                    &rules->buf[rule->rule.filename_off],
+                                    rule->rule.filename_line);
                                if (import_program_into_properties(event->dev, import) != 0)
                                        if (cur->key.op != OP_NOMATCH)
                                                goto nomatch;