home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / Apps / Utilities / Hardware / SCSItools / inquire.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  3.6 KB  |  170 lines

  1. /*
  2.  * inquire - SCSI inquire of SCSI bus devices
  3.  *      by Charles E. Chambers (chambers@uh.edu)
  4.  *      Mar 20, 1991
  5.  */
  6. /*
  7.                       USE AT YOUR OUR RISK. 
  8.       I NOT NOT BE RESPONSIBLE FOR PROBLEM CAUSED BY THIS PROGRAM.
  9.  */
  10.  
  11. #include <fcntl.h>
  12. #include <stdio.h>
  13. #include <sys/types.h>
  14. #include <nextdev/scsireg.h>
  15.  
  16. static char *dev_name="/dev/sg0";    /* generic scsi interface */
  17.  
  18. int scsi_open(int target, int lun);
  19. void scsi_show_inquiry(int fd, int target, int lun);
  20. int gs_inquiry(int fd, int lun, int clen, u_char *data);
  21. int gs_request_sense(int fd, int lun);
  22.  
  23. main(int argc, char *argv[])
  24. {
  25.     extern int optind;
  26.     extern char *optarg;
  27.  
  28.     char c;
  29.  
  30.     int fd;
  31.     int target, target_start, target_end;
  32.     int lun, lun_start, lun_end;
  33.     int pagecode = -1;
  34.     int controlfield = -1;
  35.     target_start = 0;
  36.     target_end = 7;
  37.     lun_start = 0;
  38.     lun_end = 7;
  39.     while ((c = getopt(argc, argv, "t:l:")) != EOF) {
  40.         switch (c) {
  41.         case 't':
  42.             target_start = atoi(optarg);
  43.             target_end = target_start;
  44.             break;
  45.         case 'l':
  46.             lun_start = atoi(optarg);
  47.             lun_end = lun_start;
  48.             break;
  49.         default:
  50.             fprintf(stderr,
  51.                 "usage: %s [-t<target>] [-l<lun>]\n",
  52.                 argv[0]);
  53.             exit(1);
  54.         }
  55.     }
  56.     for (target = target_start; target <= target_end; target++)
  57.         for (lun = lun_start; lun <= lun_end; lun++) {
  58.         if ((fd = scsi_open(target, lun)) >= 0) {
  59.             scsi_show_inquiry(fd, target, lun);
  60.             close(fd);
  61.         }
  62.     }
  63. }
  64.  
  65. int scsi_open(int target, int lun)
  66. {
  67.     struct scsi_adr sa;
  68.     int fd;
  69.  
  70.     if ((fd = open(dev_name, O_RDWR)) < 0) {
  71.         fprintf(stderr,"\nCould not open %s\n",dev_name);
  72.         return(-1);
  73.     }
  74.  
  75.     sa.sa_target = target;
  76.     sa.sa_lun = lun;
  77.     if (ioctl(fd,SGIOCSTL,&sa) < 0) {
  78.         fprintf(stderr,"Error setting target %d lun %d\n",target,lun);
  79.         close(fd);
  80.         return(-1);
  81.     }
  82.  
  83.     if(gs_request_sense(fd, lun)) {        /* clear unit attention */
  84.         close(fd);
  85.         return(-1);
  86.     }
  87.     return(fd);
  88. }
  89.  
  90. void scsi_show_inquiry(int fd, int target, int lun)
  91. {
  92.     u_char data[64];
  93.     int i;
  94.     
  95.     bzero(data, sizeof(data));
  96.     if(gs_inquiry(fd, lun, sizeof(data), data)) {
  97.         fputs("error in inquiry\n", stderr);
  98.         close(fd);
  99.         exit(1);
  100.     }
  101.     if (data[0] != 0x7f) {
  102.         fprintf(stdout,"-t %d -l %d \"",target,lun);
  103.         for (i=8;i<16;i++) fprintf(stdout,"%c",data[i]);
  104.         fprintf(stdout,"/");
  105.         for (i=16;i<32;i++) fprintf(stdout,"%c",data[i]);
  106.         fprintf(stdout,"/"); 
  107.         for (i=32;i<36;i++) fprintf(stdout,"%c",data[i]);
  108.         fprintf(stdout,"/\" ");
  109.         fprintf(stdout," typ=%d",data[0]);
  110.         fprintf(stdout," dev=%d",data[1]&0x7f);
  111.         fprintf(stdout," ans=%d",data[2]);
  112.         fprintf(stdout," fmt=%d",data[3]&0xf);
  113.         if ( (data[1]&0x80) != 0)
  114.             fprintf(stdout," removable");
  115.         fprintf(stdout,"\n");
  116.     }
  117. }
  118.  
  119. int gs_inquiry(int fd, int lun, int clen, u_char *data)
  120. {
  121.     struct scsi_req sr;
  122.     struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
  123.  
  124.     bzero((char *)&sr, sizeof(sr));
  125.     cdbp->c6_opcode = C6OP_INQUIRY;
  126.     cdbp->c6_lun    = lun;
  127.     cdbp->c6_lba    = 0;
  128.     cdbp->c6_len    = clen;
  129.     sr.sr_dma_dir    = SR_DMA_RD;
  130.     sr.sr_addr    = (caddr_t)data;
  131.     sr.sr_dma_max    = clen;
  132.     sr.sr_ioto    = 10;
  133.     return(do_ioc(fd, &sr));
  134. }
  135.  
  136. int do_ioc(int fd, struct scsi_req *sr)
  137. {
  138.     if (ioctl(fd, SGIOCREQ, sr) < 0) {
  139.         perror("ioctl(SGIOCREQ)");
  140.         return(-1);
  141.     }
  142.     if(sr->sr_io_status) {
  143.         if(sr->sr_io_status == SR_IOST_CHKSV) {
  144.             fprintf(stderr,
  145.                 "sense key = 0x%02X, sense code = 0x%02X\n",
  146.                 sr->sr_esense.er_sensekey,
  147.                 sr->sr_esense.er_addsensecode);
  148.         }
  149.         return(-1);
  150.     }
  151.     return(0);
  152. }
  153.  
  154. int gs_request_sense(int fd, int lun)
  155. {
  156.     struct scsi_req sr;
  157.     struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6;
  158.     u_char sbuf[128];
  159.  
  160.     bzero((char *)&sr, sizeof(sr));
  161.     cdbp->c6_opcode = C6OP_REQSENSE;
  162.     cdbp->c6_lun    = lun;
  163.     cdbp->c6_len    = 18;
  164.     sr.sr_dma_dir    = SR_DMA_RD;
  165.     sr.sr_addr    = (caddr_t)sbuf;
  166.     sr.sr_dma_max    = 128;
  167.     sr.sr_ioto    = 10;
  168.     return(do_ioc(fd, &sr));
  169. }
  170.