chiark / gitweb /
udev: support ENV{}=="" global property matches
[elogind.git] / src / udev / udev-rules.c
index 2a691f6ab7e6021f0dce588b686d306241cf770b..093d68cf0cd1f67249995240e0a744102589ee5b 100644 (file)
@@ -474,9 +474,9 @@ static uid_t add_uid(struct udev_rules *rules, const char *owner) {
         r = get_user_creds(&owner, &uid, NULL, NULL, NULL);
         if (r < 0) {
                 if (r == -ENOENT || r == -ESRCH)
-                        udev_err(rules->udev, "specified user '%s' unknown\n", owner);
+                        log_error("specified user '%s' unknown\n", owner);
                 else
-                        udev_err(rules->udev, "error resolving user '%s': %s\n", owner, strerror(-r));
+                        log_error("error resolving user '%s': %s\n", owner, strerror(-r));
         }
 
         /* grow buffer if needed */
@@ -521,9 +521,9 @@ static gid_t add_gid(struct udev_rules *rules, const char *group) {
         r = get_group_creds(&group, &gid);
         if (r < 0) {
                 if (r == -ENOENT || r == -ESRCH)
-                        udev_err(rules->udev, "specified group '%s' unknown\n", group);
+                        log_error("specified group '%s' unknown\n", group);
                 else
-                        udev_err(rules->udev, "error resolving group '%s': %s\n", group, strerror(-r));
+                        log_error("error resolving group '%s': %s\n", group, strerror(-r));
         }
 
         /* grow buffer if needed */
@@ -1575,7 +1575,7 @@ invalid:
 }
 
 static int parse_file(struct udev_rules *rules, const char *filename) {
-        FILE *f;
+        _cleanup_fclose_ FILE *f = NULL;
         unsigned int first_token;
         unsigned int filename_off;
         char line[UTIL_LINE_SIZE];
@@ -1633,7 +1633,6 @@ static int parse_file(struct udev_rules *rules, const char *filename) {
                 }
                 add_rule(rules, key, filename, filename_off, line_nr);
         }
-        fclose(f);
 
         /* link GOTOs to LABEL rules in this file to be able to fast-forward */
         for (i = first_token+1; i < rules->token_cur; i++) {
@@ -1877,6 +1876,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                               struct udev_event *event,
                               usec_t timeout_usec,
                               usec_t timeout_warn_usec,
+                              struct udev_list *properties_list,
                               const sigset_t *sigmask) {
         struct token *cur;
         struct token *rule;
@@ -1942,7 +1942,18 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                         const char *value;
 
                         value = udev_device_get_property_value(event->dev, key_name);
-                        if (value == NULL)
+
+                        /* check global properties */
+                        if (!value && properties_list) {
+                                struct udev_list_entry *list_entry;
+
+                                list_entry = udev_list_get_entry(properties_list);
+                                list_entry = udev_list_entry_get_by_name(list_entry, key_name);
+                                if (list_entry != NULL)
+                                        value = udev_list_entry_get_value(list_entry);
+                        }
+
+                        if (!value)
                                 value = "";
                         if (match_key(rules, cur, value))
                                 goto nomatch;
@@ -2266,9 +2277,9 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                         r = get_user_creds(&ow, &event->uid, NULL, NULL, NULL);
                         if (r < 0) {
                                 if (r == -ENOENT || r == -ESRCH)
-                                        udev_err(event->udev, "specified user '%s' unknown\n", owner);
+                                        log_error("specified user '%s' unknown\n", owner);
                                 else
-                                        udev_err(event->udev, "error resolving user '%s': %s\n", owner, strerror(-r));
+                                        log_error("error resolving user '%s': %s\n", owner, strerror(-r));
 
                                 event->uid = 0;
                         }
@@ -2292,9 +2303,9 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                         r = get_group_creds(&gr, &event->gid);
                         if (r < 0) {
                                 if (r == -ENOENT || r == -ESRCH)
-                                        udev_err(event->udev, "specified group '%s' unknown\n", group);
+                                        log_error("specified group '%s' unknown\n", group);
                                 else
-                                        udev_err(event->udev, "error resolving group '%s': %s\n", group, strerror(-r));
+                                        log_error("error resolving group '%s': %s\n", group, strerror(-r));
 
                                 event->gid = 0;
                         }