From owner-FreeBSD-users-jp@jp.freebsd.org  Fri Sep  8 21:38:01 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id VAA93720;
	Fri, 8 Sep 2000 21:38:01 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from work.mzaki.nom (243.pool5.ipctokyo.att.ne.jp [165.76.43.243])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id VAA93709;
	Fri, 8 Sep 2000 21:37:58 +0900 (JST)
	(envelope-from mzaki@tkc.att.ne.jp)
Received: from localhost (mzaki@localhost [127.0.0.1])
	by work.mzaki.nom (8.11.0/8.11.0) with ESMTP id e88CbvK18410;
	Fri, 8 Sep 2000 21:37:57 +0900 (JST)
	(envelope-from mzaki@tkc.att.ne.jp)
To: FreeBSD-users-jp@jp.freebsd.org, ports-jp@jp.freebsd.org
In-Reply-To: In your message of "Fri, 08 Sep 2000 13:30:42 +0900"
	<86snrbjyj1.wl@tkc.att.ne.jp>
References: <398EBB4D.FD37CF52@fra.allnet.ne.jp>
	<86snrbjyj1.wl@tkc.att.ne.jp>
From: Motomichi Matsuzaki <mzaki@e-mail.ne.jp>
X-Mailer: Mew version 1.95b3 on XEmacs 21.1 (Bryce Canyon)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Fri_Sep__8_21:37:47_2000_758)--"
Content-Transfer-Encoding: 7bit
Message-Id: <20000908213757D.mzaki@tkc.att.ne.jp>
Date: Fri, 08 Sep 2000 21:37:57 +0900
X-Dispatcher: imput version 991007(IM132)
Lines: 227
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-users-jp 54947
Subject: [FreeBSD-users-jp 54947] Re: sane 1.0.2 
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: mzaki@tkc.att.ne.jp

----Next_Part(Fri_Sep__8_21:37:47_2000_758)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$B>>:j$G$9!#(B

At Fri, 08 Sep 2000 13:30:42 +0900,
Motomichi Matsuzaki <mzaki@e-mail.ne.jp> wrote:
> > 4.1-RELEASE $B$rMxMQ$7$F$$$^$9$,!"IUB0$N%Q%C%1!<%8(B sane-1.0.2 $B$G%9%-%c%J$,(B
> > $B;HMQ$G$-$J$/(B
> > $B$J$C$F$7$^$$$^$7$?$,!"(Bsane-1.0.2 $B$GMxMQ$G$-$F$$$kJ}$O$$$i$C$7$c$$$^$9(B
> > $B$+!)(B
> $B:G6a%9%-%c%J$rGc$C$?$N$G(B sane $B$G;H$($J$$$+D4$Y$F$$$?$N$G$9$,!"(B
> # $B:G6aH/Gd$5$l$?(B EPSON GT-8700 $B$G$9!#(B
> $B>/$J$/$H$b(B sane-1.0.2 $B$G$O(B FreeBSD $B$K$*$$$F(B SCSI $B@\B3$N(B
> $B%9%-%c%J$r;H$($k$h$&$J%3!<%I$K$J$C$F$$$k$H$O;W$($^$;$s!#(B
> # sane/sanei_scsi.c $B$N(B sanei_scsi_find_devices() $B$,(B
> # $B%b%L%1$N%+%i$K$J$C$F$7$^$&!#(B
> ## sanei_scsi_find_devices: not implemented for this platform

$B8=<BF(Hr$N0l4D$H$7$F(B sanei_scsi_find_devices $B$r(B
FreeBSD $BMQ$K<BAu$7$F$_$?$i!"$&$^$/$$$-$^$7$?!#(B
Windows $B$N%I%i%$%P$K$OE($o$J$$$b$N$N(B gimp $B$+$i$-$l$$$KFI$_9~$a$F$$$^$9!#(B

$BE:IU$N%U%!%$%k$r!"(B
sane-1.0.2.tar.gz $B$rE83+$7$?%G%#%l%/%H%j$G%Q%C%A$"$F$9$k$+!"(B
ports/graph/sane $B$N(B patches $B%G%#%l%/%H%j$KCV$$$F(B make $B$7$J$*$9$+!"(B
$B$I$A$i$G$bF1MM$G$9!#(B

sane-1.0.3.tar.gz $B$G$b%Q%C%A$O$"$?$k$h$&$G$9!#(B
$B%3%s%Q%$%k$O$7$F$$$J$$$N$GF0$/$+$I$&$+$O$o$+$j$^$;$s!#(B

+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
|  $B>>:j(B $BAGF;(B (Motomichi Matsuzaki/maki)    mailto:mzaki@e-mail.ne.jp  |
|          $BEl5~Bg3XBg3X1!(B $BM}3X7O8&5f2J(B $B@8J*2J3X@l96(B $BH/@8@8J*3X8&5f<<(B  |
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+



----Next_Part(Fri_Sep__8_21:37:47_2000_758)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: patch-ba
Content-Disposition: attachment; filename=patch-ba

--- /home/mzaki/sane-1.0.2/sanei/sanei_scsi.c	Sun Mar  5 22:45:19 2000
+++ sanei/sanei_scsi.c	Fri Sep  8 20:45:18 2000
@@ -2388,6 +2388,169 @@
    cam_freeccb(ccb);
    return SANE_STATUS_GOOD;
 }
+
+#define WE_HAVE_FIND_DEVICES
+
+int
+cam_compare_inquiry(int fd, path_id_t path_id,
+		    target_id_t target_id, lun_id_t target_lun,
+		    const char *vendor, const char *product, const char *type)
+{
+  struct ccb_dev_match	cdm;
+  struct device_match_pattern *pattern;
+  struct scsi_inquiry_data *inq;
+  int retval = 0;
+
+  /* build ccb for device match */
+  bzero(&cdm, sizeof(cdm));
+  cdm.ccb_h.func_code = XPT_DEV_MATCH;
+
+  /* result buffer */
+  cdm.match_buf_len = sizeof(struct dev_match_result);
+  cdm.matches = (struct dev_match_result *)malloc(cdm.match_buf_len);
+  cdm.num_matches = 0;
+
+  /* pattern buffer */
+  cdm.num_patterns = 1;
+  cdm.pattern_buf_len = sizeof(struct dev_match_pattern);
+  cdm.patterns = (struct dev_match_pattern *)malloc(cdm.pattern_buf_len);
+
+  /* assemble conditions */
+  cdm.patterns[0].type = DEV_MATCH_DEVICE;
+  pattern = &cdm.patterns[0].pattern.device_pattern;
+  pattern->flags = DEV_MATCH_PATH | DEV_MATCH_TARGET | DEV_MATCH_LUN;
+  pattern->path_id = path_id;
+  pattern->target_id = target_id;
+  pattern->target_lun = target_lun;
+  
+  if (ioctl(fd, CAMIOCOMMAND, &cdm) == -1) {
+    DBG (1, "error sending CAMIOCOMMAND ioctl");
+    retval = -1;
+    goto ret;
+  }
+
+  if ((cdm.ccb_h.status != CAM_REQ_CMP)
+      || ((cdm.status != CAM_DEV_MATCH_LAST)
+	  && (cdm.status != CAM_DEV_MATCH_MORE))) {
+    DBG (1, "got CAM error %#x, CDM error %d\n",
+	 cdm.ccb_h.status, cdm.status);
+    retval = -1;
+    goto ret;
+  }
+
+  if (cdm.num_matches == 0) {
+    DBG (1, "not found\n");
+    retval = -1;
+    goto ret;
+  }
+	    
+  if (cdm.matches[0].type != DEV_MATCH_DEVICE) {
+    DBG (1, "no device match\n");
+    retval = -1;
+    goto ret;
+  }
+
+  inq = &cdm.matches[0].result.device_result.inq_data;
+  if ((vendor && cam_strmatch(inq->vendor, vendor, SID_VENDOR_SIZE)) ||
+      (product && cam_strmatch(inq->product, product, SID_PRODUCT_SIZE)))
+    retval = 1;
+ 
+ ret:
+  free(cdm.patterns);
+  free(cdm.matches);
+  return(retval);
+}
+
+void
+sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
+			 const char *findtype,
+			 int findbus, int findchannel, int findid, int findlun,
+			 SANE_Status (*attach) (const char *dev))
+{
+  int		fd;
+  struct ccb_dev_match	cdm;
+  struct periph_match_pattern *pattern;
+  struct periph_match_result *result;
+  int		i;
+  char devname[16];
+
+  DBG_INIT();
+
+  if ((fd = open(XPT_DEVICE, O_RDWR)) == -1) {
+    DBG (1, "could not open %s\n", XPT_DEVICE);
+    return;
+  }
+
+  /* build ccb for device match */
+  bzero(&cdm, sizeof(cdm));
+  cdm.ccb_h.func_code = XPT_DEV_MATCH;
+
+  /* result buffer */
+  cdm.match_buf_len = sizeof(struct dev_match_result) * 100;
+  cdm.matches = (struct dev_match_result *)malloc(cdm.match_buf_len);
+  cdm.num_matches = 0;
+
+  /* pattern buffer */
+  cdm.num_patterns = 1;
+  cdm.pattern_buf_len = sizeof(struct dev_match_pattern);
+  cdm.patterns = (struct dev_match_pattern *)malloc(cdm.pattern_buf_len);
+
+  /* assemble conditions ... findchannel is ignored */
+  cdm.patterns[0].type = DEV_MATCH_PERIPH;
+  pattern = &cdm.patterns[0].pattern.periph_pattern;
+  pattern->flags = PERIPH_MATCH_NAME;
+  strcpy(pattern->periph_name, "pass");
+  if (findbus != -1) {
+    pattern->path_id = findbus;
+    pattern->flags |= PERIPH_MATCH_PATH;
+  }    
+  if (findid != -1) {
+    pattern->target_id = findid;
+    pattern->flags |= PERIPH_MATCH_TARGET;
+  }
+  if (findlun != -1) {
+    pattern->target_lun = findlun;
+    pattern->flags |= PERIPH_MATCH_LUN;
+  }
+
+  /* result loop */
+  do {
+    if (ioctl(fd, CAMIOCOMMAND, &cdm) == -1) {
+      DBG (1, "error sending CAMIOCOMMAND ioctl");
+      break;
+    }
+
+    if ((cdm.ccb_h.status != CAM_REQ_CMP)
+	|| ((cdm.status != CAM_DEV_MATCH_LAST)
+	    && (cdm.status != CAM_DEV_MATCH_MORE))) {
+      DBG (1, "got CAM error %#x, CDM error %d\n", 
+	   cdm.ccb_h.status, cdm.status);
+      break;
+    }
+    
+    for (i = 0; i < cdm.num_matches; i++) {
+      if (cdm.matches[i].type != DEV_MATCH_PERIPH)
+	continue;
+      result = &cdm.matches[i].result.periph_result;
+      DBG (4, "%s%d on scbus%d %d:%d\n",
+	      result->periph_name, result->unit_number,
+	      result->path_id, result->target_id, result->target_lun);
+      if (cam_compare_inquiry(fd, result->path_id,
+			      result->target_id, result->target_lun,
+			      findvendor, findmodel, findtype) == 0) {
+	sprintf(devname, "/dev/%s%d", result->periph_name, result->unit_number);
+	(*attach) (devname);
+      }
+    }
+  } while ((cdm.ccb_h.status == CAM_REQ_CMP)
+	   && (cdm.status == CAM_DEV_MATCH_MORE));
+
+  free(cdm.patterns);
+  free(cdm.matches);
+  close(fd);
+  return;
+}
+
 #endif
 
 
@@ -3586,6 +3749,7 @@
 			 int findbus, int findchannel, int findid, int findlun,
 			 SANE_Status (*attach) (const char *dev))
 {
+  DBG_INIT();
   DBG (1, "sanei_scsi_find_devices: not implemented for this platform\n");
 }
 

----Next_Part(Fri_Sep__8_21:37:47_2000_758)----
