chiark / gitweb /
fold multiple consecutive whitespace chars into single '_'
[elogind.git] / extras / scsi_id / scsi_id.c
index 8e5172f93c542f150a9800c97565e1832d7b47ad..aa1b16009e9f989cd301dfe9d78acd16391de767 100644 (file)
@@ -44,8 +44,8 @@
 /*
  * temporary names for mknod.
  */
-#define TMP_DIR        "/tmp"
-#define TMP_PREFIX "scsi"
+#define TMP_DIR        "/dev"
+#define TMP_PREFIX "tmp-scsi"
 
 /*
  * XXX Note the 'e' (send output to stderr in all cases), and 'c' (callout)
@@ -67,7 +67,7 @@ static int dev_specified;
 static int sys_specified;
 static char config_file[MAX_NAME_LEN] = SCSI_ID_CONFIG_FILE;
 static int display_bus_id;
-static int default_page_code;
+static enum page_code default_page_code;
 static int use_stderr;
 static int debug;
 static int hotplug_mode;
@@ -107,7 +107,7 @@ static void set_str(char *to, const char *from, size_t count)
 
        /* strip trailing whitespace */
        len = strnlen(from, count);
-       while (isspace(from[len-1]))
+       while (len && isspace(from[len-1]))
                len--;
 
        /* strip leading whitespace */
@@ -133,42 +133,42 @@ static void set_str(char *to, const char *from, size_t count)
        to[j] = '\0';
 }
 
-static void set_type(char *to, const char *from, int count)
+static void set_type(char *to, const char *from, size_t len)
 {
        int type_num;
        char *eptr;
+       char *type = "generic";
 
        type_num = strtoul(from, &eptr, 0);
        if (eptr != from) {
                switch (type_num) {
                case 0:
-                       sprintf(to, "disk");
+                       type = "disk";
                        break;
                case 1:
-                       sprintf(to, "tape");
+                       type = "tape";
                        break;
                case 4:
-                       sprintf(to, "optical");
+                       type = "optical";
                        break;
                case 5:
-                       sprintf(to, "cd");
+                       type = "cd";
                        break;
                case 7:
-                       sprintf(to, "optical");
+                       type = "optical";
                        break;
                case 0xe:
-                       sprintf(to, "disk");
+                       type = "disk";
                        break;
                case 0xf:
-                       sprintf(to, "optical");
+                       type = "optical";
                        break;
                default:
-                       sprintf(to, "generic");
                        break;
                }
-       } else {
-               sprintf(to, "generic");
        }
+       strncpy(to, type, len);
+       to[len-1] = '\0';
 }
 
 static int get_major_minor(struct sysfs_class_device *class_dev, int *maj,
@@ -475,7 +475,7 @@ static int set_options(int argc, char **argv, const char *short_opts,
         */
        optind = 1;
        while (1) {
-               option = getopt(argc, argv, short_options);
+               option = getopt(argc, argv, short_opts);
                if (option == -1)
                        break;
 
@@ -519,9 +519,11 @@ static int set_options(int argc, char **argv, const char *short_opts,
 
                case 'p':
                        if (strcmp(optarg, "0x80") == 0) {
-                               default_page_code = 0x80;
+                               default_page_code = PAGE_80;
                        } else if (strcmp(optarg, "0x83") == 0) {
-                               default_page_code = 0x83;
+                               default_page_code = PAGE_83;
+                       } else if (strcmp(optarg, "pre-spc3-83") == 0) {
+                               default_page_code = PAGE_83_PRE_SPC3; 
                        } else {
                                log_message(LOG_WARNING,
                                            "Unknown page code '%s'\n", optarg);
@@ -601,7 +603,7 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
                            scsi_dev->name);
                return -1;
        }
-       set_type(type_str, type->value, sizeof(type_str)-1);
+       set_type(type_str, type->value, sizeof(type_str));
 
        type = sysfs_get_device_attr(scsi_dev, "rev");
        if (!type) {
@@ -640,9 +642,11 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
 
                case 'p':
                        if (strcmp(optarg, "0x80") == 0) {
-                               *page_code = 0x80;
+                               *page_code = PAGE_80;
                        } else if (strcmp(optarg, "0x83") == 0) {
-                               *page_code = 0x83;
+                               *page_code = PAGE_83;
+                       } else if (strcmp(optarg, "pre-spc3-83") == 0) {
+                               *page_code = PAGE_83_PRE_SPC3; 
                        } else {
                                log_message(LOG_WARNING,
                                            "Unknown page code '%s'\n", optarg);
@@ -673,13 +677,22 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
  */
 static void format_serial(char *serial)
 {
-       char *p = serial;
+       char *p = serial, *q;
 
+       q = p;
        while (*p != '\0') {
-               if (isspace(*p))
-                       *p = '_';
+               if (isspace(*p)) {
+                       if (q > serial && q[-1] != '_') {
+                               *q = '_';
+                               q++;
+                       }
+               } else {
+                       *q = *p;
+                       q++;
+               }
                p++;
        }
+       *q = '\0';
 }
 
 /*