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

📄 scsi-unixware.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
			  /* Open pass-through device node */			  if ((fd = open(dname, O_RDONLY)) < 0) {				if (scgp->errstr)					js_snprintf(scgp->errstr, SCSI_ERRSTR_SIZE,						"can not open pass-through %s", dname);				return (-1);			  }			  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("s = %d, t = %d, l = %d, dev = %s, fd = %d\n", 		    		    	s, t, l, 					sdidevs[s][t][l].devn,					sdidevs[s][t][l].fd );			  }			}		}	}	return (nopen);}EXPORT intscsi_open(scgp, device, busno, tgt, tlun)	SCSI	*scgp;	char	*device;	int	busno;	int	tgt;	int	tlun;{	int		c, b, t;	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 (c = 0; c < MAX_SCG; c++) {			for (b = 0; b < MAX_TGT; b++) {				for (t = 0; t < MAX_LUN ; t++)					scglocal(scgp)->scgfiles[c][b][t] = (short)-1;			}		}	}	memset(sdidevs, 0, sizeof(sdidevs));	/* init tmp_structure */	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);	} else {			/* this is the new stuff     	 */					/* it will do the initialisation */					/* and return the number of      */					/* detected devices to be used   */					/* with the new addressing       */					/* scheme.                       */		return (unixware_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 = (void *) 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;{	register int	t;	register int	l;	register int	busno;	busno = scgp->scsibus;	if (busno < 0 || busno >= MAX_SCG)		return (FALSE);	for (t=0; t < MAX_TGT; t++) {		for (l=0; l < MAX_LUN ; l++)			if (sdidevs[busno][t][l].initiator == 1){				if (scgp->debug)					printf("scsi_initiator_id: id = %d\n", t);				return (t);			}	}	return (-1);}EXPORTint scsi_isatapi(scgp)	SCSI	*scgp;{	/* if the new address method is used we know if this is ATAPI*/	return (sdidevs[scgp->scsibus][scgp->target][scgp->lun].atapi);}EXPORTint scsireset(scgp)	SCSI	*scgp;{	return(-1);}LOCAL intdo_scsi_cmd(scgp, fd, sp)	SCSI		*scgp;	int		fd;	struct scg_cmd	*sp;{	int			ret;	int			i;	struct sb		scsi_cmd;	struct scb		*scbp;	memset(&scsi_cmd,  0, sizeof(scsi_cmd));	scsi_cmd.sb_type = ISCB_TYPE;	scbp = &scsi_cmd.SCB;	scbp->sc_cmdpt = (caddr_t) sp->cdb.cmd_cdb;	scbp->sc_cmdsz = sp->cdb_len;	scbp->sc_datapt = sp->addr;	scbp->sc_datasz = sp->size;	if (!(sp->flags & SCG_RECV_DATA) && (sp->size > 0))		scbp->sc_mode = SCB_WRITE;	else		scbp->sc_mode = SCB_READ;	scbp->sc_time = sp->timeout;	errno = 0;	for (;;) {		if ((ret = ioctl(fd, SDI_SEND, &scsi_cmd)) < 0) {			if (errno == EAGAIN){				sleep(1);				continue;			}			sp->ux_errno = errno;			if (errno == 0)				sp->ux_errno = EIO;			sp->error = SCG_RETRYABLE;			return (ret);		}		break;	}	memset(&sp->u_scb.Scb, 0, sizeof(sp->u_scb.Scb));	sp->u_scb.cmd_scb[0] = scbp->sc_status;	sp->resid = scbp->sc_resid;	sp->ux_errno = errno;	return (0);}LOCAL intdo_scsi_sense(scgp, fd, sp)	SCSI		*scgp;	int		fd;	struct scg_cmd	*sp;{	int		ret;	struct scg_cmd	s_cmd;	if (sp->sense_len > SCG_MAX_SENSE)		sp->sense_len = SCG_MAX_SENSE;	memset((caddr_t)&s_cmd, 0, sizeof(s_cmd));	s_cmd.addr      = (caddr_t) sp->u_sense.cmd_sense;	s_cmd.size      = sp->sense_len;	s_cmd.flags     = SCG_RECV_DATA|SCG_DISRE_ENA;	s_cmd.cdb_len   = SC_G0_CDBLEN;	s_cmd.sense_len = CCS_SENSE_LEN;	s_cmd.target    = scgp->target;	s_cmd.cdb.g0_cdb.cmd   = SC_REQUEST_SENSE;	s_cmd.cdb.g0_cdb.lun   = sp->cdb.g0_cdb.lun;	s_cmd.cdb.g0_cdb.count = sp->sense_len;	ret = do_scsi_cmd(scgp, fd, &s_cmd);	if (ret < 0)		return (ret);	sp->sense_count = sp->sense_len - s_cmd.resid;	return (ret);}LOCAL intscsi_send(scgp, fd, sp)	SCSI		*scgp;	int		fd;	struct scg_cmd	*sp;{	int	ret;	if ( fd < 0 ) {		sp->error = SCG_FATAL;		return (0);	} else {		ret = do_scsi_cmd(scgp, fd, sp);		if (ret < 0)			return (ret);		if (sp->u_scb.cmd_scb[0] & S_CKCON)			ret = do_scsi_sense(scgp, fd, sp);		return (ret);	}}#define	sense	u_sense.Sense#undef	SC_PARITY#define	SC_PARITY	0x09#define	scb		u_scb.Scb

⌨️ 快捷键说明

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