⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi-openserver.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	/* find root disk controller to make it scg 0     	*/	for (l = 0; l < nlm; l++)		if (strcmp(cmtbl[l].dev, DEV_ROOT) == 0)			t = l;	if (scgp->debug) {		printf("root = %5s(%d,%d,%d,%d) -> %s\n", 			cmtbl[t].drv, 			cmtbl[t].hba, 			cmtbl[t].bus, 			cmtbl[t].tgt, 			cmtbl[t].lun,			cmtbl[t].dev);		printf("-------------------- \n");	}	/* calculate scg from drv, hba and bus 			*/	strcpy(drvid, "");	for (l = 0, s = t; l < nlm; l++, s = (t + l) % nlm) {		if (strcmp(drvid, cmtbl[s].drv) != 0) {			strcpy(drvid, cmtbl[s].drv);			lhba = cmtbl[s].hba;			lbus = cmtbl[s].bus;			cmtbl[s].scg = ++nscg;		} else if (cmtbl[s].hba != lhba) {			lhba = cmtbl[s].hba;			lbus = cmtbl[s].bus;			cmtbl[s].scg = ++nscg;		} else if (cmtbl[s].bus != lbus) {			lbus = cmtbl[s].bus;			cmtbl[s].scg = ++nscg;		} else {			cmtbl[s].scg = nscg;		}		sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].valid  = 1;		sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].open   = 0;		if (strcmp(cmtbl[s].drv, DRV_ATAPI) == 0) 			sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].atapi = 1;		sdidevs[cmtbl[s].scg][cmtbl[s].tgt][cmtbl[s].lun].lmscsi = s;	}	/* open all device nodes */	for (s = 0; s < MAX_SCG; s++) {		for (t = 0; t < MAX_TGT; t++) {			for (l = 0; l < MAX_LUN ; l++) {			  if ( sdidevs[s][t][l].valid == 0) 			  	continue;			  /* Open pass-through device node */				mscsi = sdidevs[s][t][l].lmscsi;				strcpy(dname, cmtbl[mscsi].dev);	/* ------------------------------------------------------------------	** NOTE: If we can't open the device, we will set the device invalid!	** ------------------------------------------------------------------	*/				if ((fd = open(dname, O_RDONLY | O_NONBLOCK)) < 0) {					sdidevs[s][t][l].valid = 0;					continue;				}				if (scgp->debug) {					printf("%d,%d,%d => %5s(%d,%d,%d,%d) -> %d : %s \n", 						s, t, l,						cmtbl[mscsi].drv, 						cmtbl[mscsi].hba, 						cmtbl[mscsi].bus, 						cmtbl[mscsi].tgt, 						cmtbl[mscsi].lun,						cmtbl[mscsi].scg,						cmtbl[mscsi].dev);				}				sdidevs[s][t][l].fd   = fd;				sdidevs[s][t][l].open = 1;				nopen++;				scglocal(scgp)->scgfiles[s][t][l] = (short) fd;			}		}	}	if (scgp->debug) {		printf("-------------------- \n");		printf("nopen = %d devices   \n", nopen);		printf("-------------------- \n");	}	return (nopen);}EXPORT intscsi_open(scgp, device, busno, tgt, tlun)	SCSI	*scgp;	char	*device;	int	busno;	int	tgt;	int	tlun;{	int	f, b, t, l;	int	nopen = 0;	char	devname[64];	if (busno >= MAX_SCG || tgt >= MAX_TGT || tlun >= MAX_LUN) {		errno = EINVAL;		if (scgp->errstr)			js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE,				"Illegal value for busno, target or lun '%d,%d,%d'",				busno, tgt, tlun);		return (-1);	}	if (scgp->local == NULL) {		scgp->local = malloc(sizeof(struct scg_local));		if (scgp->local == NULL)			return (0);		for (b = 0; b < MAX_SCG; b++) {			for (t = 0; t < MAX_TGT; t++) {				for (l = 0; l < MAX_LUN ; l++)					scglocal(scgp)->scgfiles[b][t][l] = (short)-1;			}		}	}	if (*device != '\0') {          /* we don't allow old dev usage */		errno = EINVAL;		if (scgp->errstr)			js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE,			"Open by 'devname' no longer supported on this OS");		return (-1);	} 	return ( openserver_init(scgp) );}EXPORT intscsi_close(scgp)	SCSI	*scgp;{	register int	f;	register int	b;	register int	t;	register int	l;	if (scgp->local == NULL)		return (-1);	for (b=0; b < MAX_SCG; b++) {		for (t=0; t < MAX_TGT; t++) {			for (l=0; l < MAX_LUN ; l++) {				f = scglocal(scgp)->scgfiles[b][t][l];				if (f >= 0)					close(f);				sdidevs[b][t][l].fd    = -1;				sdidevs[b][t][l].open  =  0;				sdidevs[b][t][l].valid =  0;				scglocal(scgp)->scgfiles[b][t][l] = (short)-1;			}		}	}	return (0);}LOCAL longscsi_maxdma(scgp, amt)	SCSI	*scgp;	long	amt;{	return (MAX_DMA);}EXPORT void *scsi_getbuf(scgp, amt)	SCSI	*scgp;	long	amt;{	if (amt <= 0 || amt > scsi_bufsize(scgp, amt))		return ((void *)0);	if (scgp->debug)		printf("scsi_getbuf: %ld bytes\n", amt);	scgp->bufbase = valloc((size_t)(amt));	return (scgp->bufbase);}EXPORT voidscsi_freebuf(scgp)	SCSI	*scgp;{	if (scgp->bufbase)		free(scgp->bufbase);	scgp->bufbase = NULL;}EXPORTBOOL scsi_havebus(scgp, busno)	SCSI	*scgp;	int	busno;{	register int	t;	register int	l;	if (busno < 0 || busno >= MAX_SCG)		return (FALSE);	if (scgp->local == NULL)		return (FALSE);	for (t=0; t < MAX_TGT; t++) {		for (l=0; l < MAX_LUN ; l++)			if (scglocal(scgp)->scgfiles[busno][t][l] >= 0)				return (TRUE);	}	return (FALSE);}EXPORTint scsi_fileno(scgp, busno, tgt, tlun)	SCSI	*scgp;	int	busno;	int	tgt;	int	tlun;{	if (busno < 0 || busno >= MAX_SCG ||	    tgt   < 0 || tgt   >= MAX_TGT ||	    tlun  < 0 || tlun  >= MAX_LUN)		return (-1);	if (scgp->local == NULL)		return (-1);	return ((int)scglocal(scgp)->scgfiles[busno][tgt][tlun]);}EXPORT intscsi_initiator_id(scgp)	SCSI	*scgp;{	return (-1);	/* We don't know the initiator ID yet, but we can if we parse the 	** output of the command 'cat /dev/string/cfg | grep "%adapter"'  	**	** Sample line:                                                   	** 	**   %adapter 0xE800-0xE8FF 11 - type=alad ha=0 bus=0 id=7 fts=sto  	**	** This tells us that the alad controller 0 has an id of 7 !	** The parsing should be done in openserver_init().	**	*/}EXPORTint scsi_isatapi(scgp)	SCSI	*scgp;{	return (sdidevs[scgp->scsibus][scgp->target][scgp->lun].atapi);}EXPORTint scsireset(scgp)	SCSI	*scgp;{	return(-1);		/* no scsi reset available */}LOCAL voidcp_scg2sco(sco, scg)	struct scsicmd2	*sco;	struct scg_cmd	*scg;{	sco->cmd.data_ptr = (char *) scg->addr;	sco->cmd.data_len = scg->size;	sco->cmd.cdb_len  = scg->cdb_len;	sco->sense_len    = scg->sense_len;	sco->sense_ptr    = scg->u_sense.cmd_sense;	if (!(scg->flags & SCG_RECV_DATA) && (scg->size > 0))		sco->cmd.is_write = 1;	if (scg->cdb_len == SC_G0_CDBLEN )		memcpy(sco->cmd.cdb, &scg->cdb.g0_cdb, scg->cdb_len);	if (scg->cdb_len == SC_G1_CDBLEN )		memcpy(sco->cmd.cdb, &scg->cdb.g1_cdb, scg->cdb_len);	if (scg->cdb_len == SC_G5_CDBLEN )		memcpy(sco->cmd.cdb, &scg->cdb.g5_cdb, scg->cdb_len);}LOCAL voidcp_sco2scg(sco, scg)	struct scsicmd2	*sco;	struct scg_cmd	*scg;{	scg->size      = sco->cmd.data_len;	memset(&scg->scb, 0, sizeof(scg->scb));	if (sco->sense_len > SCG_MAX_SENSE)		scg->sense_count = SCG_MAX_SENSE;	else		scg->sense_count = sco->sense_len;	scg->resid = 0;	scg->u_scb.cmd_scb[0] = sco->cmd.target_sts;}LOCAL intscsi_send(scgp, fd, sp)	SCSI		*scgp;	int		fd;	struct scg_cmd	*sp;{	struct scsicmd2	scsi_cmd;	int		i;	u_char		sense_buf[SCG_MAX_SENSE];	if ( fd < 0 ) {		sp->error = SCG_FATAL;		return (0);	}	memset(&scsi_cmd, 0, sizeof(scsi_cmd));	memset(sense_buf,  0, sizeof(sense_buf));	scsi_cmd.sense_ptr = sense_buf;	scsi_cmd.sense_len = sizeof(sense_buf);	cp_scg2sco(&scsi_cmd, sp);	errno = 0;	for (;;) {		int	ioctlStatus;		if ((ioctlStatus = ioctl(fd, SCSIUSERCMD2, &scsi_cmd)) < 0) {			if (errno == EINTR)				continue;			cp_sco2scg(&scsi_cmd, sp);			sp->ux_errno = errno;			if (errno == 0)				sp->ux_errno = EIO;			sp->error    = SCG_RETRYABLE;			return (0);		}		break;	}	cp_sco2scg(&scsi_cmd, sp);	sp->ux_errno = errno;	if (scsi_cmd.cmd.target_sts & 0x02) {		if (errno == 0)			sp->ux_errno = EIO;		sp->error    = SCG_RETRYABLE;	} else {		sp->error    = SCG_NO_ERROR;	}	return 0;}#define	sense	u_sense.Sense

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -