chiark / gitweb /
udev-builtin-blkid: modernizations and minor fixes
[elogind.git] / src / udev / scsi_id / scsi_serial.c
index 6bfb7f780cbf204e1e5692e9977e6c587a596b1d..378a73d8639d2f67cbb3f8f1f411bb029e616285 100644 (file)
@@ -197,7 +197,7 @@ static int scsi_dump_sense(struct udev *udev,
          */
 
         if (sb_len < 1) {
-                log_debug("%s: sense buffer empty\n", dev_scsi->kernel);
+                log_debug("%s: sense buffer empty", dev_scsi->kernel);
                 return -1;
         }
 
@@ -210,7 +210,7 @@ static int scsi_dump_sense(struct udev *udev,
                  */
                 s = sense_buffer[7] + 8;
                 if (sb_len < s) {
-                        log_debug("%s: sense buffer too small %d bytes, %d bytes too short\n",
+                        log_debug("%s: sense buffer too small %d bytes, %d bytes too short",
                             dev_scsi->kernel, sb_len, s - sb_len);
                         return -1;
                 }
@@ -220,7 +220,7 @@ static int scsi_dump_sense(struct udev *udev,
                                 /*
                                  * Possible?
                                  */
-                                log_debug("%s: sense result too" " small %d bytes\n",
+                                log_debug("%s: sense result too" " small %d bytes",
                                     dev_scsi->kernel, s);
                                 return -1;
                         }
@@ -231,25 +231,25 @@ static int scsi_dump_sense(struct udev *udev,
                         asc = sense_buffer[2];
                         ascq = sense_buffer[3];
                 } else {
-                        log_debug("%s: invalid sense code 0x%x\n",
+                        log_debug("%s: invalid sense code 0x%x",
                             dev_scsi->kernel, code);
                         return -1;
                 }
-                log_debug("%s: sense key 0x%x ASC 0x%x ASCQ 0x%x\n",
+                log_debug("%s: sense key 0x%x ASC 0x%x ASCQ 0x%x",
                     dev_scsi->kernel, sense_key, asc, ascq);
         } else {
                 if (sb_len < 4) {
-                        log_debug("%s: sense buffer too small %d bytes, %d bytes too short\n",
+                        log_debug("%s: sense buffer too small %d bytes, %d bytes too short",
                             dev_scsi->kernel, sb_len, 4 - sb_len);
                         return -1;
                 }
 
                 if (sense_buffer[0] < 15)
-                        log_debug("%s: old sense key: 0x%x\n", dev_scsi->kernel, sense_buffer[0] & 0x0f);
+                        log_debug("%s: old sense key: 0x%x", dev_scsi->kernel, sense_buffer[0] & 0x0f);
                 else
-                        log_debug("%s: sense = %2x %2x\n",
+                        log_debug("%s: sense = %2x %2x",
                             dev_scsi->kernel, sense_buffer[0], sense_buffer[2]);
-                log_debug("%s: non-extended sense class %d code 0x%0x\n",
+                log_debug("%s: non-extended sense class %d code 0x%0x",
                     dev_scsi->kernel, sense_class, code);
 
         }
@@ -261,8 +261,8 @@ static int scsi_dump_sense(struct udev *udev,
                 out_buffer[j++] = ' ';
         }
         out_buffer[j] = '\0';
-        log_debug("%s: sense dump:\n", dev_scsi->kernel);
-        log_debug("%s: %s\n", dev_scsi->kernel, out_buffer);
+        log_debug("%s: sense dump:", dev_scsi->kernel);
+        log_debug("%s: %s", dev_scsi->kernel, out_buffer);
 
 #endif
         return -1;
@@ -276,11 +276,11 @@ static int scsi_dump(struct udev *udev,
                 /*
                  * Impossible, should not be called.
                  */
-                log_debug("%s: called with no error\n", __FUNCTION__);
+                log_debug("%s: called with no error", __FUNCTION__);
                 return -1;
         }
 
-        log_debug("%s: sg_io failed status 0x%x 0x%x 0x%x 0x%x\n",
+        log_debug("%s: sg_io failed status 0x%x 0x%x 0x%x 0x%x",
             dev_scsi->kernel, io->driver_status, io->host_status, io->msg_status, io->status);
         if (io->status == SCSI_CHECK_CONDITION)
                 return scsi_dump_sense(udev, dev_scsi, io->sbp, io->sb_len_wr);
@@ -296,11 +296,11 @@ static int scsi_dump_v4(struct udev *udev,
                 /*
                  * Impossible, should not be called.
                  */
-                log_debug("%s: called with no error\n", __FUNCTION__);
+                log_debug("%s: called with no error", __FUNCTION__);
                 return -1;
         }
 
-        log_debug("%s: sg_io failed status 0x%x 0x%x 0x%x\n",
+        log_debug("%s: sg_io failed status 0x%x 0x%x 0x%x",
             dev_scsi->kernel, io->driver_status, io->transport_status,
              io->device_status);
         if (io->device_status == SCSI_CHECK_CONDITION)
@@ -325,13 +325,13 @@ static int scsi_inquiry(struct udev *udev,
         int retval;
 
         if (buflen > SCSI_INQ_BUFF_LEN) {
-                log_debug("buflen %d too long\n", buflen);
+                log_debug("buflen %d too long", buflen);
                 return -1;
         }
 
 resend:
         if (dev_scsi->use_sg == 4) {
-                memset(&io_v4, 0, sizeof(struct sg_io_v4));
+                memzero(&io_v4, sizeof(struct sg_io_v4));
                 io_v4.guard = 'Q';
                 io_v4.protocol = BSG_PROTOCOL_SCSI;
                 io_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD;
@@ -343,7 +343,7 @@ resend:
                 io_v4.din_xferp = (uintptr_t)buf;
                 io_buf = (void *)&io_v4;
         } else {
-                memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
+                memzero(&io_hdr, sizeof(struct sg_io_hdr));
                 io_hdr.interface_id = 'S';
                 io_hdr.cmd_len = sizeof(inq_cmd);
                 io_hdr.mx_sb_len = sizeof(sense);
@@ -362,7 +362,7 @@ resend:
                         dev_scsi->use_sg = 3;
                         goto resend;
                 }
-                log_debug("%s: ioctl failed: %s\n", dev_scsi->kernel, strerror(errno));
+                log_debug("%s: ioctl failed: %m", dev_scsi->kernel);
                 goto error;
         }
 
@@ -397,7 +397,7 @@ resend:
 
 error:
         if (retval < 0)
-                log_debug("%s: Unable to get INQUIRY vpd %d page 0x%x.\n",
+                log_debug("%s: Unable to get INQUIRY vpd %d page 0x%x.",
                     dev_scsi->kernel, evpd, page);
 
         return retval;
@@ -410,17 +410,17 @@ static int do_scsi_page0_inquiry(struct udev *udev,
 {
         int retval;
 
-        memset(buffer, 0, len);
+        memzero(buffer, len);
         retval = scsi_inquiry(udev, dev_scsi, fd, 1, 0x0, buffer, len);
         if (retval < 0)
                 return 1;
 
         if (buffer[1] != 0) {
-                log_debug("%s: page 0 not available.\n", dev_scsi->kernel);
+                log_debug("%s: page 0 not available.", dev_scsi->kernel);
                 return 1;
         }
         if (buffer[3] > len) {
-                log_debug("%s: page 0 buffer too long %d\n", dev_scsi->kernel,         buffer[3]);
+                log_debug("%s: page 0 buffer too long %d", dev_scsi->kernel,         buffer[3]);
                 return 1;
         }
 
@@ -436,8 +436,8 @@ static int do_scsi_page0_inquiry(struct udev *udev,
                  * If the vendor id appears in the page assume the page is
                  * invalid.
                  */
-                if (!strncmp((char *)&buffer[VENDOR_LENGTH], dev_scsi->vendor, VENDOR_LENGTH)) {
-                        log_debug("%s: invalid page0 data\n", dev_scsi->kernel);
+                if (strneq((char *)&buffer[VENDOR_LENGTH], dev_scsi->vendor, VENDOR_LENGTH)) {
+                        log_debug("%s: invalid page0 data", dev_scsi->kernel);
                         return 1;
                 }
         }
@@ -462,17 +462,17 @@ static int prepend_vendor_model(struct udev *udev,
          * above, ind will never be too large.
          */
         if (ind != (VENDOR_LENGTH + MODEL_LENGTH)) {
-                log_debug("%s: expected length %d, got length %d\n",
+                log_debug("%s: expected length %d, got length %d",
                      dev_scsi->kernel, (VENDOR_LENGTH + MODEL_LENGTH), ind);
                 return -1;
         }
         return ind;
 }
 
-/**
+/*
  * check_fill_0x83_id - check the page 0x83 id, if OK allocate and fill
  * serial number.
- **/
+ */
 static int check_fill_0x83_id(struct udev *udev,
                               struct scsi_id_device *dev_scsi,
                               unsigned char *page_83,
@@ -528,7 +528,7 @@ static int check_fill_0x83_id(struct udev *udev,
                 len += VENDOR_LENGTH + MODEL_LENGTH;
 
         if (max_len < len) {
-                log_debug("%s: length %d too short - need %d\n",
+                log_debug("%s: length %d too short - need %d",
                     dev_scsi->kernel, max_len, len);
                 return 1;
         }
@@ -622,14 +622,14 @@ static int do_scsi_page83_inquiry(struct udev *udev,
         /* also pick up the page 80 serial number */
         do_scsi_page80_inquiry(udev, dev_scsi, fd, NULL, unit_serial_number, MAX_SERIAL_LEN);
 
-        memset(page_83, 0, SCSI_INQ_BUFF_LEN);
+        memzero(page_83, SCSI_INQ_BUFF_LEN);
         retval = scsi_inquiry(udev, dev_scsi, fd, 1, PAGE_83, page_83,
                               SCSI_INQ_BUFF_LEN);
         if (retval < 0)
                 return 1;
 
         if (page_83[1] != PAGE_83) {
-                log_debug("%s: Invalid page 0x83\n", dev_scsi->kernel);
+                log_debug("%s: Invalid page 0x83", dev_scsi->kernel);
                 return 1;
         }
 
@@ -709,13 +709,13 @@ static int do_scsi_page83_prespc3_inquiry(struct udev *udev,
         int i, j;
         unsigned char page_83[SCSI_INQ_BUFF_LEN];
 
-        memset(page_83, 0, SCSI_INQ_BUFF_LEN);
+        memzero(page_83, SCSI_INQ_BUFF_LEN);
         retval = scsi_inquiry(udev, dev_scsi, fd, 1, PAGE_83, page_83, SCSI_INQ_BUFF_LEN);
         if (retval < 0)
                 return 1;
 
         if (page_83[1] != PAGE_83) {
-                log_debug("%s: Invalid page 0x83\n", dev_scsi->kernel);
+                log_debug("%s: Invalid page 0x83", dev_scsi->kernel);
                 return 1;
         }
         /*
@@ -773,19 +773,19 @@ static int do_scsi_page80_inquiry(struct udev *udev,
         int len;
         unsigned char buf[SCSI_INQ_BUFF_LEN];
 
-        memset(buf, 0, SCSI_INQ_BUFF_LEN);
+        memzero(buf, SCSI_INQ_BUFF_LEN);
         retval = scsi_inquiry(udev, dev_scsi, fd, 1, PAGE_80, buf, SCSI_INQ_BUFF_LEN);
         if (retval < 0)
                 return retval;
 
         if (buf[1] != PAGE_80) {
-                log_debug("%s: Invalid page 0x80\n", dev_scsi->kernel);
+                log_debug("%s: Invalid page 0x80", dev_scsi->kernel);
                 return 1;
         }
 
         len = 1 + VENDOR_LENGTH + MODEL_LENGTH + buf[3];
         if (max_len < len) {
-                log_debug("%s: length %d too short - need %d\n",
+                log_debug("%s: length %d too short - need %d",
                      dev_scsi->kernel, max_len, len);
                 return 1;
         }
@@ -799,6 +799,7 @@ static int do_scsi_page80_inquiry(struct udev *udev,
                 ser_ind = prepend_vendor_model(udev, dev_scsi, &serial[1]);
                 if (ser_ind < 0)
                         return 1;
+                ser_ind++; /* for the leading 'S' */
                 for (i = 4; i < len + 4; i++, ser_ind++)
                         serial[ser_ind] = buf[i];
         }
@@ -817,23 +818,21 @@ int scsi_std_inquiry(struct udev *udev,
         struct stat statbuf;
         int err = 0;
 
-        fd = open(devname, O_RDONLY | O_NONBLOCK);
+        fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
         if (fd < 0) {
-                log_debug("scsi_id: cannot open %s: %s\n",
-                     devname, strerror(errno));
+                log_debug("scsi_id: cannot open %s: %m", devname);
                 return 1;
         }
 
         if (fstat(fd, &statbuf) < 0) {
-                log_debug("scsi_id: cannot stat %s: %s\n",
-                     devname, strerror(errno));
+                log_debug("scsi_id: cannot stat %s: %m", devname);
                 err = 2;
                 goto out;
         }
         sprintf(dev_scsi->kernel,"%d:%d", major(statbuf.st_rdev),
                 minor(statbuf.st_rdev));
 
-        memset(buf, 0, SCSI_INQ_BUFF_LEN);
+        memzero(buf, SCSI_INQ_BUFF_LEN);
         err = scsi_inquiry(udev, dev_scsi, fd, 0, 0, buf, SCSI_INQ_BUFF_LEN);
         if (err < 0)
                 goto out;
@@ -862,12 +861,12 @@ int scsi_get_serial(struct udev *udev,
         int ind;
         int retval;
 
-        memset(dev_scsi->serial, 0, len);
+        memzero(dev_scsi->serial, len);
         srand((unsigned int)getpid());
         for (cnt = 20; cnt > 0; cnt--) {
                 struct timespec duration;
 
-                fd = open(devname, O_RDONLY | O_NONBLOCK);
+                fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
                 if (fd >= 0 || errno != EBUSY)
                         break;
                 duration.tv_sec = 0;
@@ -919,8 +918,9 @@ int scsi_get_serial(struct udev *udev,
                         goto completed;
                 }
         } else if (page_code != 0x00) {
-                log_debug("%s: unsupported page code 0x%d\n", dev_scsi->kernel, page_code);
-                return 1;
+                log_debug("%s: unsupported page code 0x%d", dev_scsi->kernel, page_code);
+                retval = 1;
+                goto completed;
         }
 
         /*