Remove the use of strou because scsi device types are signed (as seen in the 
kernel's code).
Improve the representation of SCSI_DEVICE_LIST.

function                                             old     new   delta
.rodata                                           159915  159920      +5
lsscsi_main                                          364     349     -15
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 5/-15)             Total: -10 bytes
   text    data     bss     dec     hex filename
 981332   16915    1872 1000119   f42b7 busybox_old
 981322   16915    1872 1000109   f42ad busybox_unstripped

Signed-off-by: Martin Lewis <martin.lewis....@gmail.com>
---
 miscutils/lsscsi.c | 50 ++++++++++++++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 16 deletions(-)

diff --git a/miscutils/lsscsi.c b/miscutils/lsscsi.c
index f737d33d9..e29bedd77 100644
--- a/miscutils/lsscsi.c
+++ b/miscutils/lsscsi.c
@@ -25,6 +25,28 @@
 
 #include "libbb.h"
 
+#define SCSI_DEVICE_TYPE(type, name) type name "\0"
+#define SCSI_DEVICE_TYPE_LIST \
+               SCSI_DEVICE_TYPE("\x00", "disk") \
+               SCSI_DEVICE_TYPE("\x01", "tape") \
+               SCSI_DEVICE_TYPE("\x02", "printer") \
+               SCSI_DEVICE_TYPE("\x03", "process") \
+               SCSI_DEVICE_TYPE("\x04", "worm") \
+               SCSI_DEVICE_TYPE("\x06", "scanner") \
+               SCSI_DEVICE_TYPE("\x07", "optical") \
+               SCSI_DEVICE_TYPE("\x08", "mediumx") \
+               SCSI_DEVICE_TYPE("\x09", "comms") \
+               SCSI_DEVICE_TYPE("\x0c", "storage") \
+               SCSI_DEVICE_TYPE("\x0d", "enclosu") \
+               SCSI_DEVICE_TYPE("\x0e", "sim dsk") \
+               SCSI_DEVICE_TYPE("\x0f", "opti rd") \
+               SCSI_DEVICE_TYPE("\x10", "bridge") \
+               SCSI_DEVICE_TYPE("\x11", "osd") \
+               SCSI_DEVICE_TYPE("\x12", "adi") \
+               SCSI_DEVICE_TYPE("\x1e", "wlun") \
+               SCSI_DEVICE_TYPE("\x1f", "no dev")
+
+
 static const char scsi_dir[] ALIGN1 = "/sys/bus/scsi/devices";
 
 static char *get_line(const char *filename, char *buf, unsigned *bufsize_p)
@@ -59,6 +81,13 @@ int lsscsi_main(int argc UNUSED_PARAM, char **argv 
UNUSED_PARAM)
 
        dir = xopendir(".");
        while ((de = readdir(dir)) != NULL) {
+               /*
+                * From /drivers/scsi/scsi_sysfs.c in the kernel:
+                * sdev_rd_attr (type, "%d\n");
+                * sdev_rd_attr (vendor, "%.8s\n");
+                * sdev_rd_attr (model, "%.16s\n");
+                * sdev_rd_attr (rev, "%.4s\n");
+                */
                char buf[256];
                char *ptr;
                unsigned bufsize;
@@ -67,7 +96,7 @@ int lsscsi_main(int argc UNUSED_PARAM, char **argv 
UNUSED_PARAM)
                const char *type_name;
                const char *model;
                const char *rev;
-               unsigned type;
+               int type;
 
                if (!isdigit(de->d_name[0]))
                        continue;
@@ -88,23 +117,12 @@ int lsscsi_main(int argc UNUSED_PARAM, char **argv 
UNUSED_PARAM)
 
                printf("[%s]\t", de->d_name);
 
-#define scsi_device_types \
-       "disk\0"    "tape\0"    "printer\0" "process\0" \
-       "worm\0"    "\0"        "scanner\0" "optical\0" \
-       "mediumx\0" "comms\0"   "\0"        "\0"        \
-       "storage\0" "enclosu\0" "sim dsk\0" "opti rd\0" \
-       "bridge\0"  "osd\0"     "adi\0"     "\0"        \
-       "\0"        "\0"        "\0"        "\0"        \
-       "\0"        "\0"        "\0"        "\0"        \
-       "\0"        "\0"        "wlun\0"    "no dev"
-               type = bb_strtou(type_str, NULL, 10);
-               if (errno
-                || type >= 0x20
-                || (type_name = nth_string(scsi_device_types, type))[0] == '\0'
-               ) {
+               type = atoi(type_str); /* type_str is "%d\n" so atoi is 
sufficient */
+               if (type >= 0x20 ||
+                       (type_name = memchr(SCSI_DEVICE_TYPE_LIST, type, 
sizeof(SCSI_DEVICE_TYPE_LIST))) == NULL) {
                        printf("(%s)\t", type_str);
                } else {
-                       printf("%s\t", type_name);
+                       printf("%s\t", type_name + 1);
                }
 
                printf("%s\t""%s\t""%s\n",
-- 
2.11.0

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to