#include <stddef.h>
#include <limits.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
TK_M_RESULT, /* val */
TK_M_MAX,
- TK_A_IGNORE_DEVICE,
TK_A_STRING_ESCAPE_NONE,
TK_A_STRING_ESCAPE_REPLACE,
TK_A_INOTIFY_WATCH, /* int */
TK_A_ATTR, /* val, attr */
TK_A_RUN, /* val, bool */
TK_A_GOTO, /* size_t */
- TK_A_LAST_RULE,
TK_END,
};
[TK_M_RESULT] = "M RESULT",
[TK_M_MAX] = "M MAX",
- [TK_A_IGNORE_DEVICE] = "A IGNORE_DEVICE",
[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_ATTR] = "A ATTR",
[TK_A_RUN] = "A RUN",
[TK_A_GOTO] = "A GOTO",
- [TK_A_LAST_RULE] = "A LAST_RULE",
[TK_END] = "END",
};
dbg(rules->udev, "%s %s '%s' '%s'(%s)\n",
token_str(type), operation_str(op), attr, value, string_glob_str(glob));
break;
- case TK_A_IGNORE_DEVICE:
case TK_A_STRING_ESCAPE_NONE:
case TK_A_STRING_ESCAPE_REPLACE:
- case TK_A_LAST_RULE:
case TK_A_IGNORE_REMOVE:
dbg(rules->udev, "%s\n", token_str(type));
break;
if (data != NULL)
token->key.mode = *(mode_t *)data;
break;
- case TK_A_IGNORE_DEVICE:
case TK_A_STRING_ESCAPE_NONE:
case TK_A_STRING_ESCAPE_REPLACE:
case TK_A_IGNORE_REMOVE:
- case TK_A_LAST_RULE:
break;
case TK_A_RUN:
token->key.value_off = add_string(rule_tmp->rules, value);
char *linepos;
char *attr;
struct rule_tmp rule_tmp;
+ bool bus_warn = false;
+ bool sysfs_warn = false;
+ bool id_warn = false;
memset(&rule_tmp, 0x00, sizeof(struct rule_tmp));
rule_tmp.rules = rules;
continue;
}
- if (strcmp(key, "KERNELS") == 0 ||
- strcmp(key, "ID") == 0) {
+ if (strcmp(key, "KERNELS") == 0) {
if (op > OP_MATCH_MAX) {
err(rules->udev, "invalid KERNELS operation\n");
goto invalid;
continue;
}
- if (strcmp(key, "SUBSYSTEMS") == 0 ||
- strcmp(key, "BUS") == 0) {
+ if (strcmp(key, "ID") == 0) {
+ if (!id_warn) {
+ id_warn = true;
+ err(rules->udev, "ID= will be removed in a future udev version, "
+ "please use KERNEL= to match the event device, or KERNELS= "
+ "to match a parent device, in %s:%u\n", filename, lineno);
+ }
+ if (op > OP_MATCH_MAX) {
+ err(rules->udev, "invalid KERNELS operation\n");
+ goto invalid;
+ }
+ rule_add_key(&rule_tmp, TK_M_KERNELS, op, value, NULL);
+ continue;
+ }
+
+ if (strcmp(key, "SUBSYSTEMS") == 0) {
+ if (op > OP_MATCH_MAX) {
+ err(rules->udev, "invalid SUBSYSTEMS operation\n");
+ goto invalid;
+ }
+ rule_add_key(&rule_tmp, TK_M_SUBSYSTEMS, op, value, NULL);
+ continue;
+ }
+
+ if (strcmp(key, "BUS") == 0) {
+ if (!bus_warn) {
+ bus_warn = true;
+ err(rules->udev, "BUS= will be removed in a future udev version, "
+ "please use SUBSYSTEM= to match the event device, or SUBSYSTEMS= "
+ "to match a parent device, in %s:%u\n", filename, lineno);
+ }
if (op > OP_MATCH_MAX) {
err(rules->udev, "invalid SUBSYSTEMS operation\n");
goto invalid;
continue;
}
- if (strncmp(key, "ATTRS{", sizeof("ATTRS{")-1) == 0 ||
- strncmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
+ if (strncmp(key, "ATTRS{", sizeof("ATTRS{")-1) == 0) {
if (op > OP_MATCH_MAX) {
err(rules->udev, "invalid ATTRS operation\n");
goto invalid;
continue;
}
+ if (strncmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
+ if (!sysfs_warn) {
+ sysfs_warn = true;
+ err(rules->udev, "SYSFS{}= will be removed in a future udev version, "
+ "please use ATTR{}= to match the event device, or ATTRS{}= "
+ "to match a parent device, in %s:%u\n", filename, lineno);
+ }
+ if (op > OP_MATCH_MAX) {
+ err(rules->udev, "invalid ATTRS operation\n");
+ goto invalid;
+ }
+ attr = get_key_attribute(rules->udev, key + sizeof("ATTRS")-1);
+ if (attr == NULL) {
+ err(rules->udev, "error parsing ATTRS attribute\n");
+ goto invalid;
+ }
+ rule_add_key(&rule_tmp, TK_M_ATTRS, op, value, attr);
+ continue;
+ }
+
if (strncmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
attr = get_key_attribute(rules->udev, key + sizeof("ENV")-1);
if (attr == NULL) {
if (strcmp(key, "OPTIONS") == 0) {
const char *pos;
- if (strstr(value, "last_rule") != NULL) {
- dbg(rules->udev, "last rule to be applied\n");
- rule_add_key(&rule_tmp, TK_A_LAST_RULE, 0, NULL, NULL);
- }
- if (strstr(value, "ignore_device") != NULL) {
- dbg(rules->udev, "device should be ignored\n");
- rule_add_key(&rule_tmp, TK_A_IGNORE_DEVICE, 0, NULL, NULL);
- }
if (strstr(value, "ignore_remove") != NULL) {
dbg(rules->udev, "remove event should be ignored\n");
rule_add_key(&rule_tmp, TK_A_IGNORE_REMOVE, 0, NULL, NULL);
/* read dynamic/temporary rules */
util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
- if (stat(filename, &statbuf) != 0) {
- util_create_path(udev, filename);
- udev_selinux_setfscreatecon(udev, filename, S_IFDIR|0755);
- mkdir(filename, 0755);
- udev_selinux_resetfscreatecon(udev);
- }
udev_list_init(&sort_list);
add_matching_files(udev, &sort_list, filename, ".rules");
if (match_key(rules, cur, event->program_result) != 0)
goto nomatch;
break;
-
- case TK_A_IGNORE_DEVICE:
- event->ignore_device = 1;
- return 0;
- break;
case TK_A_STRING_ESCAPE_NONE:
esc = ESCAPE_NONE;
break;
break;
cur = &rules->tokens[cur->key.rule_goto];
continue;
- case TK_A_LAST_RULE:
case TK_END:
return 0;