$NetBSD: patch-ab,v 1.2 2005/01/10 15:48:07 hamajima Exp $ --- libscg/scsi-bsd.c.orig Tue Jan 29 17:23:22 2002 +++ libscg/scsi-bsd.c @@ -48,7 +48,7 @@ static char __sccsid[] = * Choose your name instead of "schily" and make clear that the version * string is related to a modified source. */ -LOCAL char _scg_trans_version[] = "scsi-bsd.c-1.40"; /* The version for this transport*/ +LOCAL char _scg_trans_version[] = "scsi-bsd.c-1.40nb1"; /* The version for this transport*/ #define MAX_SCG 16 /* Max # of SCSI controllers */ #define MAX_TGT 16 @@ -108,7 +108,7 @@ scgo_version(scgp, what) * return "schily" for the SCG_AUTHOR request. */ case SCG_AUTHOR: - return (_scg_auth_schily); + return ("frueauf"); case SCG_SCCS_ID: return (__sccsid); } @@ -130,6 +130,15 @@ scgo_open(scgp, device) register int l; register int nopen = 0; char devname[64]; +#if defined(__NetBSD__) + struct scsi_addr mysaddr; +#if defined(__i386__) || defined(__amd64__) + char slicename[] = "d"; /* i386 is special */ +#else + char slicename[] = "c"; /* this is what the rest uses */ +#endif + char *myslicename = slicename; +#endif if (busno >= MAX_SCG || tgt >= MAX_TGT || tlun >= MAX_LUN) { errno = EINVAL; @@ -156,6 +165,60 @@ scgo_open(scgp, device) if ((device != NULL && *device != '\0') || (busno == -2 && tgt == -2)) goto openbydev; + +/* + * I know of no method in NetBSD to probe the scsibus and get the mapping + * busnumber,target,lun --> devicename. + * + * Because of this implement a true bruteforce hack to find + * out what cdroms there are. + * + * Note that this method only finds cd0-cd7. Anything higher + * than this needs additional tweaks. + * + * Feel free to implement this cleanly if you have better knowledge. + * Until then this helps to get -scanbus und thus xcdroast working :-) + * + */ +#if defined(__NetBSD__) + if (busno >= 0 && tgt >= 0 && tlun >= 0) { + for (l=0; l < MAX_LUN ; l++) { + sprintf(devname, "/dev/rcd%d%s", l, myslicename); + f = open(devname, O_RDWR); + if (f >= 0) { + if (ioctl(f, SCIOCIDENTIFY, &mysaddr) < 0) { + close(f); + errno = EINVAL; + return (0); + } + if (busno == SADDR_BUS(mysaddr) && tgt == SADDR_TARGET(mysaddr) && tlun == SADDR_LUN(mysaddr)) { + scglocal(scgp)->scgfiles[busno][tgt][tlun] = f; + return(1); + } + } else goto openbydev; + } + } else for (l=0; l < MAX_LUN ; l++) { + sprintf(devname, "/dev/rcd%d%s", l, myslicename); + f = open(devname, O_RDWR); + if (f >= 0) { + if (ioctl(f, SCIOCIDENTIFY, &mysaddr) < 0) { + close(f); + errno = EINVAL; + return (0); + } + scg_scsibus(scgp) = busno = SADDR_BUS(mysaddr); + scg_target(scgp) = tgt = SADDR_TARGET(mysaddr); + if ((tlun >= 0) && (tlun != SADDR_LUN(mysaddr))) { + close(f); + errno = EINVAL; + return (0); + } + scg_lun(scgp) = tlun = SADDR_LUN(mysaddr); + if (scg_setup(scgp, f, busno, tgt, tlun)) + nopen++; + } + } +#else /* not __NetBSD__ */ if (busno >= 0 && tgt >= 0 && tlun >= 0) { js_snprintf(devname, sizeof(devname), @@ -192,6 +255,7 @@ scgo_open(scgp, device) } } } +#endif /* end of not __NetBSD__ */ /* * Could not open /dev/su-* or got dev=devname:b,l,l / dev=devname:@,l * We do the apropriate tests and try our best.