亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scsi-linux-sg.c

?? 刻錄光盤的程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
	int	Lun;	if (ioctl(f, SCSI_IOCTL_GET_IDLUN, &sg_id))		return (FALSE);	if (scgp->debug)		printf("l1: 0x%lX l2: 0x%lX\n", sg_id.l1, sg_id.l2);	if (ioctl(f, SCSI_IOCTL_GET_BUS_NUMBER, &Bus) < 0) {		Bus = -1;	}	Target	= sg_id.l1 & 0xFF;	Lun	= (sg_id.l1 >> 8) & 0xFF;	Chan	= (sg_id.l1 >> 16) & 0xFF;	Ino	= (sg_id.l1 >> 24) & 0xFF;	if (scgp->debug) {		printf("Bus: %d Target: %d Lun: %d Chan: %d Ino: %d\n",				Bus, Target, Lun, Chan, Ino);	}	*busp = Bus;	*tgtp = Target;	*lunp = Lun;	if (chanp)		*chanp = Chan;	if (inop)		*inop = Ino;	return (TRUE);}LOCAL longscsi_maxdma(scgp)	SCSI	*scgp;{	long maxdma = MAX_DMA_LINUX;#ifdef	SG_GET_BUFSIZE	/*	 * We assume that all /dev/sg instances use the same	 * maximum buffer size.	 */	if ((maxdma = ioctl(scglocal(scgp)->scgfile, SG_GET_BUFSIZE, 0)) < 0) {		if (scglocal(scgp)->scgfile >= 0) {			maxdma = MAX_DMA_LINUX;		}	}#endif#ifdef	USE_PG	if (scgp->scsibus == scglocal(scgp)->pgbus)		return (pg_maxdma(scgp));	if ((scgp->scsibus < 0) && (pg_maxdma(scgp) < maxdma))		return (pg_maxdma(scgp));#endif	return (maxdma);}EXPORT void *scsi_getbuf(scgp, amt)	SCSI	*scgp;	long	amt;{	char	*ret;	if (amt <= 0 || amt > scsi_maxdma(scgp))		return ((void *)0);	if (scgp->debug)		printf("scsi_getbuf: %ld bytes\n", amt);	/*	 * For performance reason, we allocate pagesize()	 * bytes before the SCSI buffer to avoid	 * copying the whole buffer contents when	 * setting up the /dev/sg data structures.	 */	ret = valloc((size_t)(amt+getpagesize()));	if (ret == NULL)		return (ret);	scgp->bufbase = ret;	ret += getpagesize();	scglocal(scgp)->SCSIbuf = ret;	return ((void *)ret);}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;{#ifdef	USE_PG	if (scgp->scsibus == scglocal(scgp)->pgbus)		return (pg_initiator_id(scgp));#endif	return (-1);}EXPORTint scsi_isatapi(scgp)	SCSI	*scgp;{#ifdef	USE_PG	if (scgp->scsibus == scglocal(scgp)->pgbus)		return (pg_isatapi(scgp));#endif#ifdef	SG_EMULATED_HOST	{	int	emulated = FALSE;	int	f = scsi_fileno(scgp, scgp->scsibus, scgp->target, scgp->lun);	if (ioctl(f, SG_EMULATED_HOST, &emulated) >= 0)		return (emulated != 0);	}#endif	return (-1);}EXPORTint scsireset(scgp)	SCSI	*scgp;{#ifdef	USE_PG	if (scgp->scsibus == scglocal(scgp)->pgbus)		return (pg_reset(scgp));#endif	/*	 * Do we have a SCSI reset in the Linux sg driver?	 */	return (-1);}LOCAL voidsg_settimeout(f, tmo)	int	f;	int	tmo;{	tmo *= HZ;	if (tmo)		tmo += HZ/2;	if (ioctl(f, SG_SET_TIMEOUT, &tmo) < 0)		comerr("Cannot set SG_SET_TIMEOUT.\n");}/* * Get misaligned int. * Needed for all recent processors (sparc/ppc/alpha) * because the /dev/sg design forces us to do misaligned * reads of integers. */#ifdef	MISALIGNLOCAL intscsi_getint(ip)	int	*ip;{		 int	ret;	register char	*cp = (char *)ip;	register char	*tp = (char *)&ret;	register int	i;	for (i = sizeof(int); --i >= 0; )		*tp++ = *cp++;		return (ret);}#define	GETINT(a)	scsi_getint(&(a))#else#define	GETINT(a)	(a)#endifLOCAL intscsi_send(scgp, f, sp)	SCSI		*scgp;	int		f;	struct scg_cmd	*sp;{	struct sg_rq	*sgp;	struct sg_rq	*sgp2;	int	i;	int	pack_len;	int	reply_len;	int	amt = sp->cdb_len;	struct sg_rq {		struct sg_header	hd;		unsigned char		buf[MAX_DMA_LINUX+SCG_MAX_CMD];	} sg_rq;#ifdef	SG_GET_BUFSIZE		/* We may use a 'sg' version 2 driver	*/	char	driver_byte;	char	host_byte;	char	msg_byte;	char	status_byte;#endif	if (f < 0) {		sp->error = SCG_FATAL;		return (0);	}#ifdef	USE_PG	if (scgp->scsibus == scglocal(scgp)->pgbus)		return (pg_send(scgp, f, sp));#endif	if (sp->timeout != scgp->deftimeout)		sg_settimeout(f, sp->timeout);	sgp2 = sgp = &sg_rq;	if (sp->addr == scglocal(scgp)->SCSIbuf) {		sgp = (struct sg_rq *)			(scglocal(scgp)->SCSIbuf - (sizeof(struct sg_header) + amt));		sgp2 = (struct sg_rq *)			(scglocal(scgp)->SCSIbuf - (sizeof(struct sg_header)));	} else {		if (scgp->debug) {			printf("DMA addr: 0x%8.8lX size: %d - using copy buffer\n",				(long)sp->addr, sp->size);		}		if (sp->size > (int)(sizeof(sg_rq.buf) - SCG_MAX_CMD)) {			errno = ENOMEM;			return (-1);		}	}	/*	 * This is done to avoid misaligned access of sgp->some_int	 */	pack_len = sizeof(struct sg_header) + amt;	reply_len = sizeof(struct sg_header);	if (sp->flags & SCG_RECV_DATA) {		reply_len += sp->size;	} else {		pack_len += sp->size;	}#ifdef	MISALIGN	/*	 * sgp->some_int may be misaligned if (sp->addr == SCSIbuf)	 * This is no problem on Intel porocessors, however	 * all other processors don't like it.	 * sizeof(struct sg_header) + amt is usually not a multiple of	 * sizeof(int). For this reason, we fill in the values into sg_rq	 * which is always corectly aligned and then copy it to the real	 * location if this location differs from sg_rq.	 * Never read/write directly to sgp->some_int !!!!!	 */	fillbytes((caddr_t)&sg_rq, sizeof(struct sg_header), '\0');	sg_rq.hd.pack_len = pack_len;	sg_rq.hd.reply_len = reply_len;	sg_rq.hd.pack_id = scglocal(scgp)->pack_id++;/*	sg_rq.hd.result = 0;	not needed because of fillbytes() */	if ((caddr_t)&sg_rq != (caddr_t)sgp)		movebytes((caddr_t)&sg_rq, (caddr_t)sgp, sizeof(struct sg_header));#else	fillbytes((caddr_t)sgp, sizeof(struct sg_header), '\0');	sgp->hd.pack_len = pack_len;	sgp->hd.reply_len = reply_len;	sgp->hd.pack_id = scglocal(scgp)->pack_id++;/*	sgp->hd.result = 0;	not needed because of fillbytes() */#endif	if (amt == 12)		sgp->hd.twelve_byte = 1;	for (i = 0; i < amt; i++ ) {		sgp->buf[i] = sp->cdb.cmd_cdb[i];;	}	if (!(sp->flags & SCG_RECV_DATA)) {		if ((void *)sp->addr != (void *)&sgp->buf[amt])			movebytes(sp->addr, &sgp->buf[amt], sp->size);		amt += sp->size;	}#ifdef	SG_GET_BUFSIZE	sgp->hd.want_new  = 1;			/* Order new behaviour	*/	sgp->hd.cdb_len	  = sp->cdb_len;	/* Set CDB length	*/	if (sp->sense_len > SG_MAX_SENSE)		sgp->hd.sense_len = SG_MAX_SENSE;	else		sgp->hd.sense_len = sp->sense_len;#endif	i = sizeof(struct sg_header) + amt;	if ((amt = write(f, sgp, i)) < 0) {			/* write */		sg_settimeout(f, scgp->deftimeout);		return (-1);	} else if (amt != i) {		errmsg("scsi_send(%s) wrote %d bytes (expected %d).\n",						scgp->cmdname, amt, i);	}	if (sp->addr == scglocal(scgp)->SCSIbuf) {		movebytes(sgp, sgp2, sizeof(struct sg_header));		sgp = sgp2;	}	sgp->hd.sense_buffer[0] = 0;	if ((amt = read(f, sgp, reply_len)) < 0) {		/* read */		sg_settimeout(f, scgp->deftimeout);		return (-1);	}	if (sp->flags & SCG_RECV_DATA && ((void *)sgp->buf != (void *)sp->addr)) {		movebytes(sgp->buf, sp->addr, sp->size);	}	sp->ux_errno = GETINT(sgp->hd.result);		/* Unaligned read */	sp->error = SCG_NO_ERROR;#ifdef	SG_GET_BUFSIZE	if (sgp->hd.grant_new) {		sp->sense_count = sgp->hd.sense_len;		pack_len    = GETINT(sgp->hd.sg_cmd_status);	/* Unaligned read */		driver_byte = (pack_len  >> 24) & 0xFF;		host_byte   = (pack_len  >> 16) & 0xFF;		msg_byte    = (pack_len  >> 8) & 0xFF;		status_byte =  pack_len  & 0xFF;		switch (host_byte) {		case DID_OK:				if ((driver_byte & DRIVER_SENSE ||				    sgp->hd.sense_buffer[0] != 0)							&& status_byte == 0) {					/*					 * The Linux SCSI system up to 2.1.xx					 * trashes the status byte in the					 * kernel. This is true at least for					 * ide-scsi emulation. Until this gets					 * fixed, we need this hack.					 */					sp->error = SCG_RETRYABLE;					status_byte = ST_CHK_COND;					if (sgp->hd.sense_len == 0)						sgp->hd.sense_len = SG_MAX_SENSE;				}				break;		case DID_NO_CONNECT:	/* Arbitration won, retry NO_CONNECT? */		case DID_BAD_TARGET:				sp->error = SCG_FATAL;				break;			case DID_TIME_OUT:				sp->error = SCG_TIMEOUT;				break;		default:				sp->error = SCG_RETRYABLE;				if ((driver_byte & DRIVER_SENSE ||				    sgp->hd.sense_buffer[0] != 0)							&& status_byte == 0)					status_byte = ST_CHK_COND;				if (status_byte != 0 && sgp->hd.sense_len == 0)					sgp->hd.sense_len = SG_MAX_SENSE;				break;		}		if ((host_byte != DID_OK || status_byte != 0) && sp->ux_errno == 0)			sp->ux_errno = EIO;		sp->u_scb.cmd_scb[0] = status_byte;		if (status_byte & ST_CHK_COND) {			sp->sense_count = sgp->hd.sense_len;			movebytes(sgp->hd.sense_buffer, sp->u_sense.cmd_sense, sp->sense_count);		}	} else#endif	{		if (GETINT(sgp->hd.result) == EBUSY) {	/* Unaligned read */			struct timeval to;			to.tv_sec = sp->timeout;			to.tv_usec = 500000;			scsitimes(scgp);			if (scgp->cmdstop->tv_sec < to.tv_sec ||			    (scgp->cmdstop->tv_sec == to.tv_sec &&				scgp->cmdstop->tv_usec < to.tv_usec)) {				sp->ux_errno = 0;				sp->error = SCG_TIMEOUT;	/* a timeout */			} else {				sp->error = SCG_RETRYABLE;	/* may be BUS_BUSY */			}		}		if (sp->flags & SCG_RECV_DATA)			sp->resid = (sp->size + sizeof(struct sg_header)) - amt;		else			sp->resid = 0;	/* sg version1 cannot return DMA resid count */		if (sgp->hd.sense_buffer[0] != 0) {			sp->error = SCG_RETRYABLE;			sp->scb.chk = 1;			sp->sense_count = SG_MAX_SENSE;			movebytes(sgp->hd.sense_buffer, sp->u_sense.cmd_sense, sp->sense_count);			if (sp->ux_errno == 0)				sp->ux_errno = EIO;		}	}	if (scgp->verbose > 0 && scgp->debug) {#ifdef	SG_GET_BUFSIZE		printf("status: 0x%08X pack_len: %d, reply_len: %d pack_id: %d result: %d wn: %d gn: %d cdb_len: %d sense_len: %d sense[0]: %02X\n",				GETINT(sgp->hd.sg_cmd_status),				GETINT(sgp->hd.pack_len),				GETINT(sgp->hd.reply_len),				GETINT(sgp->hd.pack_id),				GETINT(sgp->hd.result),				sgp->hd.want_new,				sgp->hd.grant_new,				sgp->hd.cdb_len,				sgp->hd.sense_len,					sgp->hd.sense_buffer[0]);#else		printf("pack_len: %d, reply_len: %d pack_id: %d result: %d sense[0]: %02X\n",				GETINT(sgp->hd.pack_len),				GETINT(sgp->hd.reply_len),				GETINT(sgp->hd.pack_id),				GETINT(sgp->hd.result),				sgp->hd.sense_buffer[0]);#endif#ifdef	DEBUG		printf("sense: ");		for (i=0; i < 16; i++)			printf("%02X ", sgp->hd.sense_buffer[i]);		printf("\n");#endif	}	if (sp->timeout != scgp->deftimeout)		sg_settimeout(f, scgp->deftimeout);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
337p粉嫩大胆色噜噜噜噜亚洲| 国产在线精品免费av| 综合激情成人伊人| 欧美午夜电影在线播放| 色爱区综合激月婷婷| 狠狠色狠狠色综合| 韩国精品免费视频| 国产一区二区视频在线| 久久成人精品无人区| 精品影院一区二区久久久| 蜜臀91精品一区二区三区| 亚洲免费观看在线视频| 久久亚洲二区三区| 亚洲一区二区在线免费观看视频 | 一区二区在线观看不卡| 一区二区三区在线视频观看| 亚洲国产va精品久久久不卡综合| 亚洲h精品动漫在线观看| 蜜臀国产一区二区三区在线播放| 久久99国内精品| 韩国三级在线一区| 免费高清在线视频一区·| 美女视频黄 久久| 国产成人综合精品三级| 色综合久久久久综合体 | 精品av久久707| 久久久久国产成人精品亚洲午夜 | 成人免费视频一区二区| a级精品国产片在线观看| 一道本成人在线| 99热国产精品| 91高清视频在线| 欧美在线视频全部完| 在线综合视频播放| 国产日韩影视精品| 亚洲精品视频免费看| 日本欧美一区二区三区乱码| 精品亚洲成a人| 不卡在线观看av| 欧美亚洲动漫制服丝袜| 欧美刺激脚交jootjob| 中文幕一区二区三区久久蜜桃| 亚洲精品自拍动漫在线| 蜜桃视频在线观看一区二区| 综合久久久久久| 日本午夜精品视频在线观看 | 激情六月婷婷久久| 欧美色手机在线观看| 国产欧美日本一区二区三区| 亚洲精品欧美专区| 九九久久精品视频| 91美女福利视频| 久久九九全国免费| 日韩av一区二| 91成人在线免费观看| 精品国产髙清在线看国产毛片 | 午夜欧美大尺度福利影院在线看| 日韩成人免费电影| 在线一区二区视频| 国产精品成人在线观看| 国产九色sp调教91| 欧美mv日韩mv国产网站| 亚洲欧美日韩久久| 国产综合久久久久久久久久久久| 欧美日韩第一区日日骚| 亚洲日本va在线观看| 国产成人亚洲精品狼色在线| 欧美一区二区三区四区五区| 亚洲大片在线观看| 91玉足脚交白嫩脚丫在线播放| 精品国精品自拍自在线| 午夜欧美大尺度福利影院在线看| www.爱久久.com| 精品久久久网站| 日韩中文字幕91| 在线观看三级视频欧美| 国产日产亚洲精品系列| 国产精品综合一区二区| 国产性色一区二区| 豆国产96在线|亚洲| 中文字幕av在线一区二区三区| 国产成人免费在线| 国产精品网友自拍| 91色在线porny| 夜夜精品视频一区二区| 欧美日韩另类国产亚洲欧美一级| 亚洲一区二区影院| 欧美日韩精品一区视频| 亚洲精品国产一区二区三区四区在线 | 国产精品66部| 久久久噜噜噜久噜久久综合| 成人小视频免费观看| 国产欧美日韩麻豆91| 色综合久久中文字幕| 亚洲黄色录像片| 日韩一卡二卡三卡国产欧美| 午夜精品久久久久| 中文字幕欧美日本乱码一线二线| 成人av电影在线| 五月婷婷另类国产| 欧美电影免费观看完整版 | 中文字幕乱码亚洲精品一区| 色综合天天综合色综合av | 亚洲一区二区在线观看视频| 欧美性一区二区| 奇米影视一区二区三区| 国产女主播视频一区二区| 日本韩国欧美三级| 国内成人免费视频| 亚洲色图20p| 精品裸体舞一区二区三区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 中文幕一区二区三区久久蜜桃| 成人av在线一区二区| 成人欧美一区二区三区小说 | 成人欧美一区二区三区白人 | 国产午夜三级一区二区三| 色成人在线视频| 国产一区在线看| 亚洲精品网站在线观看| 国产婷婷一区二区| 色哟哟欧美精品| 国产成人精品免费网站| 亚洲成人精品一区| 国产精品第五页| 久久亚洲精品小早川怜子| 欧美精品三级日韩久久| 91在线一区二区| 国产精品一色哟哟哟| 免费三级欧美电影| 国产精品久久久久久久久免费丝袜| 欧美色视频在线| 91丨国产丨九色丨pron| 国产不卡高清在线观看视频| 美女高潮久久久| 午夜视频在线观看一区| 亚洲另类中文字| 国产精品久久免费看| 国产亚洲视频系列| 久久精品欧美日韩| 久久免费午夜影院| 欧美一级一区二区| 欧洲亚洲精品在线| 欧美特级限制片免费在线观看| 91视视频在线观看入口直接观看www| 国产精品一区二区久激情瑜伽 | 麻豆国产欧美一区二区三区| 午夜视频在线观看一区二区三区| 亚洲国产精品视频| 亚洲成人自拍一区| 国产精品午夜久久| 国产精品久久影院| 日韩美女视频一区二区| 亚洲品质自拍视频网站| 一区二区三区在线视频观看| 亚洲黄色免费网站| 偷拍日韩校园综合在线| 日韩国产精品久久久久久亚洲| 亚洲制服丝袜av| 日韩极品在线观看| 免费在线视频一区| 国产高清在线精品| 国产成人午夜99999| 91免费看视频| 欧美日韩黄视频| 精品国内二区三区| 中文字幕av不卡| 最新国产精品久久精品| 亚洲精品免费在线| 日韩av网站在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品一区二区三区乱码| 国产高清亚洲一区| 99久久婷婷国产精品综合| 欧洲生活片亚洲生活在线观看| 欧美性感一类影片在线播放| 欧美日韩电影一区| 国产欧美日韩麻豆91| 一区二区三区鲁丝不卡| 日韩av成人高清| 国产精品一区二区久久不卡| 91在线一区二区| 日韩欧美电影一二三| 自拍av一区二区三区| 老鸭窝一区二区久久精品| 成人动漫中文字幕| 日韩欧美一区电影| 国产精品理伦片| 蜜乳av一区二区三区| 成人国产精品免费观看视频| 欧美电影一区二区| 国产精品久久久久影院| 亚洲午夜久久久久| 国产乱码精品一区二区三区av| 99视频精品在线| 久久久久久97三级| 亚洲成av人片www| 成人精品视频.| 欧美伦理影视网| 亚洲欧洲日本在线|