summaryrefslogtreecommitdiff
path: root/src/udev/scsi_id/scsi_serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/scsi_id/scsi_serial.c')
-rw-r--r--src/udev/scsi_id/scsi_serial.c166
1 files changed, 57 insertions, 109 deletions
diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c
index fd91657a32..c67d047475 100644
--- a/src/udev/scsi_id/scsi_serial.c
+++ b/src/udev/scsi_id/scsi_serial.c
@@ -3,7 +3,6 @@
* Copyright © IBM Corp. 2003
*
* Author: Patrick Mansfield<patmans@us.ibm.com>
- *
*/
#include <errno.h>
@@ -22,13 +21,11 @@
#include <time.h>
#include <unistd.h>
-#include "libudev.h"
-
-#include "libudev-private.h"
#include "random-util.h"
#include "scsi.h"
#include "scsi_id.h"
#include "string-util.h"
+#include "util.h"
/*
* A priority based list of id, naa, and binary/ascii for the identifier
@@ -86,15 +83,12 @@ static const char hex_str[]="0123456789abcdef";
#define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */
#define SG_ERR_CAT_OTHER 99 /* Some other error/warning */
-static int do_scsi_page80_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
+static int do_scsi_page80_inquiry(struct scsi_id_device *dev_scsi, int fd,
char *serial, char *serial_short, int max_len);
-static int sg_err_category_new(struct udev *udev,
- int scsi_status, int msg_status, int
+static int sg_err_category_new(int scsi_status, int msg_status, int
host_status, int driver_status, const
- unsigned char *sense_buffer, int sb_len)
-{
+ unsigned char *sense_buffer, int sb_len) {
scsi_status &= 0x7e;
/*
@@ -141,35 +135,26 @@ static int sg_err_category_new(struct udev *udev,
return SG_ERR_CAT_OTHER;
}
-static int sg_err_category3(struct udev *udev, struct sg_io_hdr *hp)
-{
- return sg_err_category_new(udev,
- hp->status, hp->msg_status,
+static int sg_err_category3(struct sg_io_hdr *hp) {
+ return sg_err_category_new(hp->status, hp->msg_status,
hp->host_status, hp->driver_status,
hp->sbp, hp->sb_len_wr);
}
-static int sg_err_category4(struct udev *udev, struct sg_io_v4 *hp)
-{
- return sg_err_category_new(udev, hp->device_status, 0,
+static int sg_err_category4(struct sg_io_v4 *hp) {
+ return sg_err_category_new(hp->device_status, 0,
hp->transport_status, hp->driver_status,
(unsigned char *)(uintptr_t)hp->response,
hp->response_len);
}
-static int scsi_dump_sense(struct udev *udev,
- struct scsi_id_device *dev_scsi,
- unsigned char *sense_buffer, int sb_len)
-{
+static int scsi_dump_sense(struct scsi_id_device *dev_scsi,
+ unsigned char *sense_buffer, int sb_len) {
int s;
int code;
int sense_class;
int sense_key;
int asc, ascq;
-#ifdef DUMP_SENSE
- char out_buffer[256];
- int i, j;
-#endif
/*
* Figure out and print the sense key, asc and ascq.
@@ -241,23 +226,10 @@ static int scsi_dump_sense(struct udev *udev,
}
-#ifdef DUMP_SENSE
- for (i = 0, j = 0; (i < s) && (j < 254); i++) {
- out_buffer[j++] = hex_str[(sense_buffer[i] & 0xf0) >> 4];
- out_buffer[j++] = hex_str[sense_buffer[i] & 0x0f];
- out_buffer[j++] = ' ';
- }
- out_buffer[j] = '\0';
- log_debug("%s: sense dump:", dev_scsi->kernel);
- log_debug("%s: %s", dev_scsi->kernel, out_buffer);
-
-#endif
return -1;
}
-static int scsi_dump(struct udev *udev,
- struct scsi_id_device *dev_scsi, struct sg_io_hdr *io)
-{
+static int scsi_dump(struct scsi_id_device *dev_scsi, struct sg_io_hdr *io) {
if (!io->status && !io->host_status && !io->msg_status &&
!io->driver_status) {
/*
@@ -270,14 +242,12 @@ static int scsi_dump(struct udev *udev,
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);
+ return scsi_dump_sense(dev_scsi, io->sbp, io->sb_len_wr);
else
return -1;
}
-static int scsi_dump_v4(struct udev *udev,
- struct scsi_id_device *dev_scsi, struct sg_io_v4 *io)
-{
+static int scsi_dump_v4(struct scsi_id_device *dev_scsi, struct sg_io_v4 *io) {
if (!io->device_status && !io->transport_status &&
!io->driver_status) {
/*
@@ -290,17 +260,15 @@ static int scsi_dump_v4(struct udev *udev,
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)
- return scsi_dump_sense(udev, dev_scsi, (unsigned char *)(uintptr_t)io->response,
+ return scsi_dump_sense(dev_scsi, (unsigned char *)(uintptr_t)io->response,
io->response_len);
else
return -1;
}
-static int scsi_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
+static int scsi_inquiry(struct scsi_id_device *dev_scsi, int fd,
unsigned char evpd, unsigned char page,
- unsigned char *buf, unsigned int buflen)
-{
+ unsigned char *buf, unsigned buflen) {
unsigned char inq_cmd[INQUIRY_CMDLEN] =
{ INQUIRY_CMD, evpd, page, 0, buflen, 0 };
unsigned char sense[SENSE_BUFF_LEN];
@@ -353,9 +321,9 @@ resend:
}
if (dev_scsi->use_sg == 4)
- retval = sg_err_category4(udev, io_buf);
+ retval = sg_err_category4(io_buf);
else
- retval = sg_err_category3(udev, io_buf);
+ retval = sg_err_category3(io_buf);
switch (retval) {
case SG_ERR_CAT_NOTSUPPORTED:
@@ -368,9 +336,9 @@ resend:
default:
if (dev_scsi->use_sg == 4)
- retval = scsi_dump_v4(udev, dev_scsi, io_buf);
+ retval = scsi_dump_v4(dev_scsi, io_buf);
else
- retval = scsi_dump(udev, dev_scsi, io_buf);
+ retval = scsi_dump(dev_scsi, io_buf);
}
if (!retval) {
@@ -390,14 +358,12 @@ error:
}
/* Get list of supported EVPD pages */
-static int do_scsi_page0_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
- unsigned char *buffer, unsigned int len)
-{
+static int do_scsi_page0_inquiry(struct scsi_id_device *dev_scsi, int fd,
+ unsigned char *buffer, unsigned len) {
int retval;
memzero(buffer, len);
- retval = scsi_inquiry(udev, dev_scsi, fd, 1, 0x0, buffer, len);
+ retval = scsi_inquiry(dev_scsi, fd, 1, 0x0, buffer, len);
if (retval < 0)
return 1;
@@ -434,9 +400,7 @@ static int do_scsi_page0_inquiry(struct udev *udev,
* The caller checks that serial is long enough to include the vendor +
* model.
*/
-static int prepend_vendor_model(struct udev *udev,
- struct scsi_id_device *dev_scsi, char *serial)
-{
+static int prepend_vendor_model(struct scsi_id_device *dev_scsi, char *serial) {
int ind;
strncpy(serial, dev_scsi->vendor, VENDOR_LENGTH);
@@ -459,14 +423,12 @@ static int prepend_vendor_model(struct udev *udev,
* 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,
+static int check_fill_0x83_id(struct scsi_id_device *dev_scsi,
unsigned char *page_83,
const struct scsi_id_search_values
*id_search, char *serial, char *serial_short,
int max_len, char *wwn,
- char *wwn_vendor_extension, char *tgpt_group)
-{
+ char *wwn_vendor_extension, char *tgpt_group) {
int i, j, s, len;
/*
@@ -519,9 +481,9 @@ static int check_fill_0x83_id(struct udev *udev,
}
if (id_search->id_type == SCSI_ID_TGTGROUP && tgpt_group != NULL) {
- unsigned int group;
+ unsigned group;
- group = ((unsigned int)page_83[6] << 8) | page_83[7];
+ group = ((unsigned)page_83[6] << 8) | page_83[7];
sprintf(tgpt_group,"%x", group);
return 1;
}
@@ -535,7 +497,7 @@ static int check_fill_0x83_id(struct udev *udev,
* included in the identifier.
*/
if (id_search->id_type == SCSI_ID_VENDOR_SPECIFIC)
- if (prepend_vendor_model(udev, dev_scsi, &serial[1]) < 0)
+ if (prepend_vendor_model(dev_scsi, &serial[1]) < 0)
return 1;
i = 4; /* offset to the start of the identifier */
@@ -570,12 +532,10 @@ static int check_fill_0x83_id(struct udev *udev,
}
/* Extract the raw binary from VPD 0x83 pre-SPC devices */
-static int check_fill_0x83_prespc3(struct udev *udev,
- struct scsi_id_device *dev_scsi,
+static int check_fill_0x83_prespc3(struct scsi_id_device *dev_scsi,
unsigned char *page_83,
const struct scsi_id_search_values
- *id_search, char *serial, char *serial_short, int max_len)
-{
+ *id_search, char *serial, char *serial_short, int max_len) {
int i, j;
serial[0] = hex_str[SCSI_ID_NAA];
@@ -592,21 +552,19 @@ static int check_fill_0x83_prespc3(struct udev *udev,
}
/* Get device identification VPD page */
-static int do_scsi_page83_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
+static int do_scsi_page83_inquiry(struct scsi_id_device *dev_scsi, int fd,
char *serial, char *serial_short, int len,
char *unit_serial_number, char *wwn,
- char *wwn_vendor_extension, char *tgpt_group)
-{
+ char *wwn_vendor_extension, char *tgpt_group) {
int retval;
- unsigned int id_ind, j;
+ unsigned id_ind, j;
unsigned char page_83[SCSI_INQ_BUFF_LEN];
/* also pick up the page 80 serial number */
- do_scsi_page80_inquiry(udev, dev_scsi, fd, NULL, unit_serial_number, MAX_SERIAL_LEN);
+ do_scsi_page80_inquiry(dev_scsi, fd, NULL, unit_serial_number, MAX_SERIAL_LEN);
memzero(page_83, SCSI_INQ_BUFF_LEN);
- retval = scsi_inquiry(udev, dev_scsi, fd, 1, PAGE_83, page_83,
+ retval = scsi_inquiry(dev_scsi, fd, 1, PAGE_83, page_83,
SCSI_INQ_BUFF_LEN);
if (retval < 0)
return 1;
@@ -646,8 +604,7 @@ static int do_scsi_page83_inquiry(struct udev *udev,
*/
if (page_83[6] != 0)
- return check_fill_0x83_prespc3(udev,
- dev_scsi, page_83, id_search_list,
+ return check_fill_0x83_prespc3(dev_scsi, page_83, id_search_list,
serial, serial_short, len);
/*
@@ -661,9 +618,8 @@ static int do_scsi_page83_inquiry(struct udev *udev,
* Examine each descriptor returned. There is normally only
* one or a small number of descriptors.
*/
- for (j = 4; j <= (unsigned int)page_83[3] + 3; j += page_83[j + 3] + 4) {
- retval = check_fill_0x83_id(udev,
- dev_scsi, &page_83[j],
+ for (j = 4; j <= (unsigned)page_83[3] + 3; j += page_83[j + 3] + 4) {
+ retval = check_fill_0x83_id(dev_scsi, &page_83[j],
&id_search_list[id_ind],
serial, serial_short, len,
wwn, wwn_vendor_extension,
@@ -684,16 +640,14 @@ static int do_scsi_page83_inquiry(struct udev *udev,
* Return the hard coded error code value 2 if the page 83 reply is not
* conformant to the SCSI-2 format.
*/
-static int do_scsi_page83_prespc3_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
- char *serial, char *serial_short, int len)
-{
+static int do_scsi_page83_prespc3_inquiry(struct scsi_id_device *dev_scsi, int fd,
+ char *serial, char *serial_short, int len) {
int retval;
int i, j;
unsigned char page_83[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);
+ retval = scsi_inquiry(dev_scsi, fd, 1, PAGE_83, page_83, SCSI_INQ_BUFF_LEN);
if (retval < 0)
return 1;
@@ -746,10 +700,8 @@ static int do_scsi_page83_prespc3_inquiry(struct udev *udev,
}
/* Get unit serial number VPD page */
-static int do_scsi_page80_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, int fd,
- char *serial, char *serial_short, int max_len)
-{
+static int do_scsi_page80_inquiry(struct scsi_id_device *dev_scsi, int fd,
+ char *serial, char *serial_short, int max_len) {
int retval;
int ser_ind;
int i;
@@ -757,7 +709,7 @@ static int do_scsi_page80_inquiry(struct udev *udev,
unsigned char buf[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);
+ retval = scsi_inquiry(dev_scsi, fd, 1, PAGE_80, buf, SCSI_INQ_BUFF_LEN);
if (retval < 0)
return retval;
@@ -779,7 +731,7 @@ static int do_scsi_page80_inquiry(struct udev *udev,
len = buf[3];
if (serial != NULL) {
serial[0] = 'S';
- ser_ind = prepend_vendor_model(udev, dev_scsi, &serial[1]);
+ ser_ind = prepend_vendor_model(dev_scsi, &serial[1]);
if (ser_ind < 0)
return 1;
ser_ind++; /* for the leading 'S' */
@@ -793,9 +745,7 @@ static int do_scsi_page80_inquiry(struct udev *udev,
return 0;
}
-int scsi_std_inquiry(struct udev *udev,
- struct scsi_id_device *dev_scsi, const char *devname)
-{
+int scsi_std_inquiry(struct scsi_id_device *dev_scsi, const char *devname) {
int fd;
unsigned char buf[SCSI_INQ_BUFF_LEN];
struct stat statbuf;
@@ -816,7 +766,7 @@ int scsi_std_inquiry(struct udev *udev,
minor(statbuf.st_rdev));
memzero(buf, SCSI_INQ_BUFF_LEN);
- err = scsi_inquiry(udev, dev_scsi, fd, 0, 0, buf, SCSI_INQ_BUFF_LEN);
+ err = scsi_inquiry(dev_scsi, fd, 0, 0, buf, SCSI_INQ_BUFF_LEN);
if (err < 0)
goto out;
@@ -834,10 +784,8 @@ out:
return err;
}
-int scsi_get_serial(struct udev *udev,
- struct scsi_id_device *dev_scsi, const char *devname,
- int page_code, int len)
-{
+int scsi_get_serial(struct scsi_id_device *dev_scsi, const char *devname,
+ int page_code, int len) {
unsigned char page0[SCSI_INQ_BUFF_LEN];
int fd = -1;
int cnt;
@@ -860,7 +808,7 @@ int scsi_get_serial(struct udev *udev,
return 1;
if (page_code == PAGE_80) {
- if (do_scsi_page80_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
+ if (do_scsi_page80_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
retval = 1;
goto completed;
} else {
@@ -868,7 +816,7 @@ int scsi_get_serial(struct udev *udev,
goto completed;
}
} else if (page_code == PAGE_83) {
- if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
+ if (do_scsi_page83_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
retval = 1;
goto completed;
} else {
@@ -876,7 +824,7 @@ int scsi_get_serial(struct udev *udev,
goto completed;
}
} else if (page_code == PAGE_83_PRE_SPC3) {
- retval = do_scsi_page83_prespc3_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len);
+ retval = do_scsi_page83_prespc3_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len);
if (retval) {
/*
* Fallback to servicing a SPC-2/3 compliant page 83
@@ -884,7 +832,7 @@ int scsi_get_serial(struct udev *udev,
* conform to pre-SPC3 expectations.
*/
if (retval == 2) {
- if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
+ if (do_scsi_page83_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
retval = 1;
goto completed;
} else {
@@ -910,7 +858,7 @@ int scsi_get_serial(struct udev *udev,
* Get page 0, the page of the pages. By default, try from best to
* worst of supported pages: 0x83 then 0x80.
*/
- if (do_scsi_page0_inquiry(udev, dev_scsi, fd, page0, SCSI_INQ_BUFF_LEN)) {
+ if (do_scsi_page0_inquiry(dev_scsi, fd, page0, SCSI_INQ_BUFF_LEN)) {
/*
* Don't try anything else. Black list if a specific page
* should be used for this vendor+model, or maybe have an
@@ -922,7 +870,7 @@ int scsi_get_serial(struct udev *udev,
for (ind = 4; ind <= page0[3] + 3; ind++)
if (page0[ind] == PAGE_83)
- if (!do_scsi_page83_inquiry(udev, dev_scsi, fd,
+ if (!do_scsi_page83_inquiry(dev_scsi, fd,
dev_scsi->serial, dev_scsi->serial_short, len, dev_scsi->unit_serial_number, dev_scsi->wwn, dev_scsi->wwn_vendor_extension, dev_scsi->tgpt_group)) {
/*
* Success
@@ -933,7 +881,7 @@ int scsi_get_serial(struct udev *udev,
for (ind = 4; ind <= page0[3] + 3; ind++)
if (page0[ind] == PAGE_80)
- if (!do_scsi_page80_inquiry(udev, dev_scsi, fd,
+ if (!do_scsi_page80_inquiry(dev_scsi, fd,
dev_scsi->serial, dev_scsi->serial_short, len)) {
/*
* Success