chiark / gitweb /
[PATCH] update scsi_id to work with libsysfs changes
authorpatmans@us.ibm.com <patmans@us.ibm.com>
Sat, 26 Feb 2005 07:51:17 +0000 (23:51 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:39:48 +0000 (23:39 -0700)
Update scsi_id to work with the libsysfs changes in udev: use
sysfs_get_classdev_attr and sysfs_get_device_attr in place of
sysfs_read_attribute_value.

extras/scsi_id/Makefile
extras/scsi_id/scsi_id.c
extras/scsi_id/scsi_id.h
extras/scsi_id/scsi_serial.c

index e832102..7aa3e83 100644 (file)
@@ -14,7 +14,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
-SCSI_ID_VERSION=0.8
+SCSI_ID_VERSION=0.9
 
 prefix =
 etcdir =        ${prefix}/etc
index 507fa27..32a96d8 100644 (file)
@@ -100,23 +100,13 @@ void log_message (int level, const char *format, ...)
        return;
 }
 
-int sysfs_get_attr(const char *devpath, const char *attr, char *value,
-                  size_t bufsize)
+static int get_major_minor(struct sysfs_class_device *class_dev, int *maj,
+                          int *min)
 {
-       char attr_path[SYSFS_PATH_MAX];
+       struct sysfs_attribute *dev_attr;
 
-       strncpy(attr_path, devpath, SYSFS_PATH_MAX);
-       strncat(attr_path, "/", SYSFS_PATH_MAX);
-       strncat(attr_path, attr,  SYSFS_PATH_MAX);
-       dprintf("%s\n", attr_path);
-       return sysfs_read_attribute_value(attr_path, value, SYSFS_NAME_LEN);
-}
-
-static int get_major_minor(const char *devpath, int *maj, int *min)
-{
-       char dev_value[MAX_ATTR_LEN];
-
-       if (sysfs_get_attr(devpath, "dev", dev_value, MAX_ATTR_LEN)) {
+       dev_attr = sysfs_get_classdev_attr(class_dev, "dev");
+       if (!dev_attr) {
                /*
                 * XXX This happens a lot, since sg has no dev attr.
                 * And now sysfsutils does not set a meaningful errno
@@ -125,27 +115,28 @@ static int get_major_minor(const char *devpath, int *maj, int *min)
                 * it separately.
                 */
                log_message(LOG_DEBUG, "%s: could not get dev attribute: %s\n",
-                       devpath, strerror(errno));
+                       class_dev->name, strerror(errno));
                return -1;
        }
 
-       dprintf("dev value %s", dev_value); /* dev_value has a trailing \n */
-       if (sscanf(dev_value, "%u:%u", maj, min) != 2) {
+       dprintf("dev value %s", dev_attr->value); /* value has a trailing \n */
+       if (sscanf(dev_attr->value, "%u:%u", maj, min) != 2) {
                log_message(LOG_WARNING, "%s: invalid dev major/minor\n",
-                           devpath);
+                           class_dev->name);
                return -1;
        }
 
        return 0;
 }
 
-static int create_tmp_dev(const char *devpath, char *tmpdev, int dev_type)
+static int create_tmp_dev(struct sysfs_class_device *class_dev, char *tmpdev,
+                         int dev_type)
 {
        int maj, min;
 
-       dprintf("(%s)\n", devpath);
+       dprintf("(%s)\n", class_dev->name);
 
-       if (get_major_minor(devpath, &maj, &min))
+       if (get_major_minor(class_dev, &maj, &min))
                return -1;
        snprintf(tmpdev, MAX_NAME_LEN, "%s/%s-maj%d-min%d-%u",
                 TMP_DIR, TMP_PREFIX, maj, min, getpid());
@@ -500,8 +491,7 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
        int retval;
        int newargc;
        char **newargv = NULL;
-       char vendor[MAX_ATTR_LEN];
-       char model[MAX_ATTR_LEN];
+       struct sysfs_attribute *vendor, *model;
        int option;
 
        *good_bad = all_good;
@@ -511,19 +501,22 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
        else
                callout[0] = '\0';
 
-       if (sysfs_get_attr(scsi_dev->path, "vendor", vendor, MAX_ATTR_LEN)) {
+       vendor = sysfs_get_device_attr(scsi_dev, "vendor");
+       if (!vendor) {
                log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
                            scsi_dev->name);
                return -1;
        }
 
-       if (sysfs_get_attr(scsi_dev->path, "model", model, MAX_ATTR_LEN)) {
+       model = sysfs_get_device_attr(scsi_dev, "model");
+       if (!model) {
                log_message(LOG_WARNING, "%s: cannot get model attribute\n",
                            scsi_dev->name);
                return -1;
        }
 
-       retval = get_file_options(vendor, model, &newargc, &newargv);
+       retval = get_file_options(vendor->value, model->value, &newargc,
+                                 &newargv);
 
        optind = 1; /* reset this global extern */
        while (retval == 0) {
@@ -694,10 +687,8 @@ static int scsi_id(const char *target_path, char *maj_min_dev)
 
        /*
         * mknod a temp dev to communicate with the device.
-        *
-        * XXX pass down class_dev or class_dev_parent.
         */
-       if (!dev_specified && create_tmp_dev(target_path, maj_min_dev,
+       if (!dev_specified && create_tmp_dev(class_dev, maj_min_dev,
                                             dev_type)) {
                dprintf("create_tmp_dev failed\n");
                return 1;
index 0ca7cd4..74b449e 100644 (file)
@@ -44,8 +44,6 @@
  */
 #define MAX_BUFFER_LEN 256
 
-extern int sysfs_get_attr(const char *devpath, const char *attr, char *value,
-                         size_t bufsize);
 extern int scsi_get_serial (struct sysfs_device *scsi_dev, const char
                            *devname, int page_code, char *serial, int
                            len);
index 8b9fbe0..20a7928 100644 (file)
@@ -364,7 +364,7 @@ static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
                                 char *buffer, int len)
 {
        int retval;
-       char vendor[MAX_ATTR_LEN];
+       struct sysfs_attribute *vendor;
 
        memset(buffer, 0, len);
        retval = scsi_inquiry(scsi_dev, fd, 1, 0x0, buffer, len);
@@ -394,14 +394,15 @@ static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
                 * If the vendor id appears in the page assume the page is
                 * invalid.
                 */
-               if (sysfs_get_attr(scsi_dev->path, "vendor", vendor,
-                                  MAX_ATTR_LEN)) {
+               vendor = sysfs_get_device_attr(scsi_dev, "vendor");
+               if (!vendor) {
                        log_message(LOG_WARNING,
                                    "%s: cannot get model attribute\n",
                                    scsi_dev->name);
                        return 1;
                }
-               if (!strncmp(&buffer[VENDOR_LENGTH], vendor, VENDOR_LENGTH)) {
+               if (!strncmp(&buffer[VENDOR_LENGTH], vendor->value,
+                            VENDOR_LENGTH)) {
                        log_message(LOG_WARNING, "%s: invalid page0 data\n",
                                    scsi_dev->name);
                        return 1;
@@ -416,15 +417,16 @@ static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
  */
 static int prepend_vendor_model(struct sysfs_device *scsi_dev, char *serial)
 {
-       char attr[MAX_ATTR_LEN];
+       struct sysfs_attribute *attr;
        int ind;
 
-       if (sysfs_get_attr(scsi_dev->path, "vendor", attr, MAX_ATTR_LEN)) {
+       attr = sysfs_get_device_attr(scsi_dev, "vendor");
+       if (!attr) {
                log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
                            scsi_dev->name);
                return 1;
        }
-       strncpy(serial, attr, VENDOR_LENGTH);
+       strncpy(serial, attr->value, VENDOR_LENGTH);
        ind = strlen(serial) - 1;
        /*
         * Remove sysfs added newlines.
@@ -432,12 +434,13 @@ static int prepend_vendor_model(struct sysfs_device *scsi_dev, char *serial)
        if (serial[ind] == '\n')
                serial[ind] = '\0';
 
-       if (sysfs_get_attr(scsi_dev->path, "model", attr, MAX_ATTR_LEN)) {
+       attr = sysfs_get_device_attr(scsi_dev, "model");
+       if (!attr) {
                log_message(LOG_WARNING, "%s: cannot get model attribute\n",
                            scsi_dev->name);
                return 1;
        }
-       strncat(serial, attr, MODEL_LENGTH);
+       strncat(serial, attr->value, MODEL_LENGTH);
        ind = strlen(serial) - 1;
        if (serial[ind] == '\n')
                serial[ind] = '\0';