*/
struct sysfs_device *sysfs_get_device_parent(struct sysfs_device *dev)
{
- char ppath[SYSFS_PATH_MAX], *tmp;
+ char ppath[SYSFS_PATH_MAX], dpath[SYSFS_PATH_MAX], *tmp;
if (!dev) {
errno = EINVAL;
return (dev->parent);
memset(ppath, 0, SYSFS_PATH_MAX);
+ memset(dpath, 0, SYSFS_PATH_MAX);
safestrcpy(ppath, dev->path);
tmp = strrchr(ppath, '/');
if (!tmp) {
}
*tmp = '\0';
- /*
- * All "devices" have the "detach_state" attribute - validate here
- */
- safestrcat(ppath, "/detach_state");
- if (sysfs_path_is_file(ppath)) {
+ /* Make sure we're not at the top of the device tree */
+ sysfs_get_mnt_path(dpath, SYSFS_PATH_MAX);
+ safestrcat(dpath, "/" SYSFS_DEVICES_NAME);
+ if (strcmp(dpath, ppath) == 0) {
dprintf("Device at %s does not have a parent\n", dev->path);
return NULL;
}
- tmp = strrchr(ppath, '/');
- *tmp = '\0';
+
dev->parent = sysfs_open_device_path(ppath);
if (!dev->parent) {
dprintf("Error opening device %s's parent at %s\n",