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

📄 cdrecord.c

📁 刻录光盘的程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		}	}	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 + -