X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fscsi_id%2Fscsi_serial.c;h=ab0ffd62aaa963c28dd542a3ee0e3b81d22f4f51;hb=5448cc56f674b49aa0a2d718cac4266e18286712;hp=0f883dc02f19b7c86d14e2611e3f885600d4f922;hpb=214a6c791cbc0c1a190c430eb37056087e661344;p=elogind.git diff --git a/extras/scsi_id/scsi_serial.c b/extras/scsi_id/scsi_serial.c index 0f883dc02..ab0ffd62a 100644 --- a/extras/scsi_id/scsi_serial.c +++ b/extras/scsi_id/scsi_serial.c @@ -23,12 +23,12 @@ #include #include #include +#include #include #include #include #include -/* #include */ -#include "bsg.h" +#include #include "libudev.h" #include "libudev-private.h" @@ -169,7 +169,6 @@ static int scsi_dump_sense(struct udev *udev, int code; int sense_class; int sense_key; - int descriptor_format; int asc, ascq; #ifdef DUMP_SENSE char out_buffer[256]; @@ -209,7 +208,6 @@ static int scsi_dump_sense(struct udev *udev, return -1; } if ((code == 0x0) || (code == 0x1)) { - descriptor_format = 0; sense_key = sense_buffer[2] & 0xf; if (s < 14) { /* @@ -222,7 +220,6 @@ static int scsi_dump_sense(struct udev *udev, 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]; @@ -581,11 +578,12 @@ static int check_fill_0x83_prespc3(struct udev *udev, /* 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; } @@ -846,13 +844,15 @@ int scsi_get_serial(struct udev *udev, 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;