chiark / gitweb /
[PATCH] update udev scsi_id to scsi_id 0.3
authorpatmans@us.ibm.com <patmans@us.ibm.com>
Sat, 17 Jan 2004 06:03:50 +0000 (22:03 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:13:17 +0000 (21:13 -0700)
extras/scsi_id/ChangeLog
extras/scsi_id/Makefile
extras/scsi_id/README
extras/scsi_id/TODO
extras/scsi_id/release-notes [new file with mode: 0644]
extras/scsi_id/scsi_id.c
extras/scsi_id/scsi_id.config
extras/scsi_id/scsi_id.h
extras/scsi_id/scsi_serial.c

index 7f2317723dd10d1a7f7c550cb84f40bf9a63fbb4..7032dfd07ffdff92719a635cd83810612afdf61b 100644 (file)
@@ -1,3 +1,36 @@
+2004-jan-15:
+       * Makefile: Version 0.3
+
+2004-jan-13:
+       * scsi_id.c, Makefile: Fix prefix usage with scsi_id.config.
+
+2004-jan-13:
+       * scsi_id.config: Clean up some comment entries.
+
+2004-jan-13:
+       * Makefile: Install the sample scsi_id.config file.
+
+2004-jan-13:
+       * Makefile: Use DESTDIR in all install/uninstall rules, per
+         problem reported by Svetoslav Slavtchev.
+
+2004-jan-12:
+       * scsi_id.h, scsi_id.c, scsi_serial.c: Fix to work with current
+         sysfs 0.4, based on patch from Dan Stekloff, but uses
+         sysfs_read_attribute_value instead of
+         sysfs_get_value_from_attributes.
+
+2004-jan-08:
+       * scsi_id.c: SYSFS_BUS_DIR was replaced with SYSFS_BUS_NAME.
+
+2004-jan-08:
+       * scsi_id.c: Must now use sysfs_open_class_device_path instead of the
+         previous sysfs_open_class_device.
+
+2003-dec-07:
+       * Makefile: patch from Olaf Hering <olh@suse.de> remove DEBUG and
+         add --fno-builtin
+
 2003-dec-05:
        * Makefile, scsi_id.8: Add a man page.
 
          is no support for that in klibc.
 
 2003-nov-17:
-       * scsi_id.c: Patch from Brian King: check result of setting model,
-         not vendor in per_dev_options.
+       * scsi_id.c: Patch from Brian King <brking@us.ibm.com>: check
+         result of setting model, not vendor in per_dev_options.
 
 2003-nov-03:
        * scsi_id.c, scsi_serial.c: Use new and correct path to libsysfs.h.
 
 2003-nov-03:
-       * scsi_id.h: Fix scsi_id.h so var args in marcros works ok with
+       * scsi_id.h: Fix scsi_id.h so var args in macros works ok with
          older gcc.
index ead205682ac0502111657dfc8ca87edc95291b60..abf48895ad6bb48e53ca4855d42c2dadeabcf5ef 100644 (file)
 # 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.2
+SCSI_ID_VERSION=0.3
 
 prefix =
+etcdir =        ${prefix}/etc
 sbindir =      ${prefix}/sbin
 mandir =       ${prefix}/usr/share/man
 
@@ -27,7 +28,7 @@ INSTALL_DATA  = ${INSTALL} -m 644
 # Note some of the variables used here are set when built under udev, and
 # otherwise might not be set.
 
-override CFLAGS+=-DSCSI_ID_VERSION=\"$(SCSI_ID_VERSION)\" $(DEBUG) -Wall
+override CFLAGS+=-Wall -fno-builtin
 
 PROG=scsi_id
 SYSFS=-lsysfs
@@ -39,25 +40,35 @@ SYSFS=-lsysfs
 # LDFLAGS=$(STRIP)
 LD=$(CC)
 
-OBJS= scsi_id.o \
-       scsi_serial.o \
+OBJS=  scsi_id.o scsi_serial.o
 
 all:   $(PROG)
 
 # XXX use a compressed man page?
 
 install: all
-       $(INSTALL_PROGRAM) -D $(PROG) $(sbindir)/$(PROG)
+       $(INSTALL_PROGRAM) -D $(PROG) $(DESTDIR)$(sbindir)/$(PROG)
        $(INSTALL_DATA) -D scsi_id.8 $(DESTDIR)$(mandir)/man8/scsi_id.8
+       @if [ ! -r $(DESTDIR)$(etcdir)/scsi_id.config ]; then \
+               echo $(INSTALL_DATA) -D ./scsi_id.config  $(DESTDIR)$(etcdir); \
+               $(INSTALL_DATA) -D ./scsi_id.config $(DESTDIR)$(etcdir)/scsi_id.config; \
+       fi
        
 uninstall:
-       -rm $(sbindir)/$(PROG)
-       -rm $(mandir)/man8/scsi_id.8
+       -rm $(DESTDIR)$(sbindir)/$(PROG)
+       -rm $(DESTDIR)$(mandir)/man8/scsi_id.8
+       -rm $(DESTDIR)$(etcdir)/scsi_id.config
 
-$(OBJS): scsi_id.h scsi.h
+GEN_HEADER=scsi_id_version.h
+
+scsi_id_version.h:
+       @echo "/* This file is auto-generated by the Makefile */" > $@
+       @echo \#define SCSI_ID_VERSION     \"$(SCSI_ID_VERSION)\" >> $@
+       @echo \#define SCSI_ID_CONFIG_FILE     \"$(etcdir)/scsi_id.config\" >> $@
+$(OBJS): scsi_id.h scsi.h scsi_id_version.h
 
 clean:
-       rm -f $(PROG) $(OBJS)
+       rm -f $(PROG) $(OBJS) $(GEN_HEADER)
 
 $(PROG):       $(OBJS)
        $(LD) $(LDFLAGS) -o $(PROG) $(CRT0) $(OBJS) $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS)
index 4281c318a244a88775ad05ba741d798a013af857..97af517304dae6f861e1daf935c71db7287c388d 100644 (file)
@@ -7,12 +7,7 @@ Requires:
 
        - Linux kernel 2.6
 
-       - libsysfs
-
-No man page yet.
-
-libsysfs 0_2_0 was not installing libsysfs.h or dlist.h, manually copy
-those files to /usr/include/sys before compiling.
+       - sysfsutils 0.4
 
 Build via make and make install.
 
index 5d020c276a8966e7cb722ebb5a09e73e1f1cc5bf..dde5c84a671122bf506540269cb625a6897ae651 100644 (file)
@@ -1,4 +1,4 @@
-- add information abou the config file to the man page
+- add information about the config file to the man page
 
 - change so non-KLIBC builds under udev don't use /usr/include/sysfs,
   but instead use the sysfs included with udev (needs udev change and/or
diff --git a/extras/scsi_id/release-notes b/extras/scsi_id/release-notes
new file mode 100644 (file)
index 0000000..7ef12a2
--- /dev/null
@@ -0,0 +1,39 @@
+Version 0.3 of scsi_id is available at:
+
+http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.3.tar.gz
+
+scsi_id is a program to generate a SCSI unique identifier for a given SCSI
+device.
+
+It is primarily for use with udev callout config entries. It can also be
+used for automatic multi-path configuration or device mapper configuration.
+
+Version 0.3 requires:
+
+- Linux kernel 2.6
+- libsysfs 0.4.0
+
+Major changes since the last release:
+
+       - Changes to work with libsysfs 0.4.0
+
+All changes:
+
+       - fix "prefix" usage for path to scsi_id.config
+
+       - install the sample scsi_id.config file.
+
+       - Use DESTDIR in all install/uninstall rules, per problem reported
+         by Svetoslav Slavtchev.
+
+       - Fix to work with current sysfs 0.4, based on patch from Dan
+         Stekloff, but uses sysfs_read_attribute_value instead of
+         sysfs_get_value_from_attributes.
+
+       - SYSFS_BUS_DIR was replaced with SYSFS_BUS_NAME.
+
+       - Must now use sysfs_open_class_device_path instead of the
+         previous sysfs_open_class_device.
+
+       - patch from Olaf Hering <olh@suse.de> remove DEBUG and
+         add --fno-builtin
index 6bb41132de1e3b248a99b00a2c28d1c0f697131d..75a342bb1265c10c896f291b231ae45ef4bdb01f 100644 (file)
@@ -40,6 +40,7 @@
 #else
 #include <sysfs/libsysfs.h>
 #endif
+#include "scsi_id_version.h"
 #include "scsi_id.h"
 
 #ifndef SCSI_ID_VERSION
@@ -53,8 +54,6 @@
 #define TMP_DIR        "/tmp"
 #define TMP_PREFIX "scsi"
 
-#define CONFIG_FILE "/etc/scsi_id.config"
-
 static const char short_options[] = "bc:d:ef:gip:s:vV";
 /*
  * Just duplicate per dev options.
@@ -67,7 +66,7 @@ static int all_good;
 static char *default_callout;
 static int dev_specified;
 static int sys_specified;
-static char config_file[MAX_NAME_LEN] = CONFIG_FILE;
+static char config_file[MAX_NAME_LEN] = SCSI_ID_CONFIG_FILE;
 static int display_bus_id;
 static int default_page_code;
 static int use_stderr;
@@ -102,6 +101,18 @@ void log_message (int level, const char *format, ...)
        return;
 }
 
+int sysfs_get_attr(const char *devpath, const char *attr, char *value,
+                  size_t bufsize)
+{
+       char attr_path[SYSFS_PATH_MAX];
+
+       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 sysfs_get_actual_dev(const char *sysfs_path, char *dev, int len)
 {
        dprintf("%s\n", sysfs_path);
@@ -153,34 +164,22 @@ static int sysfs_is_bus(const char *sysfs_path, const char *bus)
 
 static int get_major_minor(const char *devpath, int *major, int *minor)
 {
-       struct sysfs_class_device *class_dev;
-       char dev_value[SYSFS_NAME_LEN];
-       char *dev;
-
-       dprintf("%s\n", devpath);
-       class_dev = sysfs_open_class_device_path(devpath);
-       if (!class_dev) {
-               log_message(LOG_WARNING, "open class %s failed: %s\n", devpath,
-                           strerror(errno));
-               return -1;
-       }
+       char dev_value[MAX_ATTR_LEN];
 
-       dev = sysfs_get_attr(class_dev, "dev");
-       if (dev)
-               strncpy(dev_value, dev, SYSFS_NAME_LEN);
-       sysfs_close_class_device(class_dev);
-       if (!dev) {
+       if (sysfs_get_attr(devpath, "dev", dev_value, MAX_ATTR_LEN)) {
                /*
                 * XXX This happens a lot, since sg has no dev attr.
-                * Someday change this back to a LOG_WARNING.
+                * And now sysfsutils does not set a meaningful errno
+                * value. Someday change this back to a LOG_WARNING.
+                * And if sysfsutils changes, check for ENOENT and handle
+                * it separately.
                 */
                log_message(LOG_DEBUG, "%s could not get dev attribute: %s\n",
                        devpath, strerror(errno));
                return -1;
        }
-       dev = NULL;
 
-       dprintf("dev %s", dev_value); /* dev_value has a trailing \n */
+       dprintf("dev value %s", dev_value); /* dev_value has a trailing \n */
        if (sscanf(dev_value, "%u:%u", major, minor) != 2) {
                log_message(LOG_WARNING, "%s: invalid dev major/minor\n",
                            devpath);
@@ -547,8 +546,8 @@ static int per_dev_options(struct sysfs_class_device *scsi_dev, int *good_bad,
        int retval;
        int newargc;
        char **newargv = NULL;
-       char *vendor;
-       char *model;
+       char vendor[MAX_ATTR_LEN];
+       char model[MAX_ATTR_LEN];
        int option;
 
        *good_bad = all_good;
@@ -558,16 +557,14 @@ static int per_dev_options(struct sysfs_class_device *scsi_dev, int *good_bad,
        else
                callout[0] = '\0';
 
-       vendor = sysfs_get_attr(scsi_dev, "vendor");
-       if (!vendor) {
-               log_message(LOG_WARNING, "%s: no vendor attribute\n",
+       if (sysfs_get_attr(scsi_dev->path, "vendor", vendor, MAX_ATTR_LEN)) {
+               log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
                            scsi_dev->name);
                return -1;
        }
 
-       model = sysfs_get_attr(scsi_dev, "model");
-       if (!model) {
-               log_message(LOG_WARNING, "%s: no model attribute\n",
+       if (sysfs_get_attr(scsi_dev->path, "model", model, MAX_ATTR_LEN)) {
+               log_message(LOG_WARNING, "%s: cannot get model attribute\n",
                            scsi_dev->name);
                return -1;
        }
index 4fdb89e28a31eca254ee0b8163be0e181e905820..f3fc4b3fdac4a0359a3cbe92f4a0691eb099934e 100644 (file)
@@ -21,7 +21,9 @@
 # vendor=string[,model=string],options=<per-device scsi_id options>
 
 #
-# If you normally don't need id's, black list everyone:
+# If you normally don't need scsi id's, or might be attaching devices of
+# an unknown functionality, black list everyone. This is the default
+# behaviour (if no -b or -g is specified).
 #
 options=-b
 
@@ -30,7 +32,8 @@ options=-b
 #
 vendor=someone, model=nicedrive, options=-g
 
-# If you have all good devices on your system use, mark all as good:
+# If you all the scsi devices are your system support valid id's, remove
+# the -b line above, and mark all devices as good:
 
 ## options=-g
 
index cb27e88a5f308707a558559c3060513908ee4c57..573a2b60d78ee5fd25bb0c41db833cbf538eeacc 100644 (file)
 #define        MAX_NAME_LEN    72
 #define OFFSET (2 * sizeof(unsigned int))
 
+/*
+ * MAX_ATTR_LEN: maximum length of the result of reading a sysfs
+ * attribute.
+ */
+#define        MAX_ATTR_LEN    256
+
 /*
  * MAX_SERIAL_LEN: the maximum length of the serial number, including
  * added prefixes such as vendor and product (model) strings.
  */
 #define MAX_BUFFER_LEN 256
 
-static inline char *sysfs_get_attr(struct sysfs_class_device *dev,
-                                   const char *attr)
-{
-       struct dlist *attributes = NULL;
-
-       attributes = sysfs_get_classdev_attributes(dev);
-
-       if (attributes == NULL)
-               return NULL;
-
-       return sysfs_get_value_from_attributes(attributes, attr);
-}
-
+extern int sysfs_get_attr(const char *devpath, const char *attr, char *value,
+                         size_t bufsize);
 extern int scsi_get_serial (struct sysfs_class_device *scsi_dev,
                            const char *devname, int page_code, char *serial,
                            int len);
index 18cd29081723698bc0e32f8ae3b68a6226581c83..80a1d5163516785f92ada6515b876234efa7f821 100644 (file)
@@ -385,7 +385,7 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
                                 char *buffer, int len)
 {
        int retval;
-       char *vendor;
+       char vendor[MAX_ATTR_LEN];
 
        memset(buffer, 0, len);
        retval = scsi_inquiry(scsi_dev, fd, 1, 0x0, buffer, len);
@@ -415,9 +415,10 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
                 * If the vendor id appears in the page assume the page is
                 * invalid.
                 */
-               vendor = sysfs_get_attr(scsi_dev, "vendor");
-               if (!vendor) {
-                       log_message(LOG_WARNING, "%s: no vendor attribute\n",
+               if (sysfs_get_attr(scsi_dev->path, "vendor", vendor,
+                                  MAX_ATTR_LEN)) {
+                       log_message(LOG_WARNING,
+                                   "%s: cannot get model attribute\n",
                                    scsi_dev->name);
                        return 1;
                }
@@ -437,12 +438,11 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
 static int prepend_vendor_model(struct sysfs_class_device *scsi_dev,
                                char *serial)
 {
-       char *attr;
+       char attr[MAX_ATTR_LEN];
        int ind;
 
-       attr = sysfs_get_attr(scsi_dev, "vendor");
-       if (!attr) {
-               log_message(LOG_WARNING, "%s: no vendor attribute\n",
+       if (sysfs_get_attr(scsi_dev->path, "vendor", attr, MAX_ATTR_LEN)) {
+               log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
                            scsi_dev->name);
                return 1;
        }
@@ -454,9 +454,8 @@ static int prepend_vendor_model(struct sysfs_class_device *scsi_dev,
        if (serial[ind] == '\n')
                serial[ind] = '\0';
 
-       attr = sysfs_get_attr(scsi_dev, "model");
-       if (!attr) {
-               log_message(LOG_WARNING, "%s: no model attribute\n",
+       if (sysfs_get_attr(scsi_dev->path, "model", attr, MAX_ATTR_LEN)) {
+               log_message(LOG_WARNING, "%s: cannot get model attribute\n",
                            scsi_dev->name);
                return 1;
        }