X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_rules.c;h=623ca468584dce0f38a58c389141265baac51675;hp=f1bbfd854cac5734ea015aa5790d1a8a7ecee737;hb=ff9a488d8c559a2ee40e522cdc68b750670711e4;hpb=2c02716281adaea9cf6f57caecaf51db8dbb0917 diff --git a/udev_rules.c b/udev_rules.c index f1bbfd854..623ca4685 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -290,6 +290,12 @@ static int find_free_number(const char *base, const char *devpath) char filename[PATH_SIZE]; struct udevice *udev_db; int num = 0; + static int warn = 1; + + if (warn) { + err("%%e is deprecated, will be removed and is unlikely to work correctly. Don't use it."); + warn = 0; + } /* check if the device already owns a matching name */ udev_db = udev_device_init(); @@ -342,23 +348,33 @@ out: #define WAIT_LOOP_PER_SECOND 50 static int wait_for_sysfs(struct udevice *udev, const char *file, int timeout) { - char filename[PATH_SIZE]; + char devicepath[PATH_SIZE]; + char filepath[PATH_SIZE]; struct stat stats; int loop = timeout * WAIT_LOOP_PER_SECOND; - snprintf(filename, sizeof(filename), "%s%s/%s", sysfs_path, udev->dev->devpath, file); - filename[sizeof(filename)-1] = '\0'; - dbg("wait %i sec for '%s'", timeout, filename); + strlcpy(devicepath, sysfs_path, sizeof(devicepath)); + strlcat(devicepath, udev->dev->devpath, sizeof(devicepath)); + strlcpy(filepath, devicepath, sizeof(filepath)); + strlcat(filepath, "/", sizeof(filepath)); + strlcat(filepath, file, sizeof(filepath)); + dbg("will wait %i sec for '%s'", timeout, filepath); while (--loop) { - if (stat(filename, &stats) == 0) { - info("file '%s' appeared after %i loops", filename, (timeout * WAIT_LOOP_PER_SECOND) - loop-1); + /* lookup file */ + if (stat(filepath, &stats) == 0) { + info("file '%s' appeared after %i loops", filepath, (timeout * WAIT_LOOP_PER_SECOND) - loop-1); return 0; } - info("wait for %i mseconds", 1000 / WAIT_LOOP_PER_SECOND); + /* make sure the device does not have disappeared in the meantime */ + if (stat(devicepath, &stats) != 0) { + info("device disappeared while waiting for '%s'", filepath); + return -2; + } + info("wait for '%s' for %i mseconds", filepath, 1000 / WAIT_LOOP_PER_SECOND); usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND); } - err("waiting for '%s' failed", filename); + err("waiting for '%s' failed", filepath); return -1; } @@ -594,7 +610,7 @@ found: snprintf(udev->tmp_node, sizeof(udev->tmp_node), "%s/.tmp-%u-%u", udev_root, major(udev->devt), minor(udev->devt)); udev->tmp_node[sizeof(udev->tmp_node)-1] = '\0'; - udev_make_node(udev, udev->tmp_node, udev->devt, 0600, 0, 0); + udev_node_mknod(udev, udev->tmp_node, udev->devt, 0600, 0, 0); } strlcat(string, udev->tmp_node, maxsize); dbg("substitute temporary device node name '%s'", udev->tmp_node); @@ -606,6 +622,13 @@ found: case SUBST_MODALIAS: { const char *value; + static int warn = 1; + + if (warn) { + err("$modalias is deprecated, use $env{MODALIAS} or " + "$sysfs{modalias} instead."); + warn = 0; + } value = sysfs_attr_get_value(udev->dev->devpath, "modalias"); if (value != NULL) { @@ -705,6 +728,12 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) if (rule->modalias.operation != KEY_OP_UNSET) { const char *value; + static int warn = 1; + + if (warn) { + err("MODALIAS is deprecated, use ENV{MODALIAS} or SYSFS{modalias} instead."); + warn = 0; + } value = sysfs_attr_get_value(udev->dev->devpath, "modalias"); if (value == NULL) { @@ -733,19 +762,13 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) } if (rule->wait_for_sysfs.operation != KEY_OP_UNSET) { - int match; + int found; - match = (wait_for_sysfs(udev, key_val(rule, &rule->wait_for_sysfs), 3) == 0); - if (match && (rule->wait_for_sysfs.operation != KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is true (matching value)"); - return 0; - } - if (!match && (rule->wait_for_sysfs.operation == KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is true, (non matching value)"); - return 0; + found = (wait_for_sysfs(udev, key_val(rule, &rule->wait_for_sysfs), 3) == 0); + if (!found && (rule->wait_for_sysfs.operation != KEY_OP_NOMATCH)) { + dbg("WAIT_FOR_SYSFS failed"); + goto nomatch; } - dbg("WAIT_FOR_SYSFS is false"); - return -1; } /* walk up the chain of parent devices and find a match */ @@ -781,6 +804,8 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) size_t len; value = sysfs_attr_get_value(udev->dev_parent->devpath, key_name); + if (value == NULL) + value = sysfs_attr_get_value(udev->dev->devpath, key_name); if (value == NULL) goto try_parent; strlcpy(val, value, sizeof(val));