📄 scuzz.c
字号:
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 + -