[PATCH] another patch for path problem

The quick patch I sent you yesterday fixes it in one location, but
there are other points in the library that calls sysfs_get_mnt_path. We
need to address all the areas in the library where paths are used. The
following patch is a band-aid until we can get a proper path management
in the library.
This commit is contained in:
dsteklof@us.ibm.com 2003-12-02 00:48:01 -08:00 committed by Greg KH
parent bc1530c65c
commit edcd336477
6 changed files with 59 additions and 15 deletions

View File

@ -142,6 +142,7 @@ extern "C" {
/*
* Function Prototypes
*/
extern int sysfs_trailing_slash(unsigned char *path);
extern int sysfs_get_mnt_path(unsigned char *mnt_path, size_t len);
extern int sysfs_get_name_from_path(const unsigned char *path,
unsigned char *name, size_t len);

View File

@ -112,7 +112,10 @@ static struct sysfs_directory *open_bus_dir(const unsigned char *name)
return NULL;
}
strcat(buspath, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(buspath) == 0)
strcat(buspath, "/");
strcat(buspath, SYSFS_BUS_NAME);
strcat(buspath, "/");
strcat(buspath, name);
busdir = sysfs_open_directory(buspath);
@ -406,10 +409,13 @@ struct sysfs_device *sysfs_open_bus_device(unsigned char *busname,
return NULL;
}
strcat(path, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(path) == 0)
strcat(path, "/");
strcat(path, SYSFS_BUS_NAME);
strcat(path, "/");
strcat(path, busname);
strcat(path, SYSFS_DEVICES_DIR);
strcat(path, "/");
strcat(path, SYSFS_DEVICES_NAME);
strcat(path, "/");
strcat(path, dev_id);
@ -442,15 +448,17 @@ int sysfs_find_driver_bus(const unsigned char *driver, unsigned char *busname,
}
memset(subsys, 0, SYSFS_PATH_MAX);
strcpy(subsys, SYSFS_BUS_DIR);
strcpy(subsys, SYSFS_BUS_NAME);
buslist = sysfs_open_subsystem_list(subsys);
if (buslist != NULL) {
dlist_for_each_data(buslist, bus, char) {
memset(subsys, 0, SYSFS_PATH_MAX);
strcpy(subsys, SYSFS_BUS_DIR);
strcat(subsys, "/");
strcpy(subsys, SYSFS_BUS_NAME);
strcat(subsys, "/");
strcat(subsys, bus);
strcat(subsys, SYSFS_DRIVERS_DIR);
strcat(subsys, "/");
strcat(subsys, SYSFS_DRIVERS_NAME);
drivers = sysfs_open_subsystem_list(subsys);
if (drivers != NULL) {
dlist_for_each_data(drivers, curdrv, char) {

View File

@ -116,14 +116,16 @@ static struct sysfs_directory *open_class_dir(const unsigned char *name)
return NULL;
}
if (sysfs_trailing_slash(classpath) == 0)
strcat(classpath, "/");
/*
* We shall now treat "block" also as a class. Hence, check here
* if "name" is "block" and proceed accordingly
*/
if (strcmp(name, SYSFS_BLOCK_NAME) == 0) {
strcat(classpath, SYSFS_BLOCK_DIR);
strcat(classpath, SYSFS_BLOCK_NAME);
} else {
strcat(classpath, SYSFS_CLASS_DIR);
strcat(classpath, SYSFS_CLASS_NAME);
strcat(classpath, "/");
strcat(classpath, name);
}
@ -365,10 +367,13 @@ static int get_classdev_path(const unsigned char *classname,
dprintf("Error getting sysfs mount path\n");
return -1;
}
if (sysfs_trailing_slash(path) == 0)
strcat(path, "/");
if (strcmp(classname, SYSFS_BLOCK_NAME) == 0) {
strcat(path, SYSFS_BLOCK_DIR);
strcat(path, SYSFS_BLOCK_NAME);
} else {
strcat(path, SYSFS_CLASS_DIR);
strcat(path, SYSFS_CLASS_NAME);
strcat(path, "/");
strcat(path, classname);
}

View File

@ -36,7 +36,9 @@ static int confirm_device_bus(struct sysfs_device *dev,
if (sysfs_get_mnt_path(devpath, SYSFS_PATH_MAX) != 0)
return -1;
strcat(devpath, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(devpath) == 0)
strcat(devpath, "/");
strcat(devpath, SYSFS_BUS_NAME);
strcat(devpath, "/");
strcat(devpath, busname);
strcat(devpath, SYSFS_DEVICES_DIR);
@ -306,7 +308,10 @@ static struct sysfs_directory *open_root_device_dir(const unsigned char *name)
return NULL;
}
strcat(rootpath, SYSFS_DEVICES_DIR);
if (sysfs_trailing_slash(rootpath) == 0)
strcat(rootpath, "/");
strcat(rootpath, SYSFS_DEVICES_NAME);
strcat(rootpath, "/");
strcat(rootpath, name);
rdir = sysfs_open_directory(rootpath);
@ -435,7 +440,9 @@ static int get_device_absolute_path(const unsigned char *device,
dprintf ("Sysfs not supported on this system\n");
return -1;
}
strcat(bus_path, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(bus_path) == 0)
strcat(bus_path, "/");
strcat(bus_path, SYSFS_BUS_NAME);
strcat(bus_path, "/");
strcat(bus_path, bus);
strcat(bus_path, SYSFS_DEVICES_DIR);

View File

@ -182,7 +182,9 @@ static int get_driver_path(const unsigned char *bus, const unsigned char *drv,
dprintf("Error getting sysfs mount path\n");
return -1;
}
strcat(path, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(path) == 0)
strcat(path, "/");
strcat(path, SYSFS_BUS_NAME);
strcat(path, "/");
strcat(path, bus);
strcat(path, SYSFS_DRIVERS_DIR);

View File

@ -76,6 +76,23 @@ static int sysfs_get_fs_mnt_path(const unsigned char *fs_type,
#endif
}
/*
* sysfs_trailing_slash: checks if there's a trailing slash to path
* @path: path to check
* returns 1 if true and 0 if not
*/
int sysfs_trailing_slash(unsigned char *path)
{
unsigned char *s = NULL;
if (path == NULL)
return 0;
s = &path[strlen(path)-1];
if (strncmp(s, "/", 1) == 0)
return 1;
return 0;
}
/*
* sysfs_get_mnt_path: Gets the sysfs mount point.
* @mnt_path: place to put "sysfs" mount point
@ -226,6 +243,8 @@ struct dlist *sysfs_open_subsystem_list(unsigned char *name)
return NULL;
}
if (sysfs_trailing_slash(sysfs_path) == 0)
strcat(sysfs_path, "/");
strcat(sysfs_path, name);
dir = sysfs_open_directory(sysfs_path);
if (dir == NULL) {
@ -301,7 +320,9 @@ struct dlist *sysfs_open_bus_devices_list(unsigned char *name)
return NULL;
}
strcat(sysfs_path, SYSFS_BUS_DIR);
if (sysfs_trailing_slash(sysfs_path) == 0)
strcat(sysfs_path, "/");
strcat(sysfs_path, SYSFS_BUS_NAME);
strcat(sysfs_path, "/");
strcat(sysfs_path, name);
strcat(sysfs_path, SYSFS_DEVICES_DIR);