From 6ecd4d1e364ea8104c83e36b82d1c23835fb104b Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 18 Jan 2006 04:24:48 +0100 Subject: [PATCH] scsi_id, usb_id: request device parent by subsystem Request specific parents identified by subsystem and don't rely on a predefined sequence. Also let the devpath be longer than 72 chars, tsss ... Signed-off-by: Kay Sievers --- extras/scsi_id/scsi_id.c | 28 ++++++++++++---------------- extras/scsi_id/scsi_id.h | 2 +- extras/usb_id/usb_id.c | 27 ++++++++++----------------- udev.h | 1 + udev_sysfs.c | 13 +++++++++++++ 5 files changed, 37 insertions(+), 34 deletions(-) diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index 3a4a374d3..6458f2b7a 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -48,7 +48,7 @@ static int all_good; static int always_info; static int dev_specified; static int sys_specified; -static char config_file[MAX_NAME_LEN] = SCSI_ID_CONFIG_FILE; +static char config_file[MAX_PATH_LEN] = SCSI_ID_CONFIG_FILE; static int display_bus_id; static enum page_code default_page_code; static int use_stderr; @@ -174,7 +174,7 @@ static int create_tmp_dev(const char *devpath, char *tmpdev, int dev_type) return -1; } - snprintf(tmpdev, MAX_NAME_LEN, "%s/%s-maj%d-min%d-%u", + snprintf(tmpdev, MAX_PATH_LEN, "%s/%s-maj%d-min%d-%u", TMP_DIR, TMP_PREFIX, maj, min, getpid()); dbg("tmpdev '%s'", tmpdev); @@ -433,7 +433,8 @@ static int set_options(int argc, char **argv, const char *short_opts, case 'd': dev_specified = 1; - strncpy(maj_min_dev, optarg, MAX_NAME_LEN); + strncpy(maj_min_dev, optarg, MAX_PATH_LEN); + maj_min_dev[MAX_PATH_LEN-1] = '\0'; break; case 'e': @@ -441,7 +442,8 @@ static int set_options(int argc, char **argv, const char *short_opts, break; case 'f': - strncpy(config_file, optarg, MAX_NAME_LEN); + strncpy(config_file, optarg, MAX_PATH_LEN); + config_file[MAX_PATH_LEN-1] = '\0'; break; case 'g': @@ -467,8 +469,8 @@ static int set_options(int argc, char **argv, const char *short_opts, case 's': sys_specified = 1; - strncpy(target, optarg, MAX_NAME_LEN); - target[MAX_NAME_LEN-1] = '\0'; + strncpy(target, optarg, MAX_PATH_LEN); + target[MAX_PATH_LEN-1] = '\0'; break; case 'u': @@ -640,18 +642,12 @@ static int scsi_id(const char *devpath, char *maj_min_dev) dev_type = S_IFCHR; /* get scsi parent device */ - dev_scsi = sysfs_device_get_parent(dev); + dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi"); if (dev_scsi == NULL) { err("unable to access parent device of '%s'", devpath); return 1; } - /* allow only scsi devices */ - if (strcmp(dev_scsi->subsystem, "scsi") != 0) { - info("%s is not a scsi device", devpath); - return 1; - } - /* mknod a temp dev to communicate with the device */ if (!dev_specified && create_tmp_dev(dev->devpath, maj_min_dev, dev_type)) { dbg("create_tmp_dev failed\n"); @@ -707,8 +703,8 @@ static int scsi_id(const char *devpath, char *maj_min_dev) int main(int argc, char **argv) { int retval = 0; - char devpath[MAX_NAME_LEN]; - char maj_min_dev[MAX_NAME_LEN]; + char devpath[MAX_PATH_LEN]; + char maj_min_dev[MAX_PATH_LEN]; int newargc; const char *env; char **newargv; @@ -729,7 +725,7 @@ int main(int argc, char **argv) if (env) { hotplug_mode = 1; sys_specified = 1; - strncpy(devpath, env, MAX_NAME_LEN); + strncpy(devpath, env, MAX_PATH_LEN); devpath[sizeof(devpath)-1] = '\0'; } diff --git a/extras/scsi_id/scsi_id.h b/extras/scsi_id/scsi_id.h index b5312b898..758706ba2 100644 --- a/extras/scsi_id/scsi_id.h +++ b/extras/scsi_id/scsi_id.h @@ -21,7 +21,7 @@ * USA */ -#define MAX_NAME_LEN 72 +#define MAX_PATH_LEN 512 /* * MAX_ATTR_LEN: maximum length of the result of reading a sysfs diff --git a/extras/usb_id/usb_id.c b/extras/usb_id/usb_id.c index 0bcd267f6..62aa1506d 100644 --- a/extras/usb_id/usb_id.c +++ b/extras/usb_id/usb_id.c @@ -23,7 +23,7 @@ #include "../../udev.h" -#define MAX_NAME_LEN 72 +#define MAX_PATH_LEN 512 #define MAX_SERIAL_LEN 256 #define BLKGETSIZE64 _IOR(0x12,114,size_t) @@ -247,7 +247,9 @@ static int usb_id(const char *devpath) struct sysfs_device *dev; struct sysfs_device *dev_scsi; struct sysfs_device *dev_target; - struct sysfs_device *dev_host, *dev_interface, *dev_usb; + struct sysfs_device *dev_host; + struct sysfs_device *dev_interface; + struct sysfs_device *dev_usb; const char *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev; const char *usb_model = NULL, *usb_vendor = NULL, *usb_rev, *usb_serial; const char *if_class, *if_subclass; @@ -263,14 +265,9 @@ static int usb_id(const char *devpath) } /* get scsi parent device */ - dev_scsi = sysfs_device_get_parent(dev); + dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi"); if (dev_scsi == NULL) { - err("unable to access parent device of '%s'", devpath); - return 1; - } - /* allow only scsi devices */ - if (strcmp(dev_scsi->subsystem, "scsi") != 0) { - info("%s is not a scsi device", devpath); + err("unable to find parent 'scsi' device of '%s'", devpath); return 1; } @@ -289,20 +286,16 @@ static int usb_id(const char *devpath) } /* usb interface directory */ - dev_interface = sysfs_device_get_parent(dev_host); + dev_interface = sysfs_device_get_parent_with_subsystem(dev_host, "usb"); if (dev_interface == NULL) { err("unable to access parent device of '%s'", devpath); return 1; } /* usb device directory */ - dev_usb = sysfs_device_get_parent(dev_interface); + dev_usb = sysfs_device_get_parent_with_subsystem(dev_interface, "usb"); if (dev_usb == NULL) { - err("unable to access parent device of '%s'", devpath); - return 1; - } - if (strcmp(dev_interface->subsystem, "usb") != 0) { - info("%s is not an usb device", devpath); + err("unable to find parent 'usb' device of '%s'", devpath); return 1; } @@ -397,7 +390,7 @@ int main(int argc, char **argv) { int retval = 0; const char *env; - char devpath[MAX_NAME_LEN]; + char devpath[MAX_PATH_LEN]; int option; logging_init("usb_id"); diff --git a/udev.h b/udev.h index 5d54b5443..0c7ca12f1 100644 --- a/udev.h +++ b/udev.h @@ -113,6 +113,7 @@ extern void sysfs_cleanup(void); extern void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, const char *subsystem); extern struct sysfs_device *sysfs_device_get(const char *devpath); extern struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev); +extern struct sysfs_device *sysfs_device_get_parent_with_subsystem(struct sysfs_device *dev, const char *subsystem); extern char *sysfs_attr_get_value(const char *devpath, const char *attr_name); /* udev_add.c */ diff --git a/udev_sysfs.c b/udev_sysfs.c index 983837980..172f0ce1f 100644 --- a/udev_sysfs.c +++ b/udev_sysfs.c @@ -306,6 +306,19 @@ device_link: return sysfs_device_get(parent_devpath); } +struct sysfs_device *sysfs_device_get_parent_with_subsystem(struct sysfs_device *dev, const char *subsystem) +{ + struct sysfs_device *dev_parent; + + dev_parent = sysfs_device_get_parent(dev); + while (dev_parent != NULL) { + if (strcmp(dev_parent->subsystem, subsystem) == 0) + return dev_parent; + dev_parent = sysfs_device_get_parent(dev_parent); + } + return NULL; +} + char *sysfs_attr_get_value(const char *devpath, const char *attr_name) { char path_full[PATH_SIZE]; -- 2.30.2