chiark / gitweb /
remove debug output during rules parsing
[elogind.git] / udev / udev-rules.c
index 4f18acaa7886cc7b7964647353f76aad8a278e64..eb73221fa9026135847b9d60353bce30bf6fdf8d 100644 (file)
@@ -125,6 +125,7 @@ enum token_type {
        TK_M_DEVLINK,                   /* val */
        TK_M_NAME,                      /* val */
        TK_M_ENV,                       /* val, attr */
+       TK_M_TAG,                       /* val */
        TK_M_SUBSYSTEM,                 /* val */
        TK_M_DRIVER,                    /* val */
        TK_M_WAITFOR,                   /* val */
@@ -149,7 +150,6 @@ enum token_type {
        TK_A_STRING_ESCAPE_NONE,
        TK_A_STRING_ESCAPE_REPLACE,
        TK_A_INOTIFY_WATCH,             /* int */
-       TK_A_NUM_FAKE_PART,             /* int */
        TK_A_DEVLINK_PRIO,              /* int */
        TK_A_OWNER,                     /* val */
        TK_A_GROUP,                     /* val */
@@ -158,10 +158,10 @@ enum token_type {
        TK_A_GROUP_ID,                  /* gid_t */
        TK_A_MODE_ID,                   /* mode_t */
        TK_A_ENV,                       /* val, attr */
+       TK_A_TAG,                       /* val */
        TK_A_NAME,                      /* val */
        TK_A_DEVLINK,                   /* val */
        TK_A_EVENT_TIMEOUT,             /* int */
-       TK_A_IGNORE_REMOVE,
        TK_A_ATTR,                      /* val, attr */
        TK_A_RUN,                       /* val, bool */
        TK_A_GOTO,                      /* size_t */
@@ -255,6 +255,7 @@ static const char *token_str(enum token_type type)
                [TK_M_DEVLINK] =                "M DEVLINK",
                [TK_M_NAME] =                   "M NAME",
                [TK_M_ENV] =                    "M ENV",
+               [TK_M_TAG] =                    "M TAG",
                [TK_M_SUBSYSTEM] =              "M SUBSYSTEM",
                [TK_M_DRIVER] =                 "M DRIVER",
                [TK_M_WAITFOR] =                "M WAITFOR",
@@ -279,7 +280,6 @@ static const char *token_str(enum token_type type)
                [TK_A_STRING_ESCAPE_NONE] =     "A STRING_ESCAPE_NONE",
                [TK_A_STRING_ESCAPE_REPLACE] =  "A STRING_ESCAPE_REPLACE",
                [TK_A_INOTIFY_WATCH] =          "A INOTIFY_WATCH",
-               [TK_A_NUM_FAKE_PART] =          "A NUM_FAKE_PART",
                [TK_A_DEVLINK_PRIO] =           "A DEVLINK_PRIO",
                [TK_A_OWNER] =                  "A OWNER",
                [TK_A_GROUP] =                  "A GROUP",
@@ -288,10 +288,10 @@ static const char *token_str(enum token_type type)
                [TK_A_GROUP_ID] =               "A GROUP_ID",
                [TK_A_MODE_ID] =                "A MODE_ID",
                [TK_A_ENV] =                    "A ENV",
+               [TK_A_TAG] =                    "A ENV",
                [TK_A_NAME] =                   "A NAME",
                [TK_A_DEVLINK] =                "A DEVLINK",
                [TK_A_EVENT_TIMEOUT] =          "A EVENT_TIMEOUT",
-               [TK_A_IGNORE_REMOVE] =          "A IGNORE_REMOVE",
                [TK_A_ATTR] =                   "A ATTR",
                [TK_A_RUN] =                    "A RUN",
                [TK_A_GOTO] =                   "A GOTO",
@@ -358,9 +358,12 @@ static void dump_token(struct udev_rules *rules, struct token *token)
                dbg(rules->udev, "%s %s '%s' '%s'(%s)\n",
                    token_str(type), operation_str(op), attr, value, string_glob_str(glob));
                break;
+       case TK_M_TAG:
+       case TK_A_TAG:
+               dbg(rules->udev, "%s %s '%s'\n", token_str(type), operation_str(op), value);
+               break;
        case TK_A_STRING_ESCAPE_NONE:
        case TK_A_STRING_ESCAPE_REPLACE:
-       case TK_A_IGNORE_REMOVE:
                dbg(rules->udev, "%s\n", token_str(type));
                break;
        case TK_M_TEST:
@@ -1008,6 +1011,8 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
        case TK_A_MODE:
        case TK_A_NAME:
        case TK_A_GOTO:
+       case TK_M_TAG:
+       case TK_A_TAG:
                token->key.value_off = add_string(rule_tmp->rules, value);
                break;
        case TK_M_ENV:
@@ -1030,14 +1035,12 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
                break;
        case TK_A_STRING_ESCAPE_NONE:
        case TK_A_STRING_ESCAPE_REPLACE:
-       case TK_A_IGNORE_REMOVE:
                break;
        case TK_A_RUN:
                token->key.value_off = add_string(rule_tmp->rules, value);
                token->key.fail_on_error = *(int *)data;
                break;
        case TK_A_INOTIFY_WATCH:
-       case TK_A_NUM_FAKE_PART:
        case TK_A_DEVLINK_PRIO:
                token->key.devlink_prio = *(int *)data;
                break;
@@ -1357,6 +1360,14 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
+               if (strcmp(key, "TAG") == 0) {
+                       if (op < OP_MATCH_MAX)
+                               rule_add_key(&rule_tmp, TK_M_TAG, op, value, NULL);
+                       else
+                               rule_add_key(&rule_tmp, TK_A_TAG, op, value, NULL);
+                       continue;
+               }
+
                if (strcmp(key, "PROGRAM") == 0) {
                        rule_add_key(&rule_tmp, TK_M_PROGRAM, op, value, NULL);
                        continue;
@@ -1457,9 +1468,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        if (op < OP_MATCH_MAX) {
                                rule_add_key(&rule_tmp, TK_M_NAME, op, value, NULL);
                        } else {
-                               if (value[0] == '\0')
-                                       info(rules->udev, "name empty, node creation suppressed\n");
-                               else if (strcmp(value, "%k") == 0)
+                               if (strcmp(value, "%k") == 0)
                                        err(rules->udev, "NAME=\"%%k\" is superfluous and breaks "
                                            "kernel supplied names, please remove it from %s:%u\n", filename, lineno);
                                rule_add_key(&rule_tmp, TK_A_NAME, op, value, NULL);
@@ -2100,6 +2109,21 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                                        goto nomatch;
                                break;
                        }
+               case TK_M_TAG:
+                       {
+                               struct udev_list_entry *list_entry;
+                               bool match = false;
+
+                               udev_list_entry_foreach(list_entry, udev_device_get_tags_list_entry(event->dev)) {
+                                       if (strcmp(&rules->buf[cur->key.value_off], udev_list_entry_get_name(list_entry)) == 0) {
+                                               match = true;
+                                               break;
+                                       }
+                               }
+                               if (!match && (cur->key.op != OP_NOMATCH))
+                                       goto nomatch;
+                               break;
+                       }
                case TK_M_SUBSYSTEM:
                        if (match_key(rules, cur, udev_device_get_subsystem(event->dev)) != 0)
                                goto nomatch;
@@ -2415,6 +2439,11 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                                }
                                break;
                        }
+               case TK_A_TAG:
+                       if (cur->key.op == OP_ASSIGN || cur->key.op == OP_ASSIGN_FINAL)
+                               udev_device_cleanup_tags_list(event->dev);
+                       udev_device_add_tag(event->dev, &rules->buf[cur->key.value_off]);
+                       break;
                case TK_A_NAME:
                        {
                                const char *name  = &rules->buf[cur->key.value_off];