scsi_scan.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsi_scan.c 1.7 00/01/26 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)scsi_scan.c 1.7 00/01/26 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  * Scan SCSI Bus.
  8.  * Stolen from sformat. Need a more general form to
  9.  * re-use it in sformat too.
  10.  *
  11.  * Copyright (c) 1997 J. Schilling
  12.  */
  13. /*
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2, or (at your option)
  17.  * any later version.
  18.  *
  19.  * This program is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  * GNU General Public License for more details.
  23.  *
  24.  * You should have received a copy of the GNU General Public License
  25.  * along with this program; see the file COPYING.  If not, write to
  26.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  27.  */
  28. #include <stdxlib.h>
  29. #include <standard.h>
  30. #include <btorder.h>
  31. #include <errno.h>
  32. #include <scg/scgcmd.h>
  33. #include <scg/scsidefs.h>
  34. #include <scg/scsireg.h>
  35. #include <scg/scsitransp.h>
  36. #include "scsi_scan.h"
  37. #include "cdrecord.h"
  38. LOCAL void print_product __PR((struct scsi_inquiry *ip));
  39. EXPORT void select_target __PR((SCSI *scgp));
  40. LOCAL void select_unit __PR((SCSI *scgp));
  41. LOCAL void
  42. print_product(ip)
  43. struct scsi_inquiry *ip;
  44. {
  45. printf("'%.8s' ", ip->info);
  46. printf("'%.16s' ", ip->ident);
  47. printf("'%.4s' ", ip->revision);
  48. if (ip->add_len < 31) {
  49. printf("NON CCS ");
  50. }
  51. scsiprintdev(ip);
  52. }
  53. EXPORT void
  54. select_target(scgp)
  55. SCSI *scgp;
  56. {
  57. int initiator;
  58. int cscsibus = scgp->scsibus;
  59. int ctarget =  scgp->target;
  60. int clun =  scgp->lun;
  61. int n;
  62. int low = -1;
  63. int high = -1;
  64. BOOL have_tgt;
  65. scgp->silent++;
  66. for (scgp->scsibus=0; scgp->scsibus < 16; scgp->scsibus++) {
  67. if (!scsi_havebus(scgp, scgp->scsibus))
  68. continue;
  69. initiator = scsi_initiator_id(scgp);
  70. printf("scsibus%d:n", scgp->scsibus);
  71. for (scgp->target=0, scgp->lun=0; scgp->target < 16; scgp->target++) {
  72. n = scgp->scsibus*100 + scgp->target;
  73. have_tgt = unit_ready(scgp) || scgp->scmd->error != SCG_FATAL;
  74. if (!have_tgt && scgp->target > 7) {
  75. if (scgp->scmd->ux_errno == EINVAL)
  76. break;
  77. /* if ((high%100) < 8)*/
  78. continue;
  79. }
  80. /* if (print_disknames(scgp->scsibus, scgp->target, -1) < 8)*/
  81. /* printf("t");*/
  82. printf("t");
  83. if (printf("%d,%d,%d", scgp->scsibus, scgp->target, scgp->lun) < 8)
  84. printf("t");
  85. else
  86. printf(" ");
  87. printf("%3d) ", n);
  88. if (scgp->target == initiator) {
  89. printf("HOST ADAPTORn");
  90. continue;
  91. }
  92. if (!have_tgt) {
  93. printf("*n");
  94. continue;
  95. }
  96. if (low < 0)
  97. low = n;
  98. high = n;
  99. getdev(scgp, FALSE);
  100. print_product(scgp->inq);
  101. }
  102. }
  103. scgp->silent--;
  104. if (low < 0)
  105. comerrno(EX_BAD, "No target found.n");
  106. n = -1;
  107. /* getint("Select target", &n, low, high); */
  108. exit(0);
  109. scgp->scsibus = n/10;
  110. scgp->target = n%10;
  111. select_unit(scgp);
  112. scgp->scsibus = cscsibus;
  113. scgp->target = ctarget;
  114. scgp->lun = clun;
  115. }
  116. LOCAL void
  117. select_unit(scgp)
  118. SCSI *scgp;
  119. {
  120. int initiator;
  121. int clun = scgp->lun;
  122. int low = -1;
  123. int high = -1;
  124. scgp->silent++;
  125. printf("scsibus%d target %d:n", scgp->scsibus, scgp->target);
  126. initiator = scsi_initiator_id(scgp);
  127. for (scgp->lun=0; scgp->lun < 8; scgp->lun++) {
  128. /* if (print_disknames(scgp->scsibus, scgp->target, scgp->lun) < 8)*/
  129. /* printf("t");*/
  130. printf("t");
  131. if (printf("%d,%d,%d", scgp->scsibus, scgp->target, scgp->lun) < 8)
  132. printf("t");
  133. else
  134. printf(" ");
  135. printf("%3d) ", scgp->lun);
  136. if (scgp->target == initiator) {
  137. printf("HOST ADAPTORn");
  138. continue;
  139. }
  140. if (!unit_ready(scgp) && scgp->scmd->error == SCG_FATAL) {
  141. printf("*n");
  142. continue;
  143. }
  144. if (unit_ready(scgp)) {
  145. /* non extended sense illegal lun */
  146. if (scgp->scmd->sense.code == 0x25) {
  147. printf("BAD UNITn");
  148. continue;
  149. }
  150. }
  151. if (low < 0)
  152. low = scgp->lun;
  153. high = scgp->lun;
  154. getdev(scgp, FALSE);
  155. print_product(scgp->inq);
  156. }
  157. scgp->silent--;
  158. if (low < 0)
  159. comerrno(EX_BAD, "No lun found.n");
  160. scgp->lun = -1;
  161. /* getint("Select lun", &scgp->lun, low, high); */
  162. exit(0);
  163. /* format_one();*/
  164. scgp->lun = clun;
  165. }