chiark / gitweb /
dvdrip-retry-botched-vobs: Delete the retry file correctly.
[dvdrip] / dvd-check-keys.c
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
65   open_dvd(argv[optind], 0, &dvd);
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 }