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.