This allows us to watch any file to appear, not only sysfs
attributes. Files without a leading slash will be device sysfs
attributes. The key WAIT_FOR_SYSFS still works for backwards
compat, but is removed from the man page.
based on the executable bit of the file permissions\.
.RE
.PP
based on the executable bit of the file permissions\.
.RE
.PP
-Wait for the specified sysfs file of the device to be created\. Can be used to fight against kernel sysfs timing issues\.
+Wait for a file to become available\.
</varlistentry>
<varlistentry>
</varlistentry>
<varlistentry>
- <term><option>WAIT_FOR_SYSFS</option></term>
+ <term><option>WAIT_FOR</option></term>
- <para>Wait for the specified sysfs file of the device to be created. Can be used
- to fight against kernel sysfs timing issues.</para>
+ <para>Wait for a file to become available.</para>
</listitem>
</varlistentry>
</listitem>
</varlistentry>
}
#define WAIT_LOOP_PER_SECOND 50
}
#define WAIT_LOOP_PER_SECOND 50
-static int wait_for_sysfs(struct udevice *udev, const char *file, int timeout)
+static int wait_for_file(struct udevice *udev, const char *file, int timeout)
- char devicepath[PATH_SIZE];
char filepath[PATH_SIZE];
char filepath[PATH_SIZE];
+ char devicepath[PATH_SIZE] = "";
struct stat stats;
int loop = timeout * WAIT_LOOP_PER_SECOND;
struct stat stats;
int loop = timeout * WAIT_LOOP_PER_SECOND;
- 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));
+ /* a relative path is a device attribute */
+ if (file[0] != '/') {
+ strlcpy(devicepath, sysfs_path, sizeof(devicepath));
+ strlcat(devicepath, udev->dev->devpath, sizeof(devicepath));
- dbg("will wait %i sec for '%s'\n", timeout, filepath);
+ strlcpy(filepath, devicepath, sizeof(filepath));
+ strlcat(filepath, "/", sizeof(filepath));
+ strlcat(filepath, file, sizeof(filepath));
+ file = filepath;
+ }
+
+ dbg("will wait %i sec for '%s'\n", timeout, file);
while (--loop) {
/* lookup file */
while (--loop) {
/* lookup file */
- if (stat(filepath, &stats) == 0) {
- info("file '%s' appeared after %i loops\n", filepath, (timeout * WAIT_LOOP_PER_SECOND) - loop-1);
+ if (stat(file, &stats) == 0) {
+ info("file '%s' appeared after %i loops\n", file, (timeout * WAIT_LOOP_PER_SECOND) - loop-1);
return 0;
}
/* make sure, the device did not disappear in the meantime */
return 0;
}
/* make sure, the device did not disappear in the meantime */
- if (stat(devicepath, &stats) != 0) {
- info("device disappeared while waiting for '%s'\n", filepath);
+ if (devicepath[0] != '\0' && stat(devicepath, &stats) != 0) {
+ info("device disappeared while waiting for '%s'\n", file);
- info("wait for '%s' for %i mseconds\n", filepath, 1000 / WAIT_LOOP_PER_SECOND);
+ info("wait for '%s' for %i mseconds\n", file, 1000 / WAIT_LOOP_PER_SECOND);
usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND);
}
usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND);
}
- info("waiting for '%s' failed\n", filepath);
+ info("waiting for '%s' failed\n", file);
dbg("TEST key is true\n");
}
dbg("TEST key is true\n");
}
- if (rule->wait_for_sysfs.operation != KEY_OP_UNSET) {
+ if (rule->wait_for.operation != KEY_OP_UNSET) {
+ char filename[PATH_SIZE];
- found = (wait_for_sysfs(udev, key_val(rule, &rule->wait_for_sysfs), 10) == 0);
- if (!found && (rule->wait_for_sysfs.operation != KEY_OP_NOMATCH))
+ strlcpy(filename, key_val(rule, &rule->wait_for), sizeof(filename));
+ udev_rules_apply_format(udev, filename, sizeof(filename));
+ found = (wait_for_file(udev, filename, 10) == 0);
+ if (!found && (rule->wait_for.operation != KEY_OP_NOMATCH))
struct key test;
mode_t test_mode_mask;
struct key run;
struct key test;
mode_t test_mode_mask;
struct key run;
- struct key wait_for_sysfs;
struct key label;
struct key goto_label;
struct key label;
struct key goto_label;
- if (strcasecmp(key, "WAIT_FOR_SYSFS") == 0) {
- add_rule_key(rule, &rule->wait_for_sysfs, operation, value);
+ if (strcasecmp(key, "WAIT_FOR") == 0 || strcasecmp(key, "WAIT_FOR_SYSFS") == 0) {
+ add_rule_key(rule, &rule->wait_for, operation, value);
err("unknown key '%s' in %s:%u\n", key, filename, lineno);
}
err("unknown key '%s' in %s:%u\n", key, filename, lineno);
}
- if (physdev && rule->wait_for_sysfs.operation == KEY_OP_UNSET)
+ if (physdev && rule->wait_for.operation == KEY_OP_UNSET)
err("PHYSDEV* values are deprecated and will be removed from a future kernel, \n"
"please fix it in %s:%u", filename, lineno);
err("PHYSDEV* values are deprecated and will be removed from a future kernel, \n"
"please fix it in %s:%u", filename, lineno);