#include #include #include #include #include #include #include #include #include #include #include #include static void hexdump(unsigned char *data, int total) { int i, line, pos = 0; while(total) { line = total > 16 ? 16 : total; printf("%.4x:", pos); for (i = 0; i < line; i++) printf(" %02x", data[pos + i]); for (i = line; i < 16; i++) printf(" "); printf(" | "); for (i = 0; i < line; i++) { unsigned char c = data[pos + i]; if (c < 0x20 || c > 0x7f) printf("."); else printf("%c", c); } printf("\n"); total -= line; pos += line; } } int main(int argc, char **argv) { sg_io_hdr_t ioh; int fd, rc, i, total, line, pos; unsigned char data[4096]; char cmd[12]; char sense[252]; char *p; fd = open(argv[1], O_RDWR); if (fd < 0) { perror("Failed to open /dev/sg"); exit(-1); } memset(cmd, 0, sizeof(cmd)); memset(&ioh, 0, sizeof(ioh)); cmd[0] = 0x12; cmd[3] = 0x3; cmd[4] = 0x00; ioh.interface_id = 'S'; ioh.dxfer_direction = SG_DXFER_FROM_DEV; ioh.dxferp = data; ioh.dxfer_len = sizeof(data); ioh.cmdp = cmd; ioh.cmd_len = 6; ioh.mx_sb_len = sizeof(sense); ioh.sbp = sense; ioh.timeout = UINT_MAX; ioh.usr_ptr = 0; ioh.flags |= SG_FLAG_DIRECT_IO; rc = ioctl(fd, SG_IO, &ioh); printf("INQUIRY ioctl rc=%d, status=0x%x\n", rc, ioh.masked_status); printf(" host_status=0x%x driver_status=%x\n", ioh.host_status, ioh.driver_status); close(fd); hexdump(data, sizeof(data)); }