chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix usb_id and let scsi_id ignore "illegal request"
[elogind.git]
/
extras
/
scsi_id
/
scsi_serial.c
diff --git
a/extras/scsi_id/scsi_serial.c
b/extras/scsi_id/scsi_serial.c
index e0074b662d3a9692b1c17f253c753eebfbc825b8..7bfa9d18128c5b7223e5a0e36561b5970b613ddd 100644
(file)
--- a/
extras/scsi_id/scsi_serial.c
+++ b/
extras/scsi_id/scsi_serial.c
@@
-89,6
+89,7
@@
static const char hex_str[]="0123456789abcdef";
#define SG_ERR_CAT_RESET 2 /* interpreted from sense buffer */
#define SG_ERR_CAT_TIMEOUT 3
#define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */
#define SG_ERR_CAT_RESET 2 /* interpreted from sense buffer */
#define SG_ERR_CAT_TIMEOUT 3
#define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */
+#define SG_ERR_CAT_NOTSUPPORTED 5 /* Illegal / unsupported command */
#define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */
#define SG_ERR_CAT_OTHER 99 /* Some other error/warning */
#define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */
#define SG_ERR_CAT_OTHER 99 /* Some other error/warning */
@@
-130,6
+131,8
@@
static int sg_err_category_new(int scsi_status, int msg_status, int
return SG_ERR_CAT_MEDIA_CHANGED;
if (0x29 == asc)
return SG_ERR_CAT_RESET;
return SG_ERR_CAT_MEDIA_CHANGED;
if (0x29 == asc)
return SG_ERR_CAT_RESET;
+ } else if (sense_key == ILLEGAL_REQUEST) {
+ return SG_ERR_CAT_NOTSUPPORTED;
}
}
return SG_ERR_CAT_SENSE;
}
}
return SG_ERR_CAT_SENSE;
@@
-300,17
+303,12
@@
static int scsi_inquiry(struct sysfs_device *scsi_dev, int fd, unsigned
unsigned char sense[SENSE_BUFF_LEN];
struct sg_io_hdr io_hdr;
int retval;
unsigned char sense[SENSE_BUFF_LEN];
struct sg_io_hdr io_hdr;
int retval;
- unsigned char *inq;
- unsigned char *buffer;
int retry = 3; /* rather random */
int retry = 3; /* rather random */
- if (buflen >
255
) {
+ if (buflen >
SCSI_INQ_BUFF_LEN
) {
log_message(LOG_WARNING, "buflen %d too long\n", buflen);
return -1;
}
log_message(LOG_WARNING, "buflen %d too long\n", buflen);
return -1;
}
- inq = malloc(OFFSET + sizeof (inq_cmd) + 512);
- memset(inq, 0, OFFSET + sizeof (inq_cmd) + 512);
- buffer = inq + OFFSET;
resend:
dprintf("%s evpd %d, page 0x%x\n", scsi_dev->name, evpd, page);
resend:
dprintf("%s evpd %d, page 0x%x\n", scsi_dev->name, evpd, page);
@@
-321,7
+319,7
@@
resend:
io_hdr.mx_sb_len = sizeof(sense);
io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
io_hdr.dxfer_len = buflen;
io_hdr.mx_sb_len = sizeof(sense);
io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
io_hdr.dxfer_len = buflen;
- io_hdr.dxferp = buf
fer
;
+ io_hdr.dxferp = buf;
io_hdr.cmdp = inq_cmd;
io_hdr.sbp = sense;
io_hdr.timeout = DEF_TIMEOUT;
io_hdr.cmdp = inq_cmd;
io_hdr.sbp = sense;
io_hdr.timeout = DEF_TIMEOUT;
@@
-329,12
+327,16
@@
resend:
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
log_message(LOG_WARNING, "%s: ioctl failed: %s\n",
scsi_dev->name, strerror(errno));
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
log_message(LOG_WARNING, "%s: ioctl failed: %s\n",
scsi_dev->name, strerror(errno));
- return -1;
+ retval = -1;
+ goto error;
}
retval = sg_err_category3(&io_hdr);
switch (retval) {
}
retval = sg_err_category3(&io_hdr);
switch (retval) {
+ case SG_ERR_CAT_NOTSUPPORTED:
+ buf[1] = 0;
+ /* Fallthrough */
case SG_ERR_CAT_CLEAN:
case SG_ERR_CAT_RECOVERED:
retval = 0;
case SG_ERR_CAT_CLEAN:
case SG_ERR_CAT_RECOVERED:
retval = 0;
@@
-346,7
+348,6
@@
resend:
if (!retval) {
retval = buflen;
if (!retval) {
retval = buflen;
- memcpy(buf, buffer, retval);
} else if (retval > 0) {
if (--retry > 0) {
dprintf("%s: Retrying ...\n", scsi_dev->name);
} else if (retval > 0) {
if (--retry > 0) {
dprintf("%s: Retrying ...\n", scsi_dev->name);
@@
-355,20
+356,21
@@
resend:
retval = -1;
}
retval = -1;
}
+error:
if (retval < 0)
log_message(LOG_WARNING,
"%s: Unable to get INQUIRY vpd %d page 0x%x.\n",
scsi_dev->name, evpd, page);
if (retval < 0)
log_message(LOG_WARNING,
"%s: Unable to get INQUIRY vpd %d page 0x%x.\n",
scsi_dev->name, evpd, page);
- free(inq);
return retval;
}
return retval;
}
+/* Get list of supported EVPD pages */
static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
char *buffer, int len)
{
int retval;
static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
char *buffer, int len)
{
int retval;
-
char vendor[MAX_ATTR_LEN]
;
+
struct sysfs_attribute *vendor
;
memset(buffer, 0, len);
retval = scsi_inquiry(scsi_dev, fd, 1, 0x0, buffer, len);
memset(buffer, 0, len);
retval = scsi_inquiry(scsi_dev, fd, 1, 0x0, buffer, len);
@@
-398,14
+400,15
@@
static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
* If the vendor id appears in the page assume the page is
* invalid.
*/
* If the vendor id appears in the page assume the page is
* invalid.
*/
- if (sysfs_get_attr(scsi_dev->path, "vendor", vendor,
-
MAX_ATTR_LEN)
) {
+ vendor = sysfs_get_device_attr(scsi_dev, "vendor");
+
if (!vendor
) {
log_message(LOG_WARNING,
"%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}
log_message(LOG_WARNING,
"%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}
- if (!strncmp(&buffer[VENDOR_LENGTH], vendor, VENDOR_LENGTH)) {
+ if (!strncmp(&buffer[VENDOR_LENGTH], vendor->value,
+ VENDOR_LENGTH)) {
log_message(LOG_WARNING, "%s: invalid page0 data\n",
scsi_dev->name);
return 1;
log_message(LOG_WARNING, "%s: invalid page0 data\n",
scsi_dev->name);
return 1;
@@
-420,15
+423,16
@@
static int do_scsi_page0_inquiry(struct sysfs_device *scsi_dev, int fd,
*/
static int prepend_vendor_model(struct sysfs_device *scsi_dev, char *serial)
{
*/
static int prepend_vendor_model(struct sysfs_device *scsi_dev, char *serial)
{
-
char attr[MAX_ATTR_LEN]
;
+
struct sysfs_attribute *attr
;
int ind;
int ind;
- if (sysfs_get_attr(scsi_dev->path, "vendor", attr, MAX_ATTR_LEN)) {
+ attr = sysfs_get_device_attr(scsi_dev, "vendor");
+ if (!attr) {
log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
scsi_dev->name);
return 1;
}
log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
scsi_dev->name);
return 1;
}
- strncpy(serial, attr, VENDOR_LENGTH);
+ strncpy(serial, attr
->value
, VENDOR_LENGTH);
ind = strlen(serial) - 1;
/*
* Remove sysfs added newlines.
ind = strlen(serial) - 1;
/*
* Remove sysfs added newlines.
@@
-436,12
+440,13
@@
static int prepend_vendor_model(struct sysfs_device *scsi_dev, char *serial)
if (serial[ind] == '\n')
serial[ind] = '\0';
if (serial[ind] == '\n')
serial[ind] = '\0';
- if (sysfs_get_attr(scsi_dev->path, "model", attr, MAX_ATTR_LEN)) {
+ attr = sysfs_get_device_attr(scsi_dev, "model");
+ if (!attr) {
log_message(LOG_WARNING, "%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}
log_message(LOG_WARNING, "%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}
- strncat(serial, attr, MODEL_LENGTH);
+ strncat(serial, attr
->value
, MODEL_LENGTH);
ind = strlen(serial) - 1;
if (serial[ind] == '\n')
serial[ind] = '\0';
ind = strlen(serial) - 1;
if (serial[ind] == '\n')
serial[ind] = '\0';
@@
-552,15
+557,17
@@
static int check_fill_0x83_id(struct sysfs_device *scsi_dev, char
return 0;
}
return 0;
}
+/* Get device identification VPD page */
static int do_scsi_page83_inquiry(struct sysfs_device *scsi_dev, int fd,
char *serial, int len)
{
int retval;
static int do_scsi_page83_inquiry(struct sysfs_device *scsi_dev, int fd,
char *serial, int len)
{
int retval;
- int id_ind, j;
- unsigned char page_83[
256
];
+
unsigned
int id_ind, j;
+ unsigned char page_83[
SCSI_INQ_BUFF_LEN
];
- memset(page_83, 0, 256);
- retval = scsi_inquiry(scsi_dev, fd, 1, 0x83, page_83, 255);
+ memset(page_83, 0, SCSI_INQ_BUFF_LEN);
+ retval = scsi_inquiry(scsi_dev, fd, 1, 0x83, page_83,
+ SCSI_INQ_BUFF_LEN);
if (retval < 0)
return 1;
if (retval < 0)
return 1;
@@
-586,8
+593,7
@@
static int do_scsi_page83_inquiry(struct sysfs_device *scsi_dev, int fd,
* Examine each descriptor returned. There is normally only
* one or a small number of descriptors.
*/
* Examine each descriptor returned. There is normally only
* one or a small number of descriptors.
*/
- for (j = 4; j <= page_83[3] + 3;
- j += page_83[j + 3] + 4) {
+ for (j = 4; j <= (unsigned int)page_83[3] + 3; j += page_83[j + 3] + 4) {
retval = check_fill_0x83_id(scsi_dev, &page_83[j],
&id_search_list[id_ind],
serial, len);
retval = check_fill_0x83_id(scsi_dev, &page_83[j],
&id_search_list[id_ind],
serial, len);
@@
-609,6
+615,7
@@
static int do_scsi_page83_inquiry(struct sysfs_device *scsi_dev, int fd,
return 1;
}
return 1;
}
+/* Get unit serial number VPD page */
static int do_scsi_page80_inquiry(struct sysfs_device *scsi_dev, int fd,
char *serial, int max_len)
{
static int do_scsi_page80_inquiry(struct sysfs_device *scsi_dev, int fd,
char *serial, int max_len)
{
@@
-616,10
+623,10
@@
static int do_scsi_page80_inquiry(struct sysfs_device *scsi_dev, int fd,
int ser_ind;
int i;
int len;
int ser_ind;
int i;
int len;
- unsigned char buf[
256
];
+ unsigned char buf[
SCSI_INQ_BUFF_LEN
];
- memset(buf, 0,
256
);
- retval = scsi_inquiry(scsi_dev, fd, 1, 0x80, buf,
255
);
+ memset(buf, 0,
SCSI_INQ_BUFF_LEN
);
+ retval = scsi_inquiry(scsi_dev, fd, 1, 0x80, buf,
SCSI_INQ_BUFF_LEN
);
if (retval < 0)
return retval;
if (retval < 0)
return retval;
@@
-652,13
+659,11
@@
static int do_scsi_page80_inquiry(struct sysfs_device *scsi_dev, int fd,
int scsi_get_serial (struct sysfs_device *scsi_dev, const char *devname,
int page_code, char *serial, int len)
{
int scsi_get_serial (struct sysfs_device *scsi_dev, const char *devname,
int page_code, char *serial, int len)
{
- unsigned char page0[
256
];
+ unsigned char page0[
SCSI_INQ_BUFF_LEN
];
int fd;
int ind;
int retval;
int fd;
int ind;
int retval;
- if (len > 255) {
- }
memset(serial, 0, len);
dprintf("opening %s\n", devname);
fd = open(devname, O_RDONLY | O_NONBLOCK);
memset(serial, 0, len);
dprintf("opening %s\n", devname);
fd = open(devname, O_RDONLY | O_NONBLOCK);
@@
-694,7
+699,7
@@
int scsi_get_serial (struct sysfs_device *scsi_dev, const char *devname,
* Get page 0, the page of the pages. By default, try from best to
* worst of supported pages: 0x83 then 0x80.
*/
* 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(scsi_dev, fd, page0,
255
)) {
+ if (do_scsi_page0_inquiry(scsi_dev, 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
/*
* Don't try anything else. Black list if a specific page
* should be used for this vendor+model, or maybe have an