#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
+#include <time.h>
#include <inttypes.h>
#include <scsi/scsi.h>
#include <scsi/sg.h>
#include <linux/types.h>
-/* #include <linux/bsg.h> */
-#include "bsg.h"
+#include <linux/bsg.h>
-#include "../../udev/udev.h"
+#include "libudev.h"
+#include "libudev-private.h"
#include "scsi.h"
#include "scsi_id.h"
{
return sg_err_category_new(udev, hp->device_status, 0,
hp->transport_status, hp->driver_status,
- (unsigned char *)hp->response,
+ (unsigned char *)(uintptr_t)hp->response,
hp->response_len);
}
int code;
int sense_class;
int sense_key;
- int descriptor_format;
int asc, ascq;
#ifdef DUMP_SENSE
char out_buffer[256];
return -1;
}
if ((code == 0x0) || (code == 0x1)) {
- descriptor_format = 0;
sense_key = sense_buffer[2] & 0xf;
if (s < 14) {
/*
asc = sense_buffer[12];
ascq = sense_buffer[13];
} else if ((code == 0x2) || (code == 0x3)) {
- descriptor_format = 1;
sense_key = sense_buffer[1] & 0xf;
asc = sense_buffer[2];
ascq = sense_buffer[3];
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 *)io->response,
+ return scsi_dump_sense(udev, dev_scsi, (unsigned char *)(uintptr_t)io->response,
io->response_len);
else
return -1;
int ind;
strncpy(serial, dev_scsi->vendor, VENDOR_LENGTH);
- ind = strlen(serial) - 1;
-
strncat(serial, dev_scsi->model, MODEL_LENGTH);
- ind = strlen(serial) - 1;
- ind++;
+ ind = strlen(serial);
/*
* This is not a complete check, since we are using strncat/cpy
if (ind != (VENDOR_LENGTH + MODEL_LENGTH)) {
info(udev, "%s: expected length %d, got length %d\n",
dev_scsi->kernel, (VENDOR_LENGTH + MODEL_LENGTH), ind);
- return 1;
+ return -1;
}
return ind;
}
/* serial has been memset to zero before */
j = strlen(serial); /* j = 1; */
- for (i = 0; i < page_83[3]; ++i) {
+ for (i = 0; (i < page_83[3]) && (j < max_len-3); ++i) {
serial[j++] = hex_str[(page_83[4+i] & 0xf0) >> 4];
serial[j++] = hex_str[ page_83[4+i] & 0x0f];
}
- strcpy(serial_short, serial);
+ serial[max_len-1] = 0;
+ strncpy(serial_short, serial, max_len-1);
return 0;
}
/*
* XXX Some devices (IBM 3542) return all spaces for an identifier if
- * the LUN is not actually configured. This leads to identifers of
+ * the LUN is not actually configured. This leads to identifiers of
* the form: "1 ".
*/
len = 1 + VENDOR_LENGTH + MODEL_LENGTH + buf[3];
if (max_len < len) {
info(udev, "%s: length %d too short - need %d\n",
- dev_scsi->kernel, max_len, len);
+ dev_scsi->kernel, max_len, len);
return 1;
}
/*
int scsi_get_serial(struct udev *udev,
struct scsi_id_device *dev_scsi, const char *devname,
- int page_code, char *serial_short, int len)
+ int page_code, int len)
{
unsigned char page0[SCSI_INQ_BUFF_LEN];
int fd = -1;
memset(dev_scsi->serial, 0, len);
dbg(udev, "opening %s\n", devname);
while (--cnt) {
+ const struct timespec duration = { 0, 500 * 1000 * 1000 };
+
fd = open(devname, O_RDONLY | O_NONBLOCK);
if (fd >= 0)
break;
info(udev, "%s: cannot open %s: %s\n", dev_scsi->kernel, devname, strerror(errno));
if (errno != EBUSY)
break;
- usleep(500000 + (rand() % 100000) );
+ nanosleep(&duration, NULL);
}
if (fd < 0)
return 1;
if (page_code == PAGE_80) {
- if (do_scsi_page80_inquiry(udev, dev_scsi, fd, dev_scsi->serial, serial_short, len)) {
+ if (do_scsi_page80_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
retval = 1;
goto completed;
} else {
goto completed;
}
} else if (page_code == PAGE_83) {
- if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, serial_short, len)) {
+ if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
retval = 1;
goto completed;
} else {
goto completed;
}
} else if (page_code == PAGE_83_PRE_SPC3) {
- retval = do_scsi_page83_prespc3_inquiry(udev, dev_scsi, fd, dev_scsi->serial, serial_short, len);
+ retval = do_scsi_page83_prespc3_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len);
if (retval) {
/*
* Fallback to servicing a SPC-2/3 compliant page 83
* conform to pre-SPC3 expectations.
*/
if (retval == 2) {
- if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, serial_short, len)) {
+ if (do_scsi_page83_inquiry(udev, dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
retval = 1;
goto completed;
} else {
for (ind = 4; ind <= page0[3] + 3; ind++)
if (page0[ind] == PAGE_83)
if (!do_scsi_page83_inquiry(udev, dev_scsi, fd,
- dev_scsi->serial, serial_short, len)) {
+ dev_scsi->serial, dev_scsi->serial_short, len)) {
/*
* Success
*/
for (ind = 4; ind <= page0[3] + 3; ind++)
if (page0[ind] == PAGE_80)
if (!do_scsi_page80_inquiry(udev, dev_scsi, fd,
- dev_scsi->serial, serial_short, len)) {
+ dev_scsi->serial, dev_scsi->serial_short, len)) {
/*
* Success
*/