📄 cdda.c
字号:
#include <scsi/all.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include "cdda.h"#define USAGE "usage: %s [-chvV] [-b blocks] [-m mode] dev file start [end]\n"#define OPTS "b:chm:vV"#define HELP USAGE "\%s\n\n\ -b: number of blocks read at once\n\ -h: display this help message and exit\n\ -m: specify mode to use\n\ -v: verbose\n\ -V: display version and exit\n\\n\start and end time syntax: track[/index] or [track/]mm:ss[:ff]\n\ end time defaults to end of track\n"char *modes[] = { "", "toshiba", "hp", "yamaha", NULL};char *prg;extern char version[];extern int opterr, optind;extern char *optarg;int main(int argc, char **argv){ int nblocks = 25, verbose = 0, checkonly = 0; char *device, *file, *st, *en; enum mode mode = m_unspec; SCSI *fd; FILE *fout; u_long start, end; int err, c, i; struct sc_inquiry inq; prg = argv[0]; /* process command line args */ opterr = 0; while ((c = getopt(argc, argv, OPTS)) != EOF) switch (c) { case 'v': verbose = 1; break; case 'c': checkonly = 1; break; case 'b': nblocks = atoi(optarg); break; case 'm': for (i=0; modes[i]; i++) if (!strcmp(modes[i], optarg)) { mode = i; break; } if (mode == m_unspec) { fprintf(stderr, "%s: unknown mode %s\n", prg, optarg); exit(1); } break; case 'V': printf("%s", version); exit(0); case 'h': printf(HELP, prg, version); exit(0); case '?': fprintf(stderr, USAGE, prg); exit(1); } if (optind != argc-3 && optind != argc-4) { fprintf(stderr, USAGE, prg); exit(1); } device = argv[optind]; file = argv[optind+1]; st = argv[optind+2]; en = (optind == argc-4 ? argv[optind+3] : NULL); /* open device */ if ((fd=sc_open(device)) == NULL) { fprintf(stderr, "%s: can't open device `%s': %s\n", prg, device, strerror(errno)); exit(1); } /* translate start and end time */ if ((start=translate(fd, st)) < 0 || (end=translate(fd, en)) < 0) { sc_close(fd); exit(1); } /* figure out mode to use */ if (mode == m_unspec) { if (sc_inquiry(fd, &inq) < 0) { sc_fstatus(fd, stderr, prg, "inquiry", 3); sc_close(fd); exit(1); } if (!strcmp(inq.vendor, "TOSHIBA")) mode = m_toshiba; else if (!strcmp(inq.vendor, "HP")) mode = m_hp; else if (!strcmp(inq.vendor, "YAMAHA")) mode = m_yamaha; else { fprintf(stderr, "%s: unrecognized cdrom (%s, %s)\n", prg, inq.vendor, inq.product); sc_close(fd); exit(1); } } /* verbose and check-only */ if (verbose || checkonly) { printf("using mode `%s', copying lba 0x%lx -- 0x%lx\n", modes[mode], start, end); if (checkonly) exit(0); } /* open file */ if ((fout=fopen(file, "w")) == NULL) { fprintf(stderr, "%s: can'to open file `%s': %s\n", prg, file, strerror(errno)); sc_close(fd); exit(1); } /* copy data */ err = do_read(mode, fd, fout, start, end, nblocks); /* cleanup and exit */ sc_close(fd); fclose(fout); exit(err ? 1 : 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -