📄 cdrecord.c
字号:
} } return (TRUE);}LOCAL voidraise_fdlim(){#ifdef RLIMIT_NOFILE struct rlimit rlim; /* * Set max # of file descriptors to be able to hold all files open */ getrlimit(RLIMIT_NOFILE, &rlim); rlim.rlim_cur = MAX_TRACK + 10; if (rlim.rlim_cur > rlim.rlim_max) errmsgno(EX_BAD, "warning: low file descriptor limit (%ld)\n", rlim.rlim_max); setrlimit(RLIMIT_NOFILE, &rlim);#endif /* RLIMIT_NOFILE */}char *opts ="help,version,checkdrive,prcap,inq,scanbus,reset,ignsize,useinfo,dev*,timeout#,driver*,tsize&,padsize&,pregap&,defpregap&,speed#,load,eject,dummy,msinfo,toc,atip,multi,fix,nofix,debug,v+,V+,audio,data,mode2,xa1,xa2,cdi,isosize,nopreemp,preemp,nopad,pad,swab,fs&,blank&,pktsize#,packet,noclose,force,dao,scms,isrc*,mcn*,index*";LOCAL voidgargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, toctypep, blankp) int ac; char **av; int *tracksp; track_t *trackp; cdr_t **dpp; char **devp; int *timeoutp; int *speedp; long *flagsp; int *toctypep; int *blankp;{ int cac; char * const*cav; char *driver = NULL; char *dev = NULL; char *isrc = NULL; char *mcn = NULL; char *tindex = NULL; long bltype = -1; Llong tracksize; Llong padsize; long pregapsize; long defpregap = -1L; long secsize; int pktsize; int speed = -1; int help = 0; int version = 0; int checkdrive = 0; int prcap = 0; int inq = 0; int scanbus = 0; int reset = 0; int ignsize = 0; int useinfo = 0; int load = 0; int eject = 0; int dummy = 0; int msinfo = 0; int toc = 0; int atip = 0; int multi = 0; int fix = 0; int nofix = 0; int audio; int autoaudio = 0; int data; int mode2; int xa1; int xa2; int cdi; int isize; int ispacket = 0; int noclose = 0; int force = 0; int dao = 0; int scms = 0; int preemp = 0; int nopreemp; int pad = 0; int bswab = 0; int nopad; int flags; int tracks = *tracksp; int tracktype = TOC_ROM; int sectype = ST_ROM_MODE1; int dbtype = DB_ROM_MODE1; int got_track; trackp[0].flags |= TI_TAO; trackp[1].pregapsize = -1; *flagsp |= F_WRITE; cac = --ac; cav = ++av; for (;; cac--, cav++) { tracksize = (Llong)-1L; padsize = (Llong)0L; pregapsize = defpregap; audio = data = mode2 = xa1 = xa2 = cdi = 0; isize = nopreemp = nopad = 0; pktsize = 0; isrc = NULL; tindex = NULL; if (getargs(&cac, &cav, opts, &help, &version, &checkdrive, &prcap, &inq, &scanbus, &reset, &ignsize, &useinfo, devp, timeoutp, &driver, getllnum, &tracksize, getllnum, &padsize, getnum, &pregapsize, getnum, &defpregap, &speed, &load, &eject, &dummy, &msinfo, &toc, &atip, &multi, &fix, &nofix, &debug, &lverbose, &scsi_verbose, &audio, &data, &mode2, &xa1, &xa2, &cdi, &isize, &nopreemp, &preemp, &nopad, &pad, &bswab, getnum, &fs, getbltype, &bltype, &pktsize, &ispacket, &noclose, &force, &dao, &scms, &isrc, &mcn, &tindex) < 0) { errmsgno(EX_BAD, "Bad Option: %s.\n", cav[0]); usage(EX_BAD); } if (help) usage(0); if (tracks == 0) { if (driver) set_cdrcmds(driver, dpp); if (version) *flagsp |= F_VERSION; if (checkdrive) *flagsp |= F_CHECKDRIVE; if (prcap) *flagsp |= F_PRCAP; if (inq) *flagsp |= F_INQUIRY; if (scanbus) *flagsp |= F_SCANBUS; if (reset) *flagsp |= F_RESET; if (ignsize) *flagsp |= F_IGNSIZE; if (load) *flagsp |= F_LOAD; if (eject) *flagsp |= F_EJECT; if (dummy) *flagsp |= F_DUMMY; if (msinfo) *flagsp |= F_MSINFO; if (toc) { *flagsp |= F_TOC; *flagsp &= ~F_WRITE; } if (atip) { *flagsp |= F_PRATIP; *flagsp &= ~F_WRITE; } if (multi) { *flagsp |= F_MULTI; tracktype = TOC_XA2; sectype = ST_ROM_MODE2; dbtype = DB_XA_MODE2; /* XXX -multi nimmt DB_XA_MODE2_F1 !!! */ } if (fix) *flagsp |= F_FIX; if (nofix) *flagsp |= F_NOFIX; if (force) *flagsp |= F_FORCE; if (bltype >= 0) { *flagsp |= F_BLANK; *blankp = bltype; } if (dao) { *flagsp |= F_SAO; trackp[0].flags &= ~TI_TAO; } if (mcn) {#ifdef AUINFO setmcn(mcn, &trackp[0]);#else trackp[0].isrc = malloc(16); fillbytes(trackp[0].isrc, 16, '\0'); strncpy(trackp[0].isrc, mcn, 13);#endif mcn = NULL; } version = checkdrive = prcap = inq = scanbus = reset = ignsize = load = eject = dummy = msinfo = toc = atip = multi = fix = nofix = force = dao = 0; } else if ((version + checkdrive + prcap + inq + scanbus + reset + ignsize + load + eject + dummy + msinfo + toc + atip + multi + fix + nofix + force + dao) > 0 || mcn != NULL) comerrno(EX_BAD, "Badly placed option. Global options must be before any track.\n"); if (nopreemp) preemp = 0; if (nopad) pad = 0; if ((audio + data + mode2 + xa1 + xa2 + cdi) > 1) { errmsgno(EX_BAD, "Too many types for track %d.\n", tracks+1); comerrno(EX_BAD, "Only one of -audio, -data, -mode2, -xa1, -xa2, -cdi allowed.\n"); } if (ispacket && audio) { comerrno(EX_BAD, "Audio data cannot be written in packet mode.\n"); } got_track = getfiles(&cac, &cav, opts); if (autoaudio) { autoaudio = 0; tracktype = TOC_ROM; sectype = ST_ROM_MODE1; dbtype = DB_ROM_MODE1; } if (got_track != 0 && (is_auname(cav[0]) || is_wavname(cav[0]))) { autoaudio++; audio++; } if (data) { tracktype = TOC_ROM; sectype = ST_ROM_MODE1; dbtype = DB_ROM_MODE1; } if (mode2) { tracktype = TOC_ROM; sectype = ST_ROM_MODE2; dbtype = DB_ROM_MODE2; } if (audio) { tracktype = TOC_DA; sectype = preemp ? ST_AUDIO_PRE : ST_AUDIO_NOPRE; dbtype = DB_RAW; } if (xa1) { tracktype = TOC_XA1; sectype = ST_ROM_MODE1; dbtype = DB_XA_MODE1; } if (xa2) { tracktype = TOC_XA2; sectype = ST_ROM_MODE2; dbtype = DB_XA_MODE2_F1; /* XXX Das unterscheidet sich von -multi !!! */ } if (cdi) { tracktype = TOC_CDI; sectype = ST_ROM_MODE2; dbtype = DB_XA_MODE2_F1; } if (tracks == 0) *toctypep = tracktype; flags = 0; if ((sectype & ST_AUDIOMASK) != 0) flags |= TI_AUDIO; if (isize) { flags |= TI_ISOSIZE; if ((*flagsp & F_MULTI) != 0) comerrno(EX_BAD, "Cannot get isosize for multi session disks.\n"); } if (preemp) flags |= TI_PREEMP; if (scms) flags |= TI_SCMS; if ((flags & TI_AUDIO) == 0 && padsize > (Llong)0L) pad = TRUE; if (pad) { flags |= TI_PAD; if ((flags & TI_AUDIO) == 0 && padsize == (Llong)0L) padsize = (Llong)PAD_SIZE; } if (bswab) flags |= TI_SWAB; if (ispacket) flags |= TI_PACKET; if (noclose) flags |= TI_NOCLOSE; if ((*flagsp & F_SAO) == 0) flags |= TI_TAO; if (got_track == 0) break; tracks++; if (tracks > MAX_TRACK) comerrno(EX_BAD, "Track limit (%d) exceeded\n", MAX_TRACK); if (strcmp("-", cav[0]) == 0) { trackp[tracks].f = STDIN_FILENO;#if defined(__CYGWIN32__) || defined(__EMX__) setmode(STDIN_FILENO, O_BINARY);#endif } else { if (access(cav[0], R_OK) < 0) comerr("No read access for '%s'.\n", cav[0]); if ((trackp[tracks].f = open(cav[0], O_RDONLY|O_BINARY)) < 0) comerr("Cannot open '%s'.\n", cav[0]); } if (!is_auname(cav[0]) && !is_wavname(cav[0])) flags |= TI_NOAUHDR; if ((*flagsp & F_SAO) != 0 && (flags & TI_AUDIO) != 0) flags |= TI_PREGAP; /* Hack for now */ if (tracks == 1) flags &= ~TI_PREGAP; if (tracks == 1 && (pregapsize != -1L && pregapsize != 150)) pregapsize = -1L; secsize = tracktype == TOC_DA ? AUDIO_SEC_SIZE : DATA_SEC_SIZE; trackp[tracks].filename = cav[0];; trackp[tracks].trackstart = 0L; trackp[tracks].tracksize = tracksize; if (trackp[tracks].pregapsize < 0) trackp[tracks].pregapsize = pregapsize; trackp[tracks+1].pregapsize = -1; trackp[tracks].padsize = padsize; trackp[tracks].secsize = secsize; trackp[tracks].secspt = 0; /* transfer size is set up in set_trsizes() */ trackp[tracks].pktsize = pktsize; trackp[tracks].trackno = tracks; trackp[tracks].sectype = sectype; trackp[tracks].tracktype = tracktype; trackp[tracks].dbtype = dbtype; trackp[tracks].flags = flags; trackp[tracks].nindex = 1; trackp[tracks].tindex = 0; checksize(&trackp[tracks]); tracksize = trackp[tracks].tracksize; if (tracksize > 0 && (tracksize / secsize) < 300) { tracksize = roundup(tracksize, secsize); padsize = tracksize + roundup(padsize, secsize); if ((padsize / secsize) < 300) { trackp[tracks].padsize = 300 * secsize - tracksize; } }#ifdef AUINFO if (useinfo) { auinfo(cav[0], tracks, trackp); if (tracks == 1) printf("pregap1: %ld\n", trackp[1].pregapsize); }#endif if (isrc) {#ifdef AUINFO setisrc(isrc, &trackp[tracks]);#else trackp[tracks].isrc = malloc(16); fillbytes(trackp[tracks].isrc, 16, '\0'); strncpy(trackp[tracks].isrc, isrc, 12);#endif } if (tindex) {#ifdef AUINFO setindex(tindex, &trackp[tracks]);#endif } if (debug) { printf("File: '%s' tracksize: %ld secsize: %d tracktype: %d = %s sectype: %X = %s dbtype: %s flags %X\n", cav[0], trackp[tracks].tracksize, trackp[tracks].secsize, tracktype, toc2name[tracktype & TOC_MASK], sectype, st2name[sectype & ST_MASK], db2name[dbtype], flags); } } if (speed < 0 && speed != -1) comerrno(EX_BAD, "Bad speed option.\n"); if (fs < 0L && fs != -1L) comerrno(EX_BAD, "Bad fifo size option.\n"); dev = *devp; cdr_defaults(&dev, &speed, &fs); if (debug) printf("dev: %s speed: %d fs: %ld\n", dev, speed, fs); if (speed >= 0) *speedp = speed; if (fs < 0L) fs = DEFAULT_FIFOSIZE; if (dev != *devp && (*flagsp & F_SCANBUS) == 0) *devp = dev; if (!*devp && (*flagsp & (F_VERSION|F_SCANBUS)) == 0) { errmsgno(EX_BAD, "No CD/DVD-Recorder device specified.\n"); usage(EX_BAD); } if (*flagsp & (F_LOAD|F_MSINFO|F_TOC|F_PRATIP|F_FIX|F_VERSION|F_CHECKDRIVE|F_PRCAP|F_INQUIRY|F_SCANBUS|F_RESET)) { if (tracks != 0) { errmsgno(EX_BAD, "No tracks allowed with this option\n"); usage(EX_BAD); } return; } if (tracks == 0 && (*flagsp & (F_LOAD|F_EJECT|F_BLANK)) == 0) { errmsgno(EX_BAD, "No tracks specified. Need at least one.\n"); usage(EX_BAD); } *tracksp = tracks; if (*flagsp & F_SAO) { /* * Make sure that you change WRITER_MAXWAIT & READER_MAXWAIT * too if you change this timeout. */ if (*timeoutp < 200) /* Lead in size is 2:30 */ *timeoutp = 200; /* 200s is 150s *1.33 */ }}LOCAL voidset_trsizes(dp, tracks, trackp) cdr_t *dp; int tracks; track_t *trackp;{ int i; /* * We are using SCSI Group 0 write * and cannot write more than 255 secs at once. */ data_secs_per_tr = bufsize/DATA_SEC_SIZE; audio_secs_per_tr = bufsize/AUDIO_SEC_SIZE; data_secs_per_tr = min(255, data_secs_per_tr); audio_secs_per_tr = min(255, audio_secs_per_tr); trackp[1].flags |= TI_FIRST; trackp[tracks].flags |= TI_LAST; for (i = 1; i <= tracks; i++) { trackp[i].secspt = is_audio(&trackp[i]) ? audio_secs_per_tr : data_secs_per_tr; if (is_packet(&trackp[i]) && trackp[i].pktsize > 0) { if (trackp[i].secspt >= trackp[i].pktsize) { trackp[i].secspt = trackp[i].pktsize; } else { comerrno(EX_BAD, "Track %d packet size %d exceeds buffer limit of %d sectors", i, trackp[i].pktsize, trackp[i].secspt); } } if ((dp->cdr_flags & CDR_SWABAUDIO) != 0 && is_audio(&trackp[i])) { trackp[i].flags ^= TI_SWAB; } }}EXPORT voidload_media(scgp, dp, doexit) SCSI *scgp; cdr_t *dp; BOOL doexit;{ int code; int key; /* * Do some preparation before... */ scgp->silent++; /* Be quiet if this fails */ test_unit_ready(scgp); /* First eat up unit attention */ (*dp->cdr_load)(scgp); /* now try to load media and */ scsi_start_stop_unit(scgp, 1, 0);/* start unit in silent mode */ scgp->silent--; if (!wait_unit_ready(scgp, 60)) { code = scsi_sense_code(scgp); key = scsi_sense_key(scgp); scgp->silent++; scsi_prevent_removal(scgp, 0);/* In case someone locked it */ scgp->silent--; if (!doexit) return; if (key == SC_NOT_READY && (code == 0x3A || code == 0x30)) comerrno(EX_BAD, "No disk / Wrong disk!\n"); comerrno(EX_BAD, "CD/DVD-Recorder not ready.\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -