This is inquire.c in view mode; [Download] [Up]
/*
* inquire - SCSI inquire of SCSI bus devices
* by Charles E. Chambers (chambers@uh.edu)
* Mar 20, 1991
*/
/*
USE AT YOUR OUR RISK.
I NOT NOT BE RESPONSIBLE FOR PROBLEM CAUSED BY THIS PROGRAM.
*/
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <nextdev/scsireg.h>
static char *dev_name="/dev/sg0"; /* generic scsi interface */
int scsi_open(int target, int lun);
void scsi_show_inquiry(int fd, int target, int lun);
int gs_inquiry(int fd, int lun, int clen, u_char *data);
int gs_request_sense(int fd, int lun);
main(int argc, char *argv[])
{
extern int optind;
extern char *optarg;
char c;
int fd;
int target, target_start, target_end;
int lun, lun_start, lun_end;
int pagecode = -1;
int controlfield = -1;
target_start = 0;
target_end = 7;
lun_start = 0;
lun_end = 7;
while ((c = getopt(argc, argv, "t:l:")) != EOF) {
switch (c) {
case 't':
target_start = atoi(optarg);
target_end = target_start;
break;
case 'l':
lun_start = atoi(optarg);
lun_end = lun_start;
break;
default:
fprintf(stderr,
"usage: %s [-t<target>] [-l<lun>]\n",
argv[0]);
exit(1);
}
}
for (target = target_start; target <= target_end; target++)
for (lun = lun_start; lun <= lun_end; lun++) {
if ((fd = scsi_open(target, lun)) >= 0) {
scsi_show_inquiry(fd, target, lun);
close(fd);
}
}
}
int scsi_open(int target, int lun)
{
struct scsi_adr sa;
int fd;
if ((fd = open(dev_name, O_RDWR)) < 0) {
fprintf(stderr,"\nCould not open %s\n",dev_name);
return(-1);
}
sa.sa_target = target;
sa.sa_lun = lun;
if (ioctl(fd,SGIOCSTL,&sa) < 0) {
fprintf(stderr,"Error setting target %d lun %d\n",target,lun);
close(fd);
return(-1);
}
if(gs_request_sense(fd, lun)) { /* clear unit attention */
close(fd);
return(-1);
}
return(fd);
}
void scsi_show_inquiry(int fd, int target, int lun)
{
u_char data[64];
int i;
bzero(data, sizeof(data));
if(gs_inquiry(fd, lun, sizeof(data), data)) {
fputs("error in inquiry\n", stderr);
close(fd);
exit(1);
}
if (data[0] != 0x7f) {
fprintf(stdout,"-t %d -l %d \"",target,lun);
for (i=8;i<16;i++) fprintf(stdout,"%c",data[i]);
fprintf(stdout,"/");
for (i=16;i<32;i++) fprintf(stdout,"%c",data[i]);
fprintf(stdout,"/");
for (i=32;i<36;i++) fprintf(stdout,"%c",data[i]);
fprintf(stdout,"/\" ");
fprintf(stdout," typ=%d",data[0]);
fprintf(stdout," dev=%d",data[1]&0x7f);
fprintf(stdout," ans=%d",data[2]);
fprintf(stdout," fmt=%d",data[3]&0xf);
if ( (data[1]&0x80) != 0)
fprintf(stdout," removable");
fprintf(stdout,"\n");
}
}
int gs_inquiry(int fd, int lun, int clen, u_char *data)
{
struct scsi_req sr;
struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
bzero((char *)&sr, sizeof(sr));
cdbp->c6_opcode = C6OP_INQUIRY;
cdbp->c6_lun = lun;
cdbp->c6_lba = 0;
cdbp->c6_len = clen;
sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = (caddr_t)data;
sr.sr_dma_max = clen;
sr.sr_ioto = 10;
return(do_ioc(fd, &sr));
}
int do_ioc(int fd, struct scsi_req *sr)
{
if (ioctl(fd, SGIOCREQ, sr) < 0) {
perror("ioctl(SGIOCREQ)");
return(-1);
}
if(sr->sr_io_status) {
if(sr->sr_io_status == SR_IOST_CHKSV) {
fprintf(stderr,
"sense key = 0x%02X, sense code = 0x%02X\n",
sr->sr_esense.er_sensekey,
sr->sr_esense.er_addsensecode);
}
return(-1);
}
return(0);
}
int gs_request_sense(int fd, int lun)
{
struct scsi_req sr;
struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
u_char sbuf[128];
bzero((char *)&sr, sizeof(sr));
cdbp->c6_opcode = C6OP_REQSENSE;
cdbp->c6_lun = lun;
cdbp->c6_len = 18;
sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = (caddr_t)sbuf;
sr.sr_dma_max = 128;
sr.sr_ioto = 10;
return(do_ioc(fd, &sr));
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.