ftp.nice.ch/pub/next/unix/scsi/scsitools_new.N.bs.tar.gz#/scsitools/inquire.c

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.