Package: dvdbackup
Version: 0.1.1-10

The attached patch makes it possible to read recent dvds which contains
half broken IFO and full broken BUP files.

Half broken IFO files: Wrong filesize in the UDF. Fixed by using
ifoOpen and the filesize from the open dvd file handle. libdvdread was
fixed recently to update that size to a sane value.

Full broken BUP files: Missing or completely bogus sizes/contents. Fixed
by always recreating it from the corresponding IFO file.

It have one problem. If the IFO file is in fact bogus in a way
libdvdread would reject it, it bails out.

Bastian

-- 
Many Myths are based on truth
                -- Spock, "The Way to Eden",  stardate 5832.3
diff -ur t/dvdbackup-0.1.1/src/dvdbackup.c dvdbackup-0.1.1/src/dvdbackup.c
--- t/dvdbackup-0.1.1/src/dvdbackup.c   2008-02-22 20:09:31.000000000 +0100
+++ dvdbackup-0.1.1/src/dvdbackup.c     2008-02-22 21:03:34.000000000 +0100
@@ -48,7 +48,6 @@
 typedef struct {
   int          size_ifo;
   int          size_menu;
-  int          size_bup;
   int          number_of_vob_files;
   int          size_vob[10];
 } title_set_t;
@@ -1252,7 +1251,7 @@
 int DVDCopyIfoBup (dvd_reader_t * dvd, title_set_info_t * title_set_info, int 
title_set, char * targetdir,char * title_name) {
 
        /* Temp filename,dirname */
-       char targetname[PATH_MAX];
+       char targetname_ifo[PATH_MAX], targetname_bup[PATH_MAX];
        struct stat fileinfo;
 
        /* Write buffer */
@@ -1261,12 +1260,12 @@
        unsigned char buffy; /* :-) */
 
        /* File Handler */
-       int streamout;
+       int streamout_ifo = -1, streamout_bup = -1;
 
-       int size;
+       int size, ret = 1;
 
        /* DVD handler */
-       dvd_file_t   *  dvd_file=NULL;
+       ifo_handle_t *  ifo_file = NULL;
 
 
        if (title_set_info->number_of_title_sets + 1 < title_set) {
@@ -1276,7 +1275,6 @@
        if (title_set_info->title_set[title_set].size_ifo == 0 ) {
                return(0);
        } else {
-               size = title_set_info->title_set[title_set].size_ifo;
                if (title_set_info->title_set[title_set].size_ifo%2048 != 0) {
                        fprintf(stderr, "The IFO of title set %d doesn't have a 
valid DVD size\n", title_set);
                        return(1);
@@ -1286,146 +1284,80 @@
        /* Create VIDEO_TS.IFO or VTS_XX_0.IFO */
 
        if (title_set == 0) {
-               sprintf(targetname,"%s/%s/VIDEO_TS/VIDEO_TS.IFO",targetdir, 
title_name);
+               sprintf(targetname_ifo,"%s/%s/VIDEO_TS/VIDEO_TS.IFO",targetdir, 
title_name);
+               sprintf(targetname_bup,"%s/%s/VIDEO_TS/VIDEO_TS.BUP",targetdir, 
title_name);
        } else {
-               sprintf(targetname,"%s/%s/VIDEO_TS/VTS_%02i_0.IFO",targetdir, 
title_name, title_set);
+               
sprintf(targetname_ifo,"%s/%s/VIDEO_TS/VTS_%02i_0.IFO",targetdir, title_name, 
title_set);
+               
sprintf(targetname_bup,"%s/%s/VIDEO_TS/VTS_%02i_0.BUP",targetdir, title_name, 
title_set);
        }
 
-       if (stat(targetname, &fileinfo) == 0) {
-               fprintf(stderr, "The IFO file %s exists will try to over write 
it.\n", targetname);
+       if (stat(targetname_ifo, &fileinfo) == 0) {
+               fprintf(stderr, "The IFO file %s exists will try to over write 
it.\n", targetname_ifo);
                if (! S_ISREG(fileinfo.st_mode)) {
-                       fprintf(stderr,"The IFO %s file is not valid, it may be 
a directory\n", targetname);
-                       return(1);
-               } else {
-                       if ((streamout = open(targetname, O_WRONLY | O_TRUNC, 
0666)) == -1) {
-                               fprintf(stderr, "Error opening %s\n", 
targetname);
-                               perror("");
-                               return(1);
-                       }
-               }
-       } else {
-               if ((streamout = open(targetname, O_WRONLY | O_CREAT, 0666)) == 
-1) {
-                       fprintf(stderr, "Error creating %s\n", targetname);
-                       perror("");
+                       fprintf(stderr,"The IFO %s file is not valid, it may be 
a directory\n", targetname_ifo);
                        return(1);
                }
        }
 
-       /* Copy VIDEO_TS.IFO, since it's a small file try to copy it in one 
shot */
-
-
-       if ((buffer = (unsigned char *)malloc(size * sizeof(buffy))) == NULL) {
-               fprintf(stderr, "Out of memory copying %s\n", targetname);
-               close(streamout);
-               return(1);
-       }
-
-
-       if ((dvd_file = DVDOpenFile(dvd, title_set, DVD_READ_INFO_FILE))== 0) {
-               fprintf(stderr, "Failed opening IFO for title set %d\n", 
title_set);
-               free(buffer);
-               close(streamout);
-               return(1);
-       }
-
-       if ( DVDReadBytes(dvd_file,buffer,size) != size) {
-               fprintf(stderr, "Error reading IFO for title set %d\n", 
title_set);
-               free(buffer);
-               DVDCloseFile(dvd_file);
-               close(streamout);
-               return(1);
+       if (stat(targetname_bup, &fileinfo) == 0) {
+               fprintf(stderr, "The BUP file %s exists will try to over write 
it.\n", targetname_bup);
+               if (! S_ISREG(fileinfo.st_mode)) {
+                       fprintf(stderr,"The BUP %s file is not valid, it may be 
a directory\n", targetname_bup);
+                       return(1);
+               }
        }
 
-       DVDCloseFile(dvd_file);
-
-       if (write(streamout,buffer,size) != size) {
-               fprintf(stderr, "Error writing %s\n",targetname);
-               free(buffer);
-               close(streamout);
-               return(1);
+       if ((streamout_ifo = open(targetname_ifo, O_WRONLY | O_CREAT | O_TRUNC, 
0666)) == -1) {
+               fprintf(stderr, "Error creating %s\n", targetname_ifo);
+               perror("");
+               goto error;
        }
 
-       free(buffer);
-       close(streamout);
-
-
-       /* Create VIDEO_TS.BUP or VTS_XX_0.BUP */
-
-       if (title_set == 0) {
-               sprintf(targetname,"%s/%s/VIDEO_TS/VIDEO_TS.BUP",targetdir, 
title_name);
-       } else {
-               sprintf(targetname,"%s/%s/VIDEO_TS/VTS_%02i_0.BUP",targetdir, 
title_name, title_set);
+       if ((streamout_bup = open(targetname_bup, O_WRONLY | O_CREAT | O_TRUNC, 
0666)) == -1) {
+               fprintf(stderr, "Error creating %s\n", targetname_bup);
+               perror("");
+               goto error;
        }
 
+       /* Copy VIDEO_TS.IFO, since it's a small file try to copy it in one 
shot */
 
-       if (title_set_info->title_set[title_set].size_bup == 0 ) {
-               return(0);
-       } else {
-               size = title_set_info->title_set[title_set].size_bup;
-               if (title_set_info->title_set[title_set].size_bup%2048 != 0) {
-                       fprintf(stderr, "The BUP of title set %d doesn't have a 
valid DVD size\n", title_set);
-                       return(1);
-               }
+       if ((ifo_file = ifoOpen(dvd, title_set))== 0) {
+               fprintf(stderr, "Failed opening IFO for title set %d\n", 
title_set);
+               goto error;
        }
 
+       size = DVDFileSize(ifo_file->file) * DVD_VIDEO_LB_LEN;
 
-       if (stat(targetname, &fileinfo) == 0) {
-               fprintf(stderr, "The BUP file %s exists will try to over write 
it.\n", targetname);
-               if (! S_ISREG(fileinfo.st_mode)) {
-                       fprintf(stderr,"The BUP %s file is not valid, it may be 
a directory\n", targetname);
-                       return(1);
-               } else {
-                       if ((streamout = open(targetname, O_WRONLY | O_TRUNC, 
0666)) == -1) {
-                               fprintf(stderr, "Error opening %s\n", 
targetname);
-                               perror("");
-                               return(1);
-                       }
-               }
-       } else {
-               if ((streamout = open(targetname, O_WRONLY | O_CREAT, 0666)) == 
-1) {
-                       fprintf(stderr, "Error creating %s\n", targetname);
-                       perror("");
-                       return(1);
-               }
+       if ((buffer = (unsigned char *)malloc(size * sizeof(buffy))) == NULL) {
+               perror("");
+               goto error;
        }
 
+       DVDFileSeek(ifo_file->file, 0);
 
-
-       /* Copy VIDEO_TS.BUP or VTS_XX_0.BUP, since it's a small file try to 
copy it in one shot */
-
-       if ((buffer = (unsigned char *)malloc(size * sizeof(buffy))) == NULL) {
-               fprintf(stderr, "Out of memory copying %s\n", targetname);
-               close(streamout);
-               return(1);
+       if (DVDReadBytes(ifo_file->file,buffer,size) != size) {
+               fprintf(stderr, "Error reading IFO for title set %d\n", 
title_set);
+               goto error;
        }
 
 
-       if ((dvd_file = DVDOpenFile(dvd, title_set, 
DVD_READ_INFO_BACKUP_FILE))== 0) {
-               fprintf(stderr, "Failed opening BUP for title set %d\n", 
title_set);
-               free(buffer);
-               close(streamout);
-               return(1);
+       if (write(streamout_ifo,buffer,size) != size) {
+               fprintf(stderr, "Error writing %s\n",targetname_ifo);
+               goto error;
        }
 
-       if ( DVDReadBytes(dvd_file,buffer,size) != size) {
-               fprintf(stderr, "Error reading BUP for title set %d\n", 
title_set);
-               free(buffer);
-               DVDCloseFile(dvd_file);
-               close(streamout);
-               return(1);
+       if (write(streamout_bup,buffer,size) != size) {
+               fprintf(stderr, "Error writing %s\n",targetname_bup);
+               goto error;
        }
 
-       DVDCloseFile(dvd_file);
-
-       if (write(streamout,buffer,size) != size) {
-               fprintf(stderr, "Error writing %s\n", targetname);
-               free(buffer);
-               close(streamout);
-               return(1);
-       }
+       ret = 0;
 
+error:
+       ifoClose(ifo_file);
        free(buffer);
-       close(streamout);
+       close(streamout_ifo);
+       close(streamout_bup);
 
        return(0);
 }
@@ -1659,21 +1591,6 @@
                title_set_info->title_set[0].size_menu = 0 ;
        }
 
-       /* Find VIDEO_TS.BUP if present */
-
-       if (DVDFileStat(_dvd, 0, DVD_READ_INFO_BACKUP_FILE, &statbuf) != -1) {
-               title_set_info->title_set[0].size_bup = statbuf.size;
-
-       } else {
-               DVDFreeTitleSetInfo(title_set_info);
-               return(0);
-       }
-
-       if (title_set_info->title_set[0].size_ifo != 
title_set_info->title_set[0].size_bup) {
-               fprintf(stderr,"BUP and IFO size not the same be warened!\n");
-       }
-
-
        /* Take care of the titles which we don't have in VMG */
 
        title_set_info->title_set[0].number_of_vob_files = 0;
@@ -1682,7 +1599,7 @@
 
        if ( verbose > 0 ){
                fprintf(stderr,"\n\n\nFile sizes for Title set 0 
VIDEO_TS.XXX\n");
-               fprintf(stderr,"IFO = %d, MENU_VOB = %d, BUP = 
%d\n",title_set_info->title_set[0].size_ifo, 
title_set_info->title_set[0].size_menu, title_set_info->title_set[0].size_bup );
+               fprintf(stderr,"IFO = %d, MENU_VOB = 
%d\n",title_set_info->title_set[0].size_ifo, 
title_set_info->title_set[0].size_menu);
 
        }
 
@@ -1737,31 +1654,12 @@
                        }
 
 
-                       if ( DVDFileStat(_dvd, counter + 1, 
DVD_READ_INFO_BACKUP_FILE, &statbuf) != -1) {
-                               title_set_info->title_set[counter + 1].size_bup 
= statbuf.size;
-                       } else {
-                               DVDFreeTitleSetInfo(title_set_info);
-                               return(0);
-                       }
-
-                       if (title_set_info->title_set[counter +1].size_ifo != 
title_set_info->title_set[counter + 1].size_bup) {
-                               fprintf(stderr,"BUP and IFO size for fileset %d 
is not the same be warened!\n", counter + 1);
-                       }
-
-
-
-                       if ( verbose > 1 ){
-                               fprintf(stderr,"After Menu Title BUP check\n");
-                       }
-
-
                        if ( verbose > 0 ) {
                                fprintf(stderr,"\n\n\nFile sizes for Title set 
%d i.e.VTS_%02d_X.XXX\n", counter + 1, counter + 1);
                                fprintf(stderr,"IFO: %d, MENU: %d\n", 
title_set_info->title_set[counter +1].size_ifo, 
title_set_info->title_set[counter +1].size_menu);
                                for (i = 0; i < 
title_set_info->title_set[counter + 1].number_of_vob_files ; i++) {
                                        fprintf(stderr, "VOB %d is %d\n", i + 
1, title_set_info->title_set[counter + 1].size_vob[i]);
                                }
-                               fprintf(stderr,"BUP: 
%d\n",title_set_info->title_set[counter +1].size_bup);
                        }
 
                        if ( verbose > 1 ){
@@ -2120,8 +2018,6 @@
                fprintf(stdout,"\tVIDEO_TS.VOB\t%i\n", 
title_set_info->title_set[0].size_menu);
        }
 
-       fprintf(stdout,"\tVIDEO_TS.BUP\t%i\n", 
title_set_info->title_set[0].size_bup);
-
        for( i = 0 ; i < title_set_info->number_of_title_sets ; i++) {
                fprintf(stdout,"\tVTS_%02i_0.IFO\t%i\n", i + 1, 
title_set_info->title_set[i + 1].size_ifo);
                if (title_set_info->title_set[i + 1].size_menu != 0 ) {
@@ -2132,7 +2028,6 @@
                                fprintf(stdout,"\tVTS_%02i_%i.VOB\t%i\n", i + 
1, f + 1, title_set_info->title_set[i + 1].size_vob[f]);
                        }
                }
-               fprintf(stdout,"\tVTS_%02i_0.BUP\t%i\n", i + 1, 
title_set_info->title_set[i + 1].size_bup);
        }
 
        fprintf(stdout,"\n\nMain feature:\n");

Attachment: signature.asc
Description: Digital signature

Reply via email to