From: Kay Sievers Date: Thu, 13 Mar 2008 15:00:25 +0000 (+0100) Subject: hack to allow ATTR{block/*/uevent}="change" X-Git-Tag: 174~1757 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=5ee7ecfb0f07e8c98c1c2b3d988191ad458cf097 hack to allow ATTR{block/*/uevent}="change" --- diff --git a/udev_rules.c b/udev_rules.c index 5ae4aa2b7..e464404b5 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -1243,6 +1244,7 @@ try_parent: if (pair->key.operation == KEY_OP_ASSIGN) { const char *key_name = key_pair_name(rule, pair); char devpath[PATH_SIZE]; + char *pos; char *attrib; char attr[PATH_SIZE] = ""; char value[NAME_SIZE]; @@ -1264,6 +1266,28 @@ try_parent: strlcat(attr, key_name, sizeof(attr)); } + pos = strstr(attr, "/*/"); + if (pos != NULL) { + char str[PATH_SIZE]; + DIR *dir; + + pos[1] = '\0'; + strlcpy(str, &pos[2], sizeof(str)); + dir = opendir(attr); + if (dir != NULL) { + struct dirent *dent; + + for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { + if (dent->d_name[0] == '.') + continue; + strlcat(attr, dent->d_name, sizeof(attr)); + break; + } + closedir(dir); + } + strlcat(attr, str, sizeof(attr)); + } + strlcpy(value, key_val(rule, &pair->key), sizeof(value)); udev_rules_apply_format(udev, value, sizeof(value)); info("writing '%s' to sysfs file '%s'", value, attr);