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

📄 scuzz.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
		if(type > 6){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 1:		if((track = strtoul(argv[0], &sp, 0)) == 0 && sp == argv[0]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 0:		break;	}	return SRblank(rp, type, track);}static longcmdsynccache(ScsiReq *rp, int argc, char *argv[]){	USED(argc, argv);	return SRsynccache(rp);}static longcmdrtoc(ScsiReq *rp, int argc, char *argv[]){	uchar d[100*8+4], format, track, *p;	char *sp;	long n, nbytes;	int tdl;	format = track = 0;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 2:		if((format = strtoul(argv[1], &sp, 0)) == 0 && sp == argv[1]){			rp->status = Status_BADARG;			return -1;		}		if(format > 4){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 1:		if((track = strtoul(argv[0], &sp, 0)) == 0 && sp == argv[0]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 0:		break;	}	if((nbytes = SRTOC(rp, d, sizeof(d), format, track)) == -1){		if(rp->status == STok)			Bprint(&bout, "\t(probably empty)\n");		return -1;	}	tdl = (d[0]<<8)|d[1];	switch(format){	case 0:		Bprint(&bout, "\ttoc/pma data length: 0x%uX\n", tdl);		Bprint(&bout, "\tfirst track number: %d\n", d[2]);		Bprint(&bout, "\tlast track number: %d\n", d[3]);		for(p = &d[4], n = tdl-2; n; n -= 8, p += 8){			Bprint(&bout, "\ttrack number: 0x%2.2uX\n", p[2]);			Bprint(&bout, "\t\tcontrol: 0x%2.2uX\n", p[1] & 0x0F);			Bprint(&bout, "\t\tblock address: 0x%uX\n",				(p[4]<<24)|(p[5]<<16)|(p[6]<<8)|p[7]);		}		break;	case 1:		Bprint(&bout, "\tsessions data length: 0x%uX\n", tdl);		Bprint(&bout, "\tnumber of finished sessions: %d\n", d[2]);		Bprint(&bout, "\tunfinished session number: %d\n", d[3]);		for(p = &d[4], n = tdl-2; n; n -= 8, p += 8){			Bprint(&bout, "\tsession number: 0x%2.2uX\n", p[0]);			Bprint(&bout, "\t\tfirst track number in session: 0x%2.2uX\n",				p[2]);			Bprint(&bout, "\t\tlogical start address: 0x%uX\n",				(p[5]<<16)|(p[6]<<8)|p[7]);		}		break;	case 2:		Bprint(&bout, "\tfull TOC data length: 0x%uX\n", tdl);		Bprint(&bout, "\tnumber of finished sessions: %d\n", d[2]);		Bprint(&bout, "\tunfinished session number: %d\n", d[3]);		for(p = &d[4], n = tdl-2; n > 0; n -= 11, p += 11){			Bprint(&bout, "\tsession number: 0x%2.2uX\n", p[0]);			Bprint(&bout, "\t\tcontrol: 0x%2.2uX\n", p[1] & 0x0F);			Bprint(&bout, "\t\tADR: 0x%2.2uX\n", (p[1]>>4) & 0x0F);			Bprint(&bout, "\t\tTNO: 0x%2.2uX\n", p[2]);			Bprint(&bout, "\t\tPOINT: 0x%2.2uX\n", p[3]);			Bprint(&bout, "\t\tMin: 0x%2.2uX\n", p[4]);			Bprint(&bout, "\t\tSec: 0x%2.2uX\n", p[5]);			Bprint(&bout, "\t\tFrame: 0x%2.2uX\n", p[6]);			Bprint(&bout, "\t\tZero: 0x%2.2uX\n", p[7]);			Bprint(&bout, "\t\tPMIN: 0x%2.2uX\n", p[8]);			Bprint(&bout, "\t\tPSEC: 0x%2.2uX\n", p[9]);			Bprint(&bout, "\t\tPFRAME: 0x%2.2uX\n", p[10]);		}		break;	case 3:		Bprint(&bout, "\tPMA data length: 0x%uX\n", tdl);		for(p = &d[4], n = tdl-2; n > 0; n -= 11, p += 11){			Bprint(&bout, "\t\tcontrol: 0x%2.2uX\n", p[1] & 0x0F);			Bprint(&bout, "\t\tADR: 0x%2.2uX\n", (p[1]>>4) & 0x0F);			Bprint(&bout, "\t\tTNO: 0x%2.2uX\n", p[2]);			Bprint(&bout, "\t\tPOINT: 0x%2.2uX\n", p[3]);			Bprint(&bout, "\t\tMin: 0x%2.2uX\n", p[4]);			Bprint(&bout, "\t\tSec: 0x%2.2uX\n", p[5]);			Bprint(&bout, "\t\tFrame: 0x%2.2uX\n", p[6]);			Bprint(&bout, "\t\tZero: 0x%2.2uX\n", p[7]);			Bprint(&bout, "\t\tPMIN: 0x%2.2uX\n", p[8]);			Bprint(&bout, "\t\tPSEC: 0x%2.2uX\n", p[9]);			Bprint(&bout, "\t\tPFRAME: 0x%2.2uX\n", p[10]);		}		break;	case 4:		Bprint(&bout, "\tATIP data length: 0x%uX\n", tdl);		break;	}	for(n = 0; n < nbytes; n++){		if(n && ((n & 0x0F) == 0))			Bprint(&bout, "\n");		Bprint(&bout, " %2.2uX", d[n]);	}	if(n && (n & 0x0F))		Bputc(&bout, '\n');	return nbytes;}static longcmdrdiscinfo(ScsiReq *rp, int argc, char*[]){	uchar d[MaxDirData];	int dl;	long n, nbytes;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 0:		break;	}	if((nbytes = SRrdiscinfo(rp, d, sizeof(d))) == -1)		return -1;	dl = (d[0]<<8)|d[1];	Bprint(&bout, "\tdata length: 0x%uX\n", dl);	Bprint(&bout, "\tinfo[2] 0x%2.2uX\n", d[2]);	switch(d[2] & 0x03){	case 0:		Bprint(&bout, "\t\tEmpty\n");		break;	case 1:		Bprint(&bout, "\t\tIncomplete disc (Appendable)\n");		break;	case 2:		Bprint(&bout, "\t\tComplete (CD-ROM or last session is closed and has no next session pointer)\n");		break;	case 3:		Bprint(&bout, "\t\tReserved\n");		break;	}	switch((d[2]>>2) & 0x03){	case 0:		Bprint(&bout, "\t\tEmpty Session\n");		break;	case 1:		Bprint(&bout, "\t\tIncomplete Session\n");		break;	case 2:		Bprint(&bout, "\t\tReserved\n");		break;	case 3:		Bprint(&bout, "\t\tComplete Session (only possible when disc Status is Complete)\n");		break;	}	if(d[2] & 0x10)		Bprint(&bout, "\t\tErasable\n");	Bprint(&bout, "\tNumber of First Track on Disc %ud\n", d[3]);	Bprint(&bout, "\tNumber of Sessions %ud\n", d[4]);	Bprint(&bout, "\tFirst Track Number in Last Session %ud\n", d[5]);	Bprint(&bout, "\tLast Track Number in Last Session %ud\n", d[6]);	Bprint(&bout, "\tinfo[7] 0x%2.2uX\n", d[7]);	if(d[7] & 0x20)		Bprint(&bout, "\t\tUnrestricted Use Disc\n");	if(d[7] & 0x40)		Bprint(&bout, "\t\tDisc Bar Code Valid\n");	if(d[7] & 0x80)		Bprint(&bout, "\t\tDisc ID Valid\n");	Bprint(&bout, "\tinfo[8] 0x%2.2uX\n", d[8]);	switch(d[8]){	case 0x00:		Bprint(&bout, "\t\tCD-DA or CD-ROM Disc\n");		break;	case 0x10:		Bprint(&bout, "\t\tCD-I Disc\n");		break;	case 0x20:		Bprint(&bout, "\t\tCD-ROM XA Disc\n");		break;	case 0xFF:		Bprint(&bout, "\t\tUndefined\n");		break;	default:		Bprint(&bout, "\t\tReserved\n");		break;	}	Bprint(&bout, "\tLast Session lead-in Start Time M/S/F: 0x%2.2uX/0x%2.2uX/0x%2.2uX\n",		d[17], d[18], d[19]);	Bprint(&bout, "\tLast Possible Start Time for Start of lead-out M/S/F: 0x%2.2uX/0x%2.2uX/0x%2.2uX\n",		d[21], d[22], d[23]);	for(n = 0; n < nbytes; n++){		if(n && ((n & 0x0F) == 0))			Bprint(&bout, "\n");		Bprint(&bout, " %2.2uX", d[n]);	}	if(n && (n & 0x0F))		Bputc(&bout, '\n');	return nbytes;}static longcmdrtrackinfo(ScsiReq *rp, int argc, char *argv[]){	uchar d[MaxDirData], track;	char *sp;	long n, nbytes;	int dl;	track = 0;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 1:		if((track = strtoul(argv[0], &sp, 0)) == 0 && sp == argv[0]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 0:		break;	}	if((nbytes = SRrtrackinfo(rp, d, sizeof(d), track)) == -1)		return -1;	dl = (d[0]<<8)|d[1];	Bprint(&bout, "\tdata length: 0x%uX\n", dl);	Bprint(&bout, "\Track Number %d\n", d[2]);	Bprint(&bout, "\Session Number %d\n", d[3]);	Bprint(&bout, "\tinfo[4] 0x%2.2uX\n", d[5]);	Bprint(&bout, "\t\tTrack Mode 0x%2.2uX: ", d[5] & 0x0F);	switch(d[5] & 0x0F){	case 0x00:	case 0x02:		Bprint(&bout, "2 audio channels without pre-emphasis\n");		break;	case 0x01:	case 0x03:		Bprint(&bout, "2 audio channels with pre-emphasis of 50/15µs\n");		break;	case 0x08:	case 0x0A:		Bprint(&bout, "audio channels without pre-emphasis (reserved in CD-R/RW)\n");		break;	case 0x09:	case 0x0B:		Bprint(&bout, "audio channels with pre-emphasis of 50/15µs (reserved in CD-R/RW)\n");		break;	case 0x04:	case 0x06:		Bprint(&bout, "Data track, recorded uninterrupted\n");		break;	case 0x05:	case 0x07:		Bprint(&bout, "Data track, recorded incremental\n");		break;	default:		Bprint(&bout, "(mode unknown)\n");		break;	}	if(d[5] & 0x10)		Bprint(&bout, "\t\tCopy\n");	if(d[5] & 0x20)		Bprint(&bout, "\t\tDamage\n");	Bprint(&bout, "\tinfo[6] 0x%2.2uX\n", d[6]);	Bprint(&bout, "\t\tData Mode 0x%2.2uX: ", d[6] & 0x0F);	switch(d[6] & 0x0F){	case 0x01:		Bprint(&bout, "Mode 1 (ISO/IEC 10149)\n");		break;	case 0x02:		Bprint(&bout, "Mode 2 (ISO/IEC 10149 or CD-ROM XA)\n");		break;	case 0x0F:		Bprint(&bout, "Data Block Type unknown (no track descriptor block)\n");		break;	default:		Bprint(&bout, "(Reserved)\n");		break;	}	if(d[6] & 0x10)		Bprint(&bout, "\t\tFP\n");	if(d[6] & 0x20)		Bprint(&bout, "\t\tPacket\n");	if(d[6] & 0x40)		Bprint(&bout, "\t\tBlank\n");	if(d[6] & 0x80)		Bprint(&bout, "\t\tRT\n");	Bprint(&bout, "\tTrack Start Address 0x%8.8uX\n",		(d[8]<<24)|(d[9]<<16)|(d[10]<<8)|d[11]);	if(d[7] & 0x01)		Bprint(&bout, "\tNext Writeable Address 0x%8.8uX\n",			(d[12]<<24)|(d[13]<<16)|(d[14]<<8)|d[15]);	Bprint(&bout, "\tFree Blocks 0x%8.8uX\n",		(d[16]<<24)|(d[17]<<16)|(d[18]<<8)|d[19]);	if((d[6] & 0x30) == 0x30)		Bprint(&bout, "\tFixed Packet Size 0x%8.8uX\n",			(d[20]<<24)|(d[21]<<16)|(d[22]<<8)|d[23]);	Bprint(&bout, "\tTrack Size 0x%8.8uX\n",		(d[24]<<24)|(d[25]<<16)|(d[26]<<8)|d[27]);	for(n = 0; n < nbytes; n++){		if(n && ((n & 0x0F) == 0))			Bprint(&bout, "\n");		Bprint(&bout, " %2.2uX", d[n]);	}	if(n && (n & 0x0F))		Bputc(&bout, '\n');	return nbytes;}static longcmdcdpause(ScsiReq *rp, int argc, char *argv[]){	USED(argc, argv);	return SRcdpause(rp, 0);}static longcmdcdresume(ScsiReq *rp, int argc, char *argv[]){	USED(argc, argv);	return SRcdpause(rp, 1);}static longcmdcdstop(ScsiReq *rp, int argc, char *argv[]){	USED(argc, argv);	return SRcdstop(rp);}static longcmdcdplay(ScsiReq *rp, int argc, char *argv[]){	long length, start;	char *sp;	int raw;	raw = 0;	start = 0;	if(argc && strcmp("-r", argv[0]) == 0){		raw = 1;		argc--, argv++;	}	length = 0xFFFFFFFF;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 2:		if(!raw || ((length = strtol(argv[1], &sp, 0)) == 0 && sp == argv[1])){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 1:		if((start = strtol(argv[0], &sp, 0)) == 0 && sp == argv[0]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 0:		break;	}	return SRcdplay(rp, raw, start, length);}static longcmdcdload(ScsiReq *rp, int argc, char *argv[]){	char *p;	ulong slot;	slot = 0;	if(argc && (slot = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){		rp->status = Status_BADARG;		return -1;	}	return SRcdload(rp, 1, slot);}static longcmdcdunload(ScsiReq *rp, int argc, char *argv[]){	char *p;	ulong slot;	slot = 0;	if(argc && (slot = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){		rp->status = Status_BADARG;		return -1;	}	return SRcdload(rp, 0, slot);}static longcmdcdstatus(ScsiReq *rp, int argc, char *argv[]){	uchar *list, *lp;	long nbytes, status;	int i, slots;	USED(argc, argv);	nbytes = 4096;	list = malloc(nbytes);	if(list == 0){		rp->status = STnomem;		return -1;	}	status = SRcdstatus(rp, list, nbytes);	if(status == -1){		free(list);		return -1;	}	lp = list;	Bprint(&bout, " Header\n   ");	for(i = 0; i < 8; i++){				/* header */		Bprint(&bout, " %2.2uX", *lp);		lp++;	}	Bputc(&bout, '\n');	slots = ((list[6]<<8)|list[7])/4;	Bprint(&bout, " Slots\n   ");	while(slots--){		Bprint(&bout, " %2.2uX %2.2uX %2.2uX %2.2uX\n   ",			*lp, *(lp+1), *(lp+2), *(lp+3));		lp += 4;	}	free(list);	return status;}static longcmdgetconf(ScsiReq *rp, int argc, char *argv[]){	uchar *list;	long nbytes, status;	USED(argc, argv);	nbytes = 4096;	list = malloc(nbytes);	if(list == 0){		rp->status = STnomem;		return -1;	}	status = SRgetconf(rp, list, nbytes);	if(status == -1){		free(list);		return -1;	}	/* to be done... */	free(list);	return status;}static longcmdfwaddr(ScsiReq *rp, int argc, char *argv[]){	uchar d[MaxDirData], npa, track, mode;	long n;	char *p;	npa = mode = track = 0;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 3:		if((npa = strtoul(argv[1], &p, 0)) == 0 && p == argv[1]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 2:		if((mode = strtoul(argv[1], &p, 0)) == 0 && p == argv[1]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 1:		if((track = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){			rp->status = Status_BADARG;			return -1;		}		break;	case 0:		break;	}	if((n = SRfwaddr(rp, track, mode, npa, d)) == -1)		return -1;	Bprint(&bout, "%ud %ud\n", d[0], (d[1]<<24)|(d[2]<<16)|(d[3]<<8)|d[4]);	return n;}static longcmdtreserve(ScsiReq *rp, int argc, char *argv[]){	long nbytes;	char *p;	if(argc != 1 || ((nbytes = strtoul(argv[0], &p, 0)) == 0 && p == argv[0])){		rp->status = Status_BADARG;		return -1;	}	return SRtreserve(rp, nbytes);}static longcmdtrackinfo(ScsiReq *rp, int argc, char *argv[]){	uchar d[MaxDirData], track;	long n;	ulong ul;	char *p;	track = 0;	if(argc && (track = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){		rp->status = Status_BADARG;		return -1;	}	if((n = SRtinfo(rp, track, d)) == -1)		return -1;	Bprint(&bout, "buffer length: 0x%uX\n", d[0]);	Bprint(&bout, "number of tracks: 0x%uX\n", d[1]);	ul = (d[2]<<24)|(d[3]<<16)|(d[4]<<8)|d[5];	Bprint(&bout, "start address: 0x%luX\n", ul);	ul = (d[6]<<24)|(d[7]<<16)|(d[8]<<8)|d[9];	Bprint(&bout, "track length: 0x%luX\n", ul);	Bprint(&bout, "track mode: 0x%uX\n", d[0x0A] & 0x0F);	Bprint(&bout, "track status: 0x%uX\n", (d[0x0A]>>4) & 0x0F);	Bprint(&bout, "data mode: 0x%uX\n", d[0x0B] & 0x0F);	ul = (d[0x0C]<<24)|(d[0x0D]<<16)|(d[0x0E]<<8)|d[0x0F];	Bprint(&bout, "free blocks: 0x%luX\n", ul);	return n;}static longcmdwtrack(ScsiReq *rp, int argc, char *argv[]){	uchar mode, track;	long n, nbytes, total, x;	int fd, pid;	char *p;	mode = track = 0;	nbytes = 0;	switch(argc){	default:		rp->status = Status_BADARG;		return -1;	case 4:		if((mode = strtoul(argv[3], &p, 0)) == 0 && p == argv[3]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 3:		if((track = strtoul(argv[2], &p, 0)) == 0 && p == argv[2]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 2:		if((nbytes = strtoul(argv[1], &p, 0)) == 0 && p == argv[1]){			rp->status = Status_BADARG;			return -1;		}		/*FALLTHROUGH*/	case 1:		if((fd = mkfile(argv[0], OREAD, &pid)) == -1){			rp->status = Status_BADARG;			return -1;

⌨️ 快捷键说明

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