2 #include "dvdcss/dvdcss.h"
4 static void usage(FILE *fp)
5 { fprintf(fp, "usage: %s [-b BADFILE] DEVICE\n", prog); }
7 static dvd_reader_t *dvd;
11 static const char *badfile;
13 static int check_vob(unsigned index, unsigned titlep)
15 secaddr start, end, pos, len;
16 char fn[MAXFNSZ], fn2[MAXFNSZ];
20 store_filename(fn, mkident(VOB, index, titlep));
21 start = UDFFindFile(dvd, fn, &len);
22 if (!start) return (0);
23 end = start + SECTORS(len);
25 if (dvdcss_seek(css, start, DVDCSS_SEEK_KEY) < 0) {
27 for (j = 2; j < 10; j++) {
28 store_filename(fn2, mkident(VOB, index, j));
29 pos = UDFFindFile(dvd, fn2, &len);
34 open_file_on_demand(badfile, &badfp, "uncracked video objects");
35 fprintf(badfp, "%"PRIuSEC" %"PRIuSEC" # %s\n", start, end, fn);
42 int main(int argc, char *argv[])
50 opt = getopt(argc, argv, "hb:"); if (opt < 0) break;
52 case 'h': usage(stderr); exit(0);
53 case 'b': badfile = optarg; break;
54 default: f |= f_bogus; break;
57 if (argc - optind != 1) f |= f_bogus;
58 if (f&f_bogus) { usage(stderr); exit(2); }
60 if (!badfile) badfp = stdout;
62 setlocale(LC_ALL, "");
63 progress_init(&progress);
65 if (open_dvd(argv[optind], O_RDONLY, 0, &dvd)) exit(2);
66 css = dvdcss_open(argv[optind]);
68 bail_syserr(errno, "failed to attach CSS machinery to `%s'",
71 for (j = 0; j < 100; j++) {
72 if (check_vob(j, 0)) rc = 1;
73 if (j && check_vob(j, 1)) rc = 1;
78 progress_free(&progress);
79 carefully_fclose(badfp, "uncracked objects file");