Commit | Line | Data |
---|---|---|
39eec43e MW |
1 | #include "lib.h" |
2 | #include "dvdcss/dvdcss.h" | |
3 | ||
4 | static void usage(FILE *fp) | |
5 | { fprintf(fp, "usage: %s [-b BADFILE] DEVICE\n", prog); } | |
6 | ||
7 | static dvd_reader_t *dvd; | |
8 | static dvdcss_t css; | |
9 | ||
10 | static FILE *badfp; | |
11 | static const char *badfile; | |
12 | ||
13 | static int check_vob(unsigned index, unsigned titlep) | |
14 | { | |
15 | secaddr start, end, pos, len; | |
16 | char fn[MAXFNSZ], fn2[MAXFNSZ]; | |
17 | unsigned j; | |
18 | int rc = 0; | |
19 | ||
20 | store_filename(fn, mkident(VOB, index, titlep)); | |
21 | start = UDFFindFile(dvd, fn, &len); | |
22 | if (!start) return (0); | |
23 | end = start + SECTORS(len); | |
24 | ||
25 | if (dvdcss_seek(css, start, DVDCSS_SEEK_KEY) < 0) { | |
26 | if (titlep) | |
27 | for (j = 2; j < 10; j++) { | |
28 | store_filename(fn2, mkident(VOB, index, j)); | |
29 | pos = UDFFindFile(dvd, fn2, &len); | |
30 | if (!pos) break; | |
31 | assert(pos == end); | |
32 | end += SECTORS(len); | |
33 | } | |
34 | open_file_on_demand(badfile, &badfp, "uncracked video objects"); | |
35 | fprintf(badfp, "%"PRIuSEC" %"PRIuSEC" # %s\n", start, end, fn); | |
36 | rc = -1; | |
37 | } | |
38 | ||
39 | return (rc); | |
40 | } | |
41 | ||
42 | int main(int argc, char *argv[]) | |
43 | { | |
44 | int opt, rc = 0; | |
45 | unsigned j, f = 0; | |
46 | #define f_bogus 1u | |
47 | ||
48 | set_prog(argv[0]); | |
49 | for (;;) { | |
50 | opt = getopt(argc, argv, "hb:"); if (opt < 0) break; | |
51 | switch (opt) { | |
52 | case 'h': usage(stderr); exit(0); | |
53 | case 'b': badfile = optarg; break; | |
54 | default: f |= f_bogus; break; | |
55 | } | |
56 | } | |
57 | if (argc - optind != 1) f |= f_bogus; | |
58 | if (f&f_bogus) { usage(stderr); exit(2); } | |
59 | ||
60 | if (!badfile) badfp = stdout; | |
61 | ||
62 | setlocale(LC_ALL, ""); | |
63 | progress_init(&progress); | |
64 | ||
972381af | 65 | open_dvd(argv[optind], O_RDONLY, 0, &dvd); |
39eec43e MW |
66 | css = dvdcss_open(argv[optind]); |
67 | if (!css) | |
68 | bail_syserr(errno, "failed to attach CSS machinery to `%s'", | |
69 | argv[optind]); | |
70 | ||
71 | for (j = 0; j < 100; j++) { | |
72 | if (check_vob(j, 0)) rc = 1; | |
73 | if (j && check_vob(j, 1)) rc = 1; | |
74 | } | |
75 | ||
76 | dvdcss_close(css); | |
77 | DVDClose(dvd); | |
78 | progress_free(&progress); | |
79 | carefully_fclose(badfp, "uncracked objects file"); | |
80 | return (rc); | |
81 | } |