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

📄 scsi_cdr.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	g0_cdbaddr(&scmd->cdb.g0_cdb, addr);	scmd->cdb.g0_cdb.count = cnt;		scgp->cmdname = "write_g0";	if (scsicmd(scgp) < 0)		return (-1);	return (size - scsigetresid(scgp));}EXPORT intwrite_xg1(scgp, bp, addr, size, cnt)	SCSI	*scgp;	caddr_t	bp;		/* address of buffer */	long	addr;		/* disk address (sector) to put */	long	size;		/* number of bytes to transfer */	int	cnt;		/* sectorcount */{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = size;	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/*	scmd->flags = SCG_DISRE_ENA;*/	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = SC_EWRITE;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);	g1_cdblen(&scmd->cdb.g1_cdb, cnt);		scgp->cmdname = "write_g1";	if (scsicmd(scgp) < 0)		return (-1);	return (size - scsigetresid(scgp));}EXPORT intwrite_xg5(scgp, bp, addr, size, cnt)	SCSI	*scgp;	caddr_t	bp;		/* address of buffer */	long	addr;		/* disk address (sector) to put */	long	size;		/* number of bytes to transfer */	int	cnt;		/* sectorcount */{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = size;	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;/*	scmd->flags = SCG_DISRE_ENA;*/	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g5_cdb.cmd = 0xAA;	scmd->cdb.g5_cdb.lun = scgp->lun;	g5_cdbaddr(&scmd->cdb.g5_cdb, addr);	g5_cdblen(&scmd->cdb.g5_cdb, cnt);		scgp->cmdname = "write_g5";	if (scsicmd(scgp) < 0)		return (-1);	return (size - scsigetresid(scgp));}EXPORT intscsi_flush_cache(scgp)	SCSI	*scgp;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 2 * 60;		/* Max: sizeof(CDR-cache)/150KB/s */	scmd->cdb.g1_cdb.cmd = 0x35;	scmd->cdb.g1_cdb.lun = scgp->lun;		scgp->cmdname = "flush cache";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_buffer(scgp, bp, cnt, mode)	SCSI	*scgp;	caddr_t	bp;	int	cnt;	int	mode;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->dma_read = 1;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x3C;	/* Read Buffer */	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.cmd_cdb[1] |= (mode & 7);	g1_cdblen(&scmd->cdb.g1_cdb, cnt);		scgp->cmdname = "read buffer";	return (scsicmd(scgp));}EXPORT intread_subchannel(scgp, bp, track, cnt, msf, subq, fmt)	SCSI	*scgp;	caddr_t	bp;	int	track;	int	cnt;	int	msf;	int	subq;	int	fmt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x42;	scmd->cdb.g1_cdb.lun = scgp->lun;	if (msf)		scmd->cdb.g1_cdb.res = 1;	if (subq)		scmd->cdb.g1_cdb.addr[0] = 0x40;	scmd->cdb.g1_cdb.addr[1] = fmt;	scmd->cdb.g1_cdb.res6 = track;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read subchannel";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_toc(scgp, bp, track, cnt, msf, fmt)	SCSI	*scgp;	caddr_t	bp;	int	track;	int	cnt;	int	msf;	int	fmt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x43;	scmd->cdb.g1_cdb.lun = scgp->lun;	if (msf)		scmd->cdb.g1_cdb.res = 1;	scmd->cdb.g1_cdb.addr[0] = fmt & 0x0F;	scmd->cdb.g1_cdb.res6 = track;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read toc";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_toc_philips(scgp, bp, track, cnt, msf, fmt)	SCSI	*scgp;	caddr_t	bp;	int	track;	int	cnt;	int	msf;	int	fmt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 4 * 60;		/* May last  174s on a TEAC CD-R55S */	scmd->cdb.g1_cdb.cmd = 0x43;	scmd->cdb.g1_cdb.lun = scgp->lun;	if (msf)		scmd->cdb.g1_cdb.res = 1;	scmd->cdb.g1_cdb.res6 = track;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	if (fmt & 1)		scmd->cdb.g1_cdb.vu_96 = 1;	if (fmt & 2)		scmd->cdb.g1_cdb.vu_97 = 1;	scgp->cmdname = "read toc";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_header(scgp, bp, addr, cnt, msf)	SCSI	*scgp;	caddr_t	bp;	long	addr;	int	cnt;	int	msf;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x44;	scmd->cdb.g1_cdb.lun = scgp->lun;	if (msf)		scmd->cdb.g1_cdb.res = 1;	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read header";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_disk_info(scgp, bp, cnt)	SCSI	*scgp;	caddr_t	bp;	int	cnt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes */	scmd->cdb.g1_cdb.cmd = 0x51;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read disk info";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_track_info(scgp, bp, track, cnt)	SCSI	*scgp;	caddr_t	bp;	int	track;	int	cnt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes */	scmd->cdb.g1_cdb.cmd = 0x52;	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.g1_cdb.reladr = 1;	/* Track */	g1_cdbaddr(&scmd->cdb.g1_cdb, track);	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read track info";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intsend_opc(scgp, bp, cnt, doopc)	SCSI	*scgp;	caddr_t	bp;	int	cnt;	int	doopc;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 60;	scmd->cdb.g1_cdb.cmd = 0x54;	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.g1_cdb.reladr = doopc?1:0;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "send opc";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_track_info_philips(scgp, bp, track, cnt)	SCSI	*scgp;	caddr_t	bp;	int	track;	int	cnt;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0xE5;	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdbaddr(&scmd->cdb.g1_cdb, track);	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read track info";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intscsi_close_tr_session(scgp, type, track, immed)	SCSI	*scgp;	int	type;	int	track;	BOOL	immed;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 8 * 60;		/* Needs up to 4 minutes */	scmd->cdb.g1_cdb.cmd = 0x5B;	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.g1_cdb.addr[0] = type;	scmd->cdb.g1_cdb.addr[3] = track;	if (immed)		scmd->cdb.g1_cdb.reladr = 1;#ifdef	nono	scmd->cdb.g1_cdb.reladr = 1;	/* IMM hack to test Mitsumi behaviour*/#endif		scgp->cmdname = "close track/session";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intread_master_cue(scgp, bp, sheet, cnt)	SCSI	*scgp;	caddr_t	bp;		/* address of master cue sheet	*/	int	sheet;		/* Sheet number			*/	int	cnt;		/* Transfer count		*/{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = cnt;	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x59;		/* Read master cue */	scmd->cdb.g1_cdb.lun = scgp->lun;	scmd->cdb.g1_cdb.addr[2] = sheet;	g1_cdblen(&scmd->cdb.g1_cdb, cnt);	scgp->cmdname = "read master cue";	if (scsicmd(scgp) < 0)		return (-1);	return (0);}EXPORT intsend_cue_sheet(scgp, bp, size)	SCSI	*scgp;	caddr_t	bp;		/* address of cue sheet buffer */	long	size;		/* number of bytes to transfer */{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = bp;	scmd->size = size;	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x5D;	/* Send CUE sheet */	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdblen(&scmd->cdb.g1_cdb, size); 	scgp->cmdname = "send_cue_sheet";	if (scsicmd(scgp) < 0)		return (-1);	return (size - scmd->resid);}EXPORT intread_buff_cap(scgp, sp, fp)	SCSI	*scgp;	long	*sp;	/* Size pointer */	long	*fp;	/* Free pointer */{	char	resp[12];	Ulong	freespace;	Ulong	bufsize;	int	per;	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->addr = (caddr_t)resp;	scmd->size = sizeof(resp);	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;	scmd->cdb_len = SC_G1_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->cdb.g1_cdb.cmd = 0x5C;		/* Read buffer cap */	scmd->cdb.g1_cdb.lun = scgp->lun;	g1_cdblen(&scmd->cdb.g1_cdb, sizeof(resp));		scgp->cmdname = "read buffer cap";	if (scsicmd(scgp) < 0)		return (-1);	bufsize   = a_to_u_4_byte(&resp[4]);	freespace = a_to_u_4_byte(&resp[8]);	if (sp)		*sp = bufsize;	if (fp)		*fp = freespace;		if (scgp->verbose || (sp == 0 && fp == 0))		printf("BFree: %ld K BSize: %ld K\n", freespace >> 10, bufsize >> 10);	if (bufsize == 0)		return (0);	per = (100 * (bufsize - freespace)) / bufsize;	if (per < 0)		return (0);	if (per > 100)		return (100);	return (per);}EXPORT intscsi_blank(scgp, addr, blanktype, immed)	SCSI	*scgp;	long	addr;	int	blanktype;	BOOL	immed;{	register struct	scg_cmd	*scmd = scgp->scmd;	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');	scmd->flags = SCG_DISRE_ENA;	scmd->cdb_len = SC_G5_CDBLEN;	scmd->sense_len = CCS_SENSE_LEN;	scmd->target = scgp->target;	scmd->timeout = 160 * 60; /* full blank at 1x could take 80 minutes */	scmd->cdb.g5_cdb.cmd = 0xA1;	/* Blank */	scmd->cdb.g0_cdb.high_addr = blanktype;	g1_cdbaddr(&scmd->cdb.g5_cdb, addr);	if (immed)		scmd->cdb.g5_cdb.res |= 8;

⌨️ 快捷键说明

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