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

📄 cdrecord.c

📁 刻录光盘的程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	scsi_prevent_removal(scgp, 1);	scsi_start_stop_unit(scgp, 1, 0);	wait_unit_ready(scgp, 120);	scgp->silent++;	rezero_unit(scgp);	/* Is this needed? Not supported by some drvives */	scgp->silent--;	test_unit_ready(scgp);	scsi_start_stop_unit(scgp, 1, 0);	wait_unit_ready(scgp, 120);}EXPORT voidunload_media(scgp, dp, flags)	SCSI	*scgp;	cdr_t	*dp;	int	flags;{	scsi_prevent_removal(scgp, 0);	if ((flags & F_EJECT) != 0)		(*dp->cdr_unload)(scgp);}EXPORT voidset_secsize(scgp, secsize)	SCSI	*scgp;	int	secsize;{	if (secsize > 0) {		/*		 * Try to restore the old sector size.		 */		scgp->silent++;		select_secsize(scgp, secsize);		scgp->silent--;	}}LOCAL voidcheck_recovery(scgp, dp, flags)	SCSI	*scgp;	cdr_t	*dp;	int	flags;{	if ((*dp->cdr_check_recovery)(scgp)) {		errmsgno(EX_BAD, "Recovery needed.\n");		unload_media(scgp, dp, flags);		excdr(EX_BAD, NULL);	/* XXX &exargs ??? */		exit(EX_BAD);	}}#define	DEBUGvoid audioread(scgp, dp, flags)	SCSI	*scgp;	cdr_t	*dp;	int	flags;{#ifdef	DEBUG	int speed = 1;	int dummy = 0;	if ((*dp->cdr_set_speed_dummy)(scgp, &speed, dummy) < 0)		exit(-1);	if ((*dp->cdr_set_secsize)(scgp, 2352) < 0)		exit(-1);	scgp->cap->c_bsize = 2352;	read_scsi(scgp, buf, 1000, 1);	printf("XXX:\n");	write(1, buf, 512);	unload_media(scgp, dp, flags);	excdr(0, NULL);	/* XXX &exargs ??? */	exit(0);#endif}LOCAL voidprint_msinfo(scgp, dp)	SCSI	*scgp;	cdr_t	*dp;{	long	off;	long	fa;	if ((*dp->cdr_session_offset)(scgp, &off) < 0) {		errmsgno(EX_BAD, "Cannot read session offset\n");		return;	}	if (lverbose)		printf("session offset: %ld\n", off);	if (dp->cdr_next_wr_address(scgp, 0, (track_t *)0, &fa) < 0) {		errmsgno(EX_BAD, "Cannot read first writable address\n");		return;	}	printf("%ld,%ld\n", off, fa);}LOCAL voidprint_toc(scgp, dp)	SCSI	*scgp;	cdr_t	*dp;{	int	first;	int	last;	long	lba;	long	xlba;	struct msf msf;	int	adr;	int	control;	int	mode;	int	i;	scgp->silent++;	if (read_capacity(scgp) < 0) {		scgp->silent--;		errmsgno(EX_BAD, "Cannot read capacity\n");		return;	}	scgp->silent--;	if (read_tochdr(scgp, dp, &first, &last) < 0) {		errmsgno(EX_BAD, "Cannot read TOC/PMA\n");		return;	}	printf("first: %d last %d\n", first, last);	for (i = first; i <= last; i++) {		read_trackinfo(scgp, i, &lba, &msf, &adr, &control, &mode);		xlba = -150 +			msf.msf_frame + (75*msf.msf_sec) + (75*60*msf.msf_min);		if (xlba == lba/4)			lba = xlba;		print_track(i, lba, &msf, adr, control, mode);	}	i = 0xAA;	read_trackinfo(scgp, i, &lba, &msf, &adr, &control, &mode);	xlba = -150 +		msf.msf_frame + (75*msf.msf_sec) + (75*60*msf.msf_min);	if (xlba == lba/4)		lba = xlba;	print_track(i, lba, &msf, adr, control, mode);	if (lverbose > 1) {		scgp->silent++;		if (read_cdtext(scgp) < 0)			errmsgno(EX_BAD, "No CD-Text or CD-Text unaware drive.\n");		scgp->silent++;	}}LOCAL voidprint_track(track, lba, msp, adr, control, mode)	int	track;	long	lba;	struct msf *msp;	int	adr;	int	control;	int	mode;{	long	lba_512 = lba*4;	if (track == 0xAA)		printf("track:lout ");	else		printf("track: %3d ", track);	printf("lba: %9ld (%9ld) %02d:%02d:%02d adr: %X control: %X mode: %d\n",			lba, lba_512,			msp->msf_min,			msp->msf_sec,			msp->msf_frame,			adr, control, mode);}LOCAL voidprtimediff(fmt, start, stop)	const	char	*fmt;	struct timeval	*start;	struct timeval	*stop;{	struct timeval tv;	tv.tv_sec = stop->tv_sec - start->tv_sec;	tv.tv_usec = stop->tv_usec - start->tv_usec;	while (tv.tv_usec > 1000000) {		tv.tv_usec -= 1000000;		tv.tv_sec += 1;	}	while (tv.tv_usec < 0) {		tv.tv_usec += 1000000;		tv.tv_sec -= 1;	}	/*	 * We need to cast timeval->* to long because	 * of the broken sys/time.h in Linux.	 */	printf("%s%4ld.%03lds\n", fmt, (long)tv.tv_sec, (long)tv.tv_usec/1000);	flush();}#ifdef	HAVE_SYS_PRIOCNTL_H#include <sys/procset.h>	/* Needed for SCO Openserver */#include <sys/priocntl.h>#include <sys/rtpriocntl.h>EXPORT	voidraisepri(pri)	int pri;{	int		pid;	int		classes;	int		ret;	pcinfo_t	info;	pcparms_t	param;	rtinfo_t	rtinfo;	rtparms_t	rtparam;	pid = getpid();	/* get info */	strcpy(info.pc_clname, "RT");	classes = priocntl(P_PID, pid, PC_GETCID, (void *)&info);	if (classes == -1)		comerr("Cannot get priority class id priocntl(PC_GETCID)\n");	movebytes(info.pc_clinfo, &rtinfo, sizeof(rtinfo_t)); 	/* set priority to max */	rtparam.rt_pri = rtinfo.rt_maxpri - pri;	rtparam.rt_tqsecs = 0;	rtparam.rt_tqnsecs = RT_TQDEF;	param.pc_cid = info.pc_cid;	movebytes(&rtparam, param.pc_clparms, sizeof(rtparms_t));	ret = priocntl(P_PID, pid, PC_SETPARMS, (void *)&param);	if (ret == -1) {		errmsg("WARNING: Cannot set priority class parameters priocntl(PC_SETPARMS)\n");		errmsgno(EX_BAD, "WARNING: This causes a high risk for buffer underruns.\n");	}}#else	/* HAVE_SYS_PRIOCNTL_H */#if defined(_POSIX_PRIORITY_SCHEDULING)/* * XXX Ugly but needed because of a typo in /usr/iclude/sched.h on Linux. * XXX This should be removed as soon as we are sure that Linux-2.0.29 is gone. */#ifdef	__linux#define	_P	__P#endif#include <sched.h>#ifdef	__linux#undef	_P#endifLOCAL	intrt_raisepri(pri)	int pri;{	struct sched_param scp;	/*	 * Verify that scheduling is available	 */#ifdef	_SC_PRIORITY_SCHEDULING	if (sysconf(_SC_PRIORITY_SCHEDULING) == -1) {		errmsg("WARNING: RR-scheduler not available, disabling.\n");		return(-1);	}#endif	fillbytes(&scp, sizeof(scp), '\0');	scp.sched_priority = sched_get_priority_max(SCHED_RR) - pri;	if (sched_setscheduler(0, SCHED_RR, &scp) < 0) {		errmsg("WARNING: Cannot set RR-scheduler\n");		return (-1);	}	return (0);}#else	/* _POSIX_PRIORITY_SCHEDULING */#ifdef	__CYGWIN32__/* * NOTE: Base.h has a second typedef for BOOL. *	 We define BOOL to make all local code use BOOL *	 from Windows.h and use the hidden __SBOOL for *	 our global interfaces. */#define	BOOL	WBOOL		/* This is the Win BOOL		*/#define	format	__format#include <vadefs.h>#include <Windows32/Base.h>#include <Windows32/Defines.h>#include <Windows32/Structures.h>#include <Windows32/Functions.h>#undef formatLOCAL	intrt_raisepri(pri)	int pri;{	/* set priority class */	if (SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS) == FALSE) {		errmsgno(EX_BAD, "No realtime priority class possible.\n");		return (-1);	}	/* set thread priority */	if (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL-pri) == FALSE) {		errmsgno(EX_BAD, "Could not set realtime priority.\n");		return (-1);	}	return (0);}#elseLOCAL	intrt_raisepri(pri)	int pri;{	return (-1);}#endif	/* __CYGWIN32__ */#endif	/* _POSIX_PRIORITY_SCHEDULING */EXPORT	voidraisepri(pri)	int pri;{	if (rt_raisepri(pri) >= 0)		return;#if	defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)	if (setpriority(PRIO_PROCESS, getpid(), -20 + pri) < 0) {		errmsg("WARNING: Cannot set priority using setpriority().\n");		errmsgno(EX_BAD, "WARNING: This causes a high risk for buffer underruns.\n");	}#else#ifdef	HAVE_DOSSETPRIORITY	/* RT priority on OS/2 */	/*	 * Set priority to timecritical 31 - pri (arg)	 */	DosSetPriority(0, 3, 31, 0);	DosSetPriority(0, 3, -pri, 0);#else#ifdef	HAVE_NICE	if (nice(-20 + pri) == -1) {		errmsg("WARNING: Cannot set priority using nice().\n");		errmsgno(EX_BAD, "WARNING: This causes a high risk for buffer underruns.\n");	}#else	errmsgno(EX_BAD, "WARNING: Cannot set priority on this OS.\n");	errmsgno(EX_BAD, "WARNING: This causes a high risk for buffer underruns.\n");#endif#endif#endif}#endif	/* HAVE_SYS_PRIOCNTL_H */LOCAL voidcheckgui(){	struct stat st;	if (fstat(STDERR_FILENO, &st) >= 0 && !S_ISCHR(st.st_mode)) {		isgui = TRUE;		if (lverbose > 1)			printf("Using remote (pipe) mode for interactive i/o.\n");	}}LOCAL char *astoll(s, ll)	register const char *s;        Llong *ll;{	char	*p;	long	l = 0;	p = astol(s, &l);	*ll = (Llong)l;	return (p);}LOCAL Llongnumber(arg, retp)	register char	*arg;		int	*retp;{	Llong	val	= 0;	if (*retp != 1)		return (val);	if (*arg == '\0') {		*retp = -1;	} else if (*(arg = astoll(arg, &val))) {		if (*arg == 'p' || *arg == 'P') {			val *= (1024*1024);			val *= (1024*1024*1024);			arg++;		}		if (*arg == 't' || *arg == 'T') {			val *= (1024*1024);			val *= (1024*1024);			arg++;		}		if (*arg == 'g' || *arg == 'G') {			val *= (1024*1024*1024);			arg++;		}		if (*arg == 'm' || *arg == 'M') {			val *= (1024*1024);			arg++;		}		else if (*arg == 'f' || *arg == 'F') {			val *= 2352;			arg++;		}		else if (*arg == 's' || *arg == 'S') {			val *= 2048;			arg++;		}		else if (*arg == 'k' || *arg == 'K') {			val *= 1024;			arg++;		}		else if (*arg == 'b' || *arg == 'B') {			val *= 512;			arg++;		}		else if (*arg == 'w' || *arg == 'W') {			val *= 2;			arg++;		}		if (*arg == '*' || *arg == 'x')			val *= number(++arg, retp);		else if (*arg != '\0')			*retp = -1;	}	return (val);}EXPORT intgetnum(arg, valp)	char	*arg;	long	*valp;{	int	ret = 1;	*valp = (long)number(arg, &ret);	return (ret);}EXPORT intgetllnum(arg, lvalp)	char	*arg;	Llong	*lvalp;{	int	ret = 1;	*lvalp = number(arg, &ret);	return (ret);}LOCAL intgetbltype(optstr, typep)	char	*optstr;	long	*typep;{	if (streql(optstr, "all")) {		*typep = BLANK_DISC;	} else if (streql(optstr, "disc")) {		*typep = BLANK_DISC;	} else if (streql(optstr, "disk")) {		*typep = BLANK_DISC;	} else if (streql(optstr, "fast")) {		*typep = BLANK_MINIMAL;	} else if (streql(optstr, "minimal")) {		*typep = BLANK_MINIMAL;	} else if (streql(optstr, "track")) {		*typep = BLANK_TRACK;	} else if (streql(optstr, "unreserve")) {		*typep = BLANK_UNRESERVE;	} else if (streql(optstr, "trtail")) {		*typep = BLANK_TAIL;	} else if (streql(optstr, "unclose")) {		*typep = BLANK_UNCLOSE;	} else if (streql(optstr, "session")) {		*typep = BLANK_SESSION;	} else if (streql(optstr, "help")) {		blusage(0);	} else {		error("Illegal blanking type '%s'.\n", optstr);		blusage(EX_BAD);		return (-1);	}	return (TRUE);}

⌨️ 快捷键说明

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