X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fudev%2Fscsi_id%2Fscsi_serial.c;h=378a73d8639d2f67cbb3f8f1f411bb029e616285;hp=6bfb7f780cbf204e1e5692e9977e6c587a596b1d;hb=d13394a88334441bf3092cf93804ba0f9c56d8e0;hpb=baa30fbc2c04b23209d0b8fb3c86cd15ef9ea81a diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c index 6bfb7f780..378a73d86 100644 --- a/src/udev/scsi_id/scsi_serial.c +++ b/src/udev/scsi_id/scsi_serial.c @@ -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; } /*