📄 cdrecord.c
字号:
usage(EX_BAD); } if (*flagsp & (F_LOAD|F_MSINFO|F_TOC|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;}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(dp) cdr_t *dp;{ int code; int key; /* * Do some preparation before... */ silent++; /* Be quiet if this fails */ test_unit_ready(); /* First eat up unit attention */ (*dp->cdr_load)(); /* now try to load media and */ scsi_start_stop_unit(1, 0); /* start unit in silent mode */ silent--; if (!wait_unit_ready(60)) { code = scsi_sense_code(); key = scsi_sense_key(); scsi_prevent_removal(0);/* In case someone locked it */ 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"); } scsi_prevent_removal(1); scsi_start_stop_unit(1, 0); wait_unit_ready(120); silent++; rezero_unit(); /* Is this needed? Not supported by some drvives */ silent--; test_unit_ready(); scsi_start_stop_unit(1, 0); wait_unit_ready(120);}EXPORT voidunload_media(dp, flags) cdr_t *dp; int flags;{ scsi_prevent_removal(0); if ((flags & F_EJECT) != 0) (*dp->cdr_unload)();}LOCAL voidcheck_recovery(dp, flags) cdr_t *dp; int flags;{ if ((*dp->cdr_check_recovery)()) { errmsgno(EX_BAD, "Recovery needed.\n"); unload_media(dp, flags); exit(EX_BAD); }}#define DEBUGvoid audioread(dp, flags) cdr_t *dp; int flags;{#ifdef DEBUG int speed = 1; int dummy = 0;extern struct scsi_capacity cap; if ((*dp->cdr_set_speed_dummy)(speed, dummy) < 0) exit(-1); if ((*dp->cdr_set_secsize)(2352) < 0) exit(-1); cap.c_bsize = 2352; read_scsi(buf, 1000, 1); printf("XXX:\n"); write(1, buf, 512); unload_media(dp, flags); exit(0);#endif}LOCAL voidprint_msinfo(dp) cdr_t *dp;{ long off; long fa; if ((*dp->cdr_session_offset)(&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(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(dp) cdr_t *dp;{ int first; int last; long lba; long xlba; struct msf msf; int adr; int control; int mode; int i; silent++; if (read_capacity() < 0) { silent--; errmsgno(EX_BAD, "Cannot read capacity\n"); return; } silent--; if (read_tochdr(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(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(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);}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);}#ifdef HAVE_SYS_PRIOCNTL_H#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) comerr("Cannot set priority class parameters priocntl(PC_SETPARMS)\n");}#else /* HAVE_SYS_PRIOCNTL_H */#if defined(_POSIX_PRIORITY_SCHEDULING)#include <sched.h>LOCAL 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);}#elseLOCAL intrt_raisepri(pri) int pri;{ return (-1);}#endifEXPORT voidraisepri(pri) int pri;{ if (rt_raisepri(pri) >= 0) return;#ifdef PRIO_PROCESS if (setpriority(PRIO_PROCESS, getpid(), -20 + pri) < 0) comerr("Cannot set priority.\n");#else errmsgno(EX_BAD, "Cannot set priority on this OS.\n");#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 + -