📄 cdrecord.c
字号:
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 *)¶m); 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 + -