+
+ /* try to resolve the silly block layout if needed */
+ if (strncmp(&path[len], "/block/", 7) == 0) {
+ char block[UTIL_PATH_SIZE];
+ char part[UTIL_PATH_SIZE];
+
+ util_strlcpy(block, path, sizeof(block));
+ pos = strrchr(block, '/');
+ if (pos == NULL)
+ return NULL;
+ util_strlcpy(part, pos, sizeof(part));
+ pos[0] = '\0';
+ if (util_resolve_sys_link(udev, block, sizeof(block)) == 0) {
+ util_strlcpy(path, block, sizeof(path));
+ util_strlcat(path, part, sizeof(path));
+ }
+ }
+
+ /* path exists in sys */
+ if (strncmp(&syspath[len], "/devices/", 9) == 0 ||
+ strncmp(&syspath[len], "/class/", 7) == 0 ||
+ strncmp(&syspath[len], "/block/", 7) == 0) {
+ char file[UTIL_PATH_SIZE];
+
+ /* all "devices" require a "uevent" file */
+ util_strlcpy(file, path, sizeof(file));
+ util_strlcat(file, "/uevent", sizeof(file));
+ if (stat(file, &statbuf) != 0) {
+ info(udev, "not a device: %s\n", syspath);
+ return NULL;
+ }
+ } else {
+ /* everything else just needs to be a directory */
+ if (stat(path, &statbuf) != 0 || !S_ISDIR(statbuf.st_mode)) {
+ info(udev, "directory not found: %s\n", syspath);
+ return NULL;
+ }
+ }
+
+ udev_device = device_new(udev);
+ if (udev_device == NULL)
+ return NULL;
+