X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudev-rules.c;h=f0b11aa85b9880c3c395b1336f9b0b1dce23ccdf;hp=df9fc7877da2c2d7bfa46f0ebb81e5a7b9d0f5da;hb=10b2d011e70ddf9361c61f6147dc88f670d28abd;hpb=949075dbbdbc2a10b38e5022a4f51d39e391deca diff --git a/udev/udev-rules.c b/udev/udev-rules.c index df9fc7877..f0b11aa85 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -1131,10 +1131,10 @@ static int sort_token(struct udev_rules *rules, struct rule_tmp *rule_tmp) static int add_rule(struct udev_rules *rules, char *line, const char *filename, unsigned int filename_off, unsigned int lineno) { - int valid = 0; char *linepos; char *attr; int physdev = 0; + int waitfor = 0; struct rule_tmp rule_tmp; memset(&rule_tmp, 0x00, sizeof(struct rule_tmp)); @@ -1158,7 +1158,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_ACTION, op, value, NULL); - valid = 1; continue; } @@ -1168,7 +1167,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_DEVPATH, op, value, NULL); - valid = 1; continue; } @@ -1178,7 +1176,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_KERNEL, op, value, NULL); - valid = 1; continue; } @@ -1197,7 +1194,6 @@ static int add_rule(struct udev_rules *rules, char *line, rule_add_key(&rule_tmp, TK_M_SUBSYSTEM, op, "subsystem|class|bus", NULL); } else rule_add_key(&rule_tmp, TK_M_SUBSYSTEM, op, value, NULL); - valid = 1; continue; } @@ -1207,7 +1203,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_DRIVER, op, value, NULL); - valid = 1; continue; } @@ -1222,7 +1217,6 @@ static int add_rule(struct udev_rules *rules, char *line, } else { rule_add_key(&rule_tmp, TK_A_ATTR, op, value, attr); } - valid = 1; continue; } @@ -1233,7 +1227,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_KERNELS, op, value, NULL); - valid = 1; continue; } @@ -1244,7 +1237,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_SUBSYSTEMS, op, value, NULL); - valid = 1; continue; } @@ -1254,7 +1246,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_DRIVERS, op, value, NULL); - valid = 1; continue; } @@ -1276,7 +1267,6 @@ static int add_rule(struct udev_rules *rules, char *line, err(rules->udev, "do not reference parent sysfs directories directly, " "it may break with a future kernel, please fix it in %s:%u", filename, lineno); rule_add_key(&rule_tmp, TK_M_ATTRS, op, value, attr); - valid = 1; continue; } @@ -1295,13 +1285,11 @@ static int add_rule(struct udev_rules *rules, char *line, if (rule_add_key(&rule_tmp, TK_A_ENV, op, value, attr) != 0) goto invalid; } - valid = 1; continue; } if (strcasecmp(key, "PROGRAM") == 0) { rule_add_key(&rule_tmp, TK_M_PROGRAM, op, value, NULL); - valid = 1; continue; } @@ -1311,7 +1299,6 @@ static int add_rule(struct udev_rules *rules, char *line, goto invalid; } rule_add_key(&rule_tmp, TK_M_RESULT, op, value, NULL); - valid = 1; continue; } @@ -1320,15 +1307,12 @@ static int add_rule(struct udev_rules *rules, char *line, if (attr != NULL && strstr(attr, "program")) { dbg(rules->udev, "IMPORT will be executed\n"); rule_add_key(&rule_tmp, TK_M_IMPORT_PROG, op, value, NULL); - valid = 1; } else if (attr != NULL && strstr(attr, "file")) { dbg(rules->udev, "IMPORT will be included as file\n"); rule_add_key(&rule_tmp, TK_M_IMPORT_FILE, op, value, NULL); - valid = 1; } else if (attr != NULL && strstr(attr, "parent")) { dbg(rules->udev, "IMPORT will include the parent values\n"); rule_add_key(&rule_tmp, TK_M_IMPORT_PARENT, op, value, NULL); - valid = 1; } else { /* figure it out if it is executable */ char file[UTIL_PATH_SIZE]; @@ -1353,11 +1337,9 @@ static int add_rule(struct udev_rules *rules, char *line, if (!lstat(file, &statbuf) && (statbuf.st_mode & S_IXUSR)) { dbg(rules->udev, "IMPORT will be executed (autotype)\n"); rule_add_key(&rule_tmp, TK_M_IMPORT_PROG, op, value, NULL); - valid = 1; } else { dbg(rules->udev, "IMPORT will be included as file (autotype)\n"); rule_add_key(&rule_tmp, TK_M_IMPORT_FILE, op, value, NULL); - valid = 1; } } continue; @@ -1377,7 +1359,6 @@ static int add_rule(struct udev_rules *rules, char *line, } else { rule_add_key(&rule_tmp, TK_M_TEST, op, value, NULL); } - valid = 1; continue; } @@ -1388,25 +1369,22 @@ static int add_rule(struct udev_rules *rules, char *line, if (attr != NULL && strstr(attr, "ignore_error")) flag = 1; rule_add_key(&rule_tmp, TK_A_RUN, op, value, &flag); - valid = 1; continue; } if (strcasecmp(key, "WAIT_FOR") == 0 || strcasecmp(key, "WAIT_FOR_SYSFS") == 0) { rule_add_key(&rule_tmp, TK_M_WAITFOR, 0, value, NULL); - valid = 1; + waitfor = 1; continue; } if (strcasecmp(key, "LABEL") == 0) { rule_tmp.rule.rule.label_off = add_string(rules, value); - valid = 1; continue; } if (strcasecmp(key, "GOTO") == 0) { rule_add_key(&rule_tmp, TK_A_GOTO, 0, value, NULL); - valid = 1; continue; } @@ -1415,7 +1393,7 @@ static int add_rule(struct udev_rules *rules, char *line, rule_add_key(&rule_tmp, TK_M_NAME, op, value, NULL); } else { if (value[0] == '\0') - dbg(rules->udev, "name empty, node creation suppressed\n"); + info(rules->udev, "name empty, node creation suppressed\n"); rule_add_key(&rule_tmp, TK_A_NAME, op, value, NULL); attr = get_key_attribute(rules->udev, key + sizeof("NAME")-1); if (attr != NULL) { @@ -1441,7 +1419,6 @@ static int add_rule(struct udev_rules *rules, char *line, else rule_add_key(&rule_tmp, TK_A_DEVLINK, op, value, NULL); rule_tmp.rule.rule.flags = 1; - valid = 1; continue; } @@ -1452,14 +1429,13 @@ static int add_rule(struct udev_rules *rules, char *line, uid = strtoul(value, &endptr, 10); if (endptr[0] == '\0') { rule_add_key(&rule_tmp, TK_A_OWNER_ID, op, NULL, &uid); - } else if (rules->resolve_names && strchr("$%", value[0]) == NULL) { + } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) { uid = add_uid(rules, value); rule_add_key(&rule_tmp, TK_A_OWNER_ID, op, NULL, &uid); - } else { + } else if (rules->resolve_names == 0) { rule_add_key(&rule_tmp, TK_A_OWNER, op, value, NULL); } rule_tmp.rule.rule.flags = 1; - valid = 1; continue; } @@ -1470,14 +1446,13 @@ static int add_rule(struct udev_rules *rules, char *line, gid = strtoul(value, &endptr, 10); if (endptr[0] == '\0') { rule_add_key(&rule_tmp, TK_A_GROUP_ID, op, NULL, &gid); - } else if (rules->resolve_names && strchr("$%", value[0]) == NULL) { + } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) { gid = add_gid(rules, value); rule_add_key(&rule_tmp, TK_A_GROUP_ID, op, NULL, &gid); - } else { + } else if (rules->resolve_names == 0) { rule_add_key(&rule_tmp, TK_A_GROUP, op, value, NULL); } rule_tmp.rule.rule.flags = 1; - valid = 1; continue; } @@ -1491,7 +1466,6 @@ static int add_rule(struct udev_rules *rules, char *line, else rule_add_key(&rule_tmp, TK_A_MODE, op, value, NULL); rule_tmp.rule.rule.flags = 1; - valid = 1; continue; } @@ -1538,19 +1512,14 @@ static int add_rule(struct udev_rules *rules, char *line, rule_add_key(&rule_tmp, TK_A_NUM_FAKE_PART, 0, NULL, &num); dbg(rules->udev, "creation of partition nodes requested\n"); } - valid = 1; continue; } err(rules->udev, "unknown key '%s' in %s:%u\n", key, filename, lineno); } - if (physdev) - err(rules->udev, "PHYSDEV* values are deprecated and not available on recent kernels, \n" - "please fix it in %s:%u", filename, lineno); - - /* skip line if not any valid key was found */ - if (!valid) - goto invalid; + if (physdev && !waitfor) + err(rules->udev, "PHYSDEV* values are deprecated and not available on recent kernels, " + "please fix it in %s:%u\n", filename, lineno); /* add rule token */ rule_tmp.rule.rule.token_count = 1 + rule_tmp.token_cur; @@ -1647,7 +1616,7 @@ static int add_matching_files(struct udev *udev, struct udev_list_node *file_lis dbg(udev, "open directory '%s'\n", dirname); dir = opendir(dirname); if (dir == NULL) { - err(udev, "unable to open '%s': %m\n", dirname); + info(udev, "unable to open '%s': %m\n", dirname); return -1; } @@ -2017,7 +1986,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event rule = cur; /* possibly skip rules which want to set NAME, SYMLINK, OWNER, GROUP, MODE */ if (!can_set_name && rule->rule.flags) - ;//goto nomatch; + goto nomatch; esc = ESCAPE_UNSET; break; case TK_M_ACTION: @@ -2057,13 +2026,10 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event break; case TK_M_ENV: { - struct udev_list_entry *list_entry; const char *key_name = &rules->buf[cur->key.attr_off]; const char *value; - list_entry = udev_device_get_properties_list_entry(event->dev); - list_entry = udev_list_entry_get_by_name(list_entry, key_name); - value = udev_list_entry_get_value(list_entry); + value = udev_device_get_property_value(event->dev, key_name); if (value == NULL) { dbg(event->udev, "ENV{%s} is not set, treat as empty\n", key_name); value = ""; @@ -2399,24 +2365,19 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event break; if (cur->key.op == OP_ASSIGN_FINAL) event->name_final = 1; - if (name[0] == '\0') { - free(event->name); - event->name = NULL; - break; - } util_strlcpy(name_str, name, sizeof(name_str)); udev_event_apply_format(event, name_str, sizeof(name_str)); if (esc == ESCAPE_UNSET || esc == ESCAPE_REPLACE) { count = udev_util_replace_chars(name_str, "/"); if (count > 0) info(event->udev, "%i character(s) replaced\n", count); - free(event->name); - event->name = strdup(name_str); - info(event->udev, "NAME '%s' %s:%u\n", - event->name, - &rules->buf[rule->rule.filename_off], - rule->rule.filename_line); } + free(event->name); + event->name = strdup(name_str); + info(event->udev, "NAME '%s' %s:%u\n", + event->name, + &rules->buf[rule->rule.filename_off], + rule->rule.filename_line); break; } case TK_A_DEVLINK: @@ -2505,9 +2466,8 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event rule->rule.filename_line); f = fopen(attr, "w"); if (f != NULL) { - if (!event->test) - if (fprintf(f, "%s", value) <= 0) - err(event->udev, "error writing ATTR{%s}: %m\n", attr); + if (fprintf(f, "%s", value) <= 0) + err(event->udev, "error writing ATTR{%s}: %m\n", attr); fclose(f); } else { err(event->udev, "error opening ATTR{%s} for writing: %m\n", attr);