#include <time.h>
#include <sys/wait.h>
#include <sys/stat.h>
-#ifndef __KLIBC__
#include <sys/sysinfo.h>
-#endif
#include "libsysfs/sysfs/libsysfs.h"
#include "list.h"
struct sysfs_attribute *tmpattr;
pos = string;
-
while (1) {
- pos = strchr(string, '%');
- if (pos != NULL) {
- pos[0] = '\0';
- tail = pos+1;
- len = get_format_len(&tail);
- c = tail[0];
- strfieldcpy(temp, tail+1);
- tail = temp;
- } else {
+ pos = strchr(pos, '%');
+ if (pos == NULL)
break;
- }
- dbg("format=%c, string='%s', tail='%s'",c , string, tail);
+ pos[0] = '\0';
+ tail = pos+1;
+ len = get_format_len(&tail);
+ c = tail[0];
+ strfieldcpy(temp, tail+1);
+ tail = temp;
+ dbg("format=%c, string='%s', tail='%s'",c , string, tail);
attr = get_format_attribute(&tail);
+
switch (c) {
case 'b':
if (strlen(udev->bus_id) == 0)
break;
case '%':
strfieldcatmax(string, "%", maxsize);
+ pos++;
break;
default:
dbg("unknown substitution type '%%%c'", c);
return 0;
}
+static int whitelist_search(struct sysfs_class_device *class_dev)
+{
+ char *sysblock = "/sys/block";
+ int i;
+
+ static char *list[] = {
+ "nb",
+ "ram",
+ "loop",
+ "fd",
+ "md",
+ "dos_cd",
+ "double",
+ "flash",
+ "msd",
+ "rflash",
+ "rom",
+ "rrom",
+ "sbpcd",
+ "pcd",
+ "pf",
+ "scd",
+ "ubd",
+ NULL,
+ };
+
+ if (strncmp(class_dev->path, sysblock, strlen(sysblock)))
+ return 0;
+
+ for (i=0; list[i] != NULL; i++)
+ if (!strncmp(class_dev->name, list[i], strlen(list[i])))
+ return 1;
+
+ return 0;
+}
+
static struct sysfs_device *get_sysfs_device(struct sysfs_class_device *class_dev)
{
struct sysfs_device *sysfs_device;
* all partitions have the symlink in its parent directory.
* But we need to watch out for block devices that do not have parents, yet
* look like a partition (fd0, loop0, etc.) They all do not have a device
- * symlink yet. We do sit and spin on waiting for them right now, we should
- * possibly have a whitelist for these devices here...
+ * symlink yet. We do sit and spin on waiting for them right now unless
+ * they happen to be in the whitelist in which case we exit.
*/
class_dev_parent = sysfs_get_classdev_parent(class_dev);
if (class_dev_parent != NULL)
tspec.tv_nsec = 10000000; /* sleep 10 millisec */
loop = 10;
while (loop--) {
- if (udev_sleep)
+ if (udev_sleep) {
+ if (whitelist_search(class_dev)) {
+ sysfs_device = NULL;
+ goto exit;
+ }
nanosleep(&tspec, NULL);
+ }
if (class_dev_parent)
sysfs_device = sysfs_get_classdev_device(class_dev_parent);