+ /* we have to have a sysfs device for NUMBER to work */
+ if (!sysfs_device)
+ return -ENODEV;
+
+ found = 0;
+ strfieldcpy(path, sysfs_device->path);
+ temp = strrchr(path, '/');
+ dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
+ if (strstr(temp, dev->id) != NULL) {
+ found = 1;
+ } else {
+ *temp = 0x00;
+ temp = strrchr(path, '/');
+ dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
+ if (strstr(temp, dev->id) != NULL)
+ found = 1;
+ }
+ if (!found) {
+ dbg("id doesn't match");
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int match_place(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
+{
+ char path[SYSFS_PATH_MAX];
+ int found;
+ char *temp = NULL;
+
+ /* we have to have a sysfs device for NUMBER to work */
+ if (!sysfs_device)
+ return -ENODEV;
+
+ found = 0;
+ strfieldcpy(path, sysfs_device->path);
+ temp = strrchr(path, '/');
+ dbg("search '%s' in '%s', path='%s'", dev->place, temp, path);
+ if (strstr(temp, dev->place) != NULL) {
+ found = 1;
+ } else {
+ *temp = 0x00;
+ temp = strrchr(path, '/');
+ dbg("search '%s' in '%s', path='%s'", dev->place, temp, path);
+ if (strstr(temp, dev->place) != NULL)
+ found = 1;
+ }
+ if (!found) {
+ dbg("place doesn't match");
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static struct sysfs_device *get_sysfs_device(struct sysfs_class_device *class_dev)
+{
+ struct sysfs_device *sysfs_device;
+ struct sysfs_class_device *class_dev_parent;
+ int loop;
+ char filename[SYSFS_PATH_MAX + 6];
+ int retval;
+ char *temp;
+ int partition = 0;
+
+ /* Figure out where the device symlink is at. For char devices this will
+ * always be in the class_dev->path. But for block devices, it's different.
+ * The main block device will have the device symlink in it's path, but
+ * 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...
+ */
+ strcpy(filename, class_dev->path);
+ dbg("filename = %s", filename);
+ if (strcmp(class_dev->classname, SYSFS_BLOCK_NAME) == 0) {
+ if (isdigit(class_dev->path[strlen(class_dev->path)-1])) {
+ temp = strrchr(filename, '/');
+ if (temp) {
+ char *temp2 = strrchr(filename, '/');
+ partition = 1;
+ *temp = 0x00;
+ dbg("temp2 = %s", temp2);
+ if (temp2 && (strcmp(temp2, "/block") == 0)) {
+ /* oops, we have no parent block device, so go back to original directory */
+ strcpy(filename, class_dev->path);
+ partition = 0;
+ }
+ }