Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/dvdrip
[dvdrip] / dvd-check-keys.c
CommitLineData
39eec43e
MW
1#include "lib.h"
2#include "dvdcss/dvdcss.h"
3
4static void usage(FILE *fp)
5 { fprintf(fp, "usage: %s [-b BADFILE] DEVICE\n", prog); }
6
7static dvd_reader_t *dvd;
8static dvdcss_t css;
9
10static FILE *badfp;
11static const char *badfile;
12
13static 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
42int 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}