chiark / gitweb /
udevd: use enum instead of char in struct declaration
[elogind.git] / udev / udev-rules.c
index da1d32203761e7054330bc93b9fb9be283f3ba43..4e760a517683563e3a538f1d8c2ffc4dd2117696 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2008-2009 Kay Sievers <kay.sievers@vrfy.org>
  * Copyright (C) 2008 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
  *
  * This program is free software: you can redistribute it and/or modify
@@ -103,7 +103,6 @@ enum string_glob_type {
        GL_SPLIT,                       /* multi-value A|B */
        GL_SPLIT_GLOB,                  /* multi-value with glob A*|B* */
        GL_SOMETHING,                   /* commonly used "?*" */
-       GL_FORMAT,
 };
 
 /* tokens of a rule are sorted/handled in this order */
@@ -167,7 +166,7 @@ struct token {
        union {
                unsigned char type;             /* same as in rule and key */
                struct {
-                       unsigned char type;
+                       enum token_type type:8;
                        unsigned char flags;
                        unsigned short token_count;
                        unsigned int label_off;
@@ -175,10 +174,10 @@ struct token {
                        unsigned short filename_line;
                } rule;
                struct {
-                       unsigned char type;
+                       enum token_type type:8;
+                       enum operation_type op:8;
+                       enum string_glob_type glob:8;
                        unsigned char flags;
-                       unsigned char op;
-                       unsigned char glob;
                        unsigned int value_off;
                        union {
                                unsigned int attr_off;
@@ -230,7 +229,6 @@ static const char *string_glob_str(enum string_glob_type type)
                [GL_SPLIT] =            "split",
                [GL_SPLIT_GLOB] =       "split-glob",
                [GL_SOMETHING] =        "split-glob",
-               [GL_FORMAT] =           "format",
        };
 
        return string_glob_strs[type];
@@ -1056,29 +1054,23 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
        }
 
        glob = GL_PLAIN;
-       if (value != NULL) {
-               if (type < TK_M_MAX) {
-                       /* check if we need to split or call fnmatch() while matching rules */
-                       int has_split;
-                       int has_glob;
-
-                       has_split = (strchr(value, '|') != NULL);
-                       has_glob = (strchr(value, '*') != NULL || strchr(value, '?') != NULL ||
-                                   strchr(value, '[') != NULL || strchr(value, ']') != NULL);
-                       if (has_split && has_glob) {
-                               glob = GL_SPLIT_GLOB;
-                       } else if (has_split) {
-                               glob = GL_SPLIT;
-                       } else if (has_glob) {
-                               if (strcmp(value, "?*") == 0)
-                                       glob = GL_SOMETHING;
-                               else
-                                       glob = GL_GLOB;
-                       }
-               } else {
-                       /* check if we need to substitute format strings for matching rules */
-                       if (strchr(value, '%') != NULL || strchr(value, '$') != NULL)
-                               glob = GL_FORMAT;
+       if (value != NULL && type < TK_M_MAX) {
+               /* check if we need to split or call fnmatch() while matching rules */
+               int has_split;
+               int has_glob;
+
+               has_split = (strchr(value, '|') != NULL);
+               has_glob = (strchr(value, '*') != NULL || strchr(value, '?') != NULL ||
+                           strchr(value, '[') != NULL || strchr(value, ']') != NULL);
+               if (has_split && has_glob) {
+                       glob = GL_SPLIT_GLOB;
+               } else if (has_split) {
+                       glob = GL_SPLIT;
+               } else if (has_glob) {
+                       if (strcmp(value, "?*") == 0)
+                               glob = GL_SOMETHING;
+                       else
+                               glob = GL_GLOB;
                }
        }
 
@@ -1150,7 +1142,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                if (get_key(rules->udev, &linepos, &key, &op, &value) != 0)
                        break;
 
-               if (strcasecmp(key, "ACTION") == 0) {
+               if (strcmp(key, "ACTION") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid ACTION operation\n");
                                goto invalid;
@@ -1159,7 +1151,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "DEVPATH") == 0) {
+               if (strcmp(key, "DEVPATH") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid DEVPATH operation\n");
                                goto invalid;
@@ -1168,7 +1160,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "KERNEL") == 0) {
+               if (strcmp(key, "KERNEL") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid KERNEL operation\n");
                                goto invalid;
@@ -1177,7 +1169,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "SUBSYSTEM") == 0) {
+               if (strcmp(key, "SUBSYSTEM") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid SUBSYSTEM operation\n");
                                goto invalid;
@@ -1195,7 +1187,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "DRIVER") == 0) {
+               if (strcmp(key, "DRIVER") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid DRIVER operation\n");
                                goto invalid;
@@ -1204,7 +1196,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "ATTR{", sizeof("ATTR{")-1) == 0) {
+               if (strncmp(key, "ATTR{", sizeof("ATTR{")-1) == 0) {
                        attr = get_key_attribute(rules->udev, key + sizeof("ATTR")-1);
                        if (attr == NULL) {
                                err(rules->udev, "error parsing ATTR attribute\n");
@@ -1218,8 +1210,8 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "KERNELS") == 0 ||
-                   strcasecmp(key, "ID") == 0) {
+               if (strcmp(key, "KERNELS") == 0 ||
+                   strcmp(key, "ID") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid KERNELS operation\n");
                                goto invalid;
@@ -1228,8 +1220,8 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "SUBSYSTEMS") == 0 ||
-                   strcasecmp(key, "BUS") == 0) {
+               if (strcmp(key, "SUBSYSTEMS") == 0 ||
+                   strcmp(key, "BUS") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid SUBSYSTEMS operation\n");
                                goto invalid;
@@ -1238,7 +1230,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "DRIVERS") == 0) {
+               if (strcmp(key, "DRIVERS") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid DRIVERS operation\n");
                                goto invalid;
@@ -1247,8 +1239,8 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "ATTRS{", sizeof("ATTRS{")-1) == 0 ||
-                   strncasecmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
+               if (strncmp(key, "ATTRS{", sizeof("ATTRS{")-1) == 0 ||
+                   strncmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid ATTRS operation\n");
                                goto invalid;
@@ -1268,7 +1260,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
+               if (strncmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
                        attr = get_key_attribute(rules->udev, key + sizeof("ENV")-1);
                        if (attr == NULL) {
                                err(rules->udev, "error parsing ENV attribute\n");
@@ -1284,12 +1276,12 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "PROGRAM") == 0) {
+               if (strcmp(key, "PROGRAM") == 0) {
                        rule_add_key(&rule_tmp, TK_M_PROGRAM, op, value, NULL);
                        continue;
                }
 
-               if (strcasecmp(key, "RESULT") == 0) {
+               if (strcmp(key, "RESULT") == 0) {
                        if (op > OP_MATCH_MAX) {
                                err(rules->udev, "invalid RESULT operation\n");
                                goto invalid;
@@ -1298,7 +1290,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) {
+               if (strncmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) {
                        attr = get_key_attribute(rules->udev, key + sizeof("IMPORT")-1);
                        if (attr != NULL && strstr(attr, "program")) {
                                dbg(rules->udev, "IMPORT will be executed\n");
@@ -1335,7 +1327,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "TEST", sizeof("TEST")-1) == 0) {
+               if (strncmp(key, "TEST", sizeof("TEST")-1) == 0) {
                        mode_t mode = 0;
 
                        if (op > OP_MATCH_MAX) {
@@ -1352,7 +1344,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strncasecmp(key, "RUN", sizeof("RUN")-1) == 0) {
+               if (strncmp(key, "RUN", sizeof("RUN")-1) == 0) {
                        int flag = 0;
 
                        attr = get_key_attribute(rules->udev, key + sizeof("RUN")-1);
@@ -1362,22 +1354,22 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "WAIT_FOR") == 0 || strcasecmp(key, "WAIT_FOR_SYSFS") == 0) {
+               if (strcmp(key, "WAIT_FOR") == 0 || strcmp(key, "WAIT_FOR_SYSFS") == 0) {
                        rule_add_key(&rule_tmp, TK_M_WAITFOR, 0, value, NULL);
                        continue;
                }
 
-               if (strcasecmp(key, "LABEL") == 0) {
+               if (strcmp(key, "LABEL") == 0) {
                        rule_tmp.rule.rule.label_off = add_string(rules, value);
                        continue;
                }
 
-               if (strcasecmp(key, "GOTO") == 0) {
+               if (strcmp(key, "GOTO") == 0) {
                        rule_add_key(&rule_tmp, TK_A_GOTO, 0, value, NULL);
                        continue;
                }
 
-               if (strncasecmp(key, "NAME", sizeof("NAME")-1) == 0) {
+               if (strncmp(key, "NAME", sizeof("NAME")-1) == 0) {
                        if (op < OP_MATCH_MAX) {
                                rule_add_key(&rule_tmp, TK_M_NAME, op, value, NULL);
                        } else {
@@ -1402,7 +1394,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "SYMLINK") == 0) {
+               if (strcmp(key, "SYMLINK") == 0) {
                        if (op < OP_MATCH_MAX)
                                rule_add_key(&rule_tmp, TK_M_DEVLINK, op, value, NULL);
                        else
@@ -1411,7 +1403,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "OWNER") == 0) {
+               if (strcmp(key, "OWNER") == 0) {
                        uid_t uid;
                        char *endptr;
 
@@ -1428,7 +1420,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "GROUP") == 0) {
+               if (strcmp(key, "GROUP") == 0) {
                        gid_t gid;
                        char *endptr;
 
@@ -1445,7 +1437,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "MODE") == 0) {
+               if (strcmp(key, "MODE") == 0) {
                        mode_t mode;
                        char *endptr;
 
@@ -1458,7 +1450,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                        continue;
                }
 
-               if (strcasecmp(key, "OPTIONS") == 0) {
+               if (strcmp(key, "OPTIONS") == 0) {
                        const char *pos;
 
                        if (strstr(value, "last_rule") != NULL) {
@@ -1641,10 +1633,8 @@ static int add_matching_files(struct udev *udev, struct udev_list_node *file_lis
                        if (strcmp(ext, suffix) != 0)
                                continue;
                }
-               dbg(udev, "put file '%s/%s' into list\n", dirname, dent->d_name);
-
-               snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->d_name);
-               filename[sizeof(filename)-1] = '\0';
+               util_strscpyl(filename, sizeof(filename), dirname, "/", dent->d_name, NULL);
+               dbg(udev, "put file '%s' into list\n", filename);
                udev_list_entry_add(udev, file_list, filename, NULL, 1, 1);
        }
 
@@ -1903,7 +1893,6 @@ static int match_key(struct udev_rules *rules, struct token *token, const char *
        case GL_SOMETHING:
                match = (val[0] != '\0');
                break;
-       case GL_FORMAT:
        case GL_UNSET:
                return -1;
        }