/** * Open a DVD image or block device file. * Checks if the root directory in the udf image file can be found. * If not it assumes this isn't a valid udf image and returns NULL */ static dvd_reader_t *DVDOpenImageFile( const char *location, int have_css ) { dvd_reader_t *dvd; dvd_input_t dev; int verbose; verbose = get_verbose(); dev = dvdinput_open( location ); if( !dev ) { if(verbose >= 1) { fprintf( stderr, "libdvdread: Can't open '%s' for reading: %s\n", location, strerror(errno)); } return NULL; } dvd = (dvd_reader_t *) malloc( sizeof( dvd_reader_t ) ); if( !dvd ) { int tmp_errno = errno; dvdinput_close(dev); errno = tmp_errno; return NULL; } dvd->verbose = verbose; dvd->isImageFile = 1; dvd->dev = dev; dvd->path_root = NULL; dvd->udfcache_level = DEFAULT_UDF_CACHE_LEVEL; dvd->udfcache = NULL; dvd->align = NULL; if( have_css ) { /* Only if DVDCSS_METHOD = title, a bit if it's disc or if * DVDCSS_METHOD = key but region missmatch. Unfortunaly we * don't have that information. */ dvd->css_state = 1; /* Need key init. */ } dvd->css_title = 0; /* sanity check, is it a valid UDF image, can we find the root dir */ if(!UDFFindFile(dvd, "/", NULL)) { dvdinput_close(dvd->dev); if(dvd->udfcache) { FreeUDFCache(dvd, dvd->udfcache); } if(dvd->align) { if(dvd->verbose >= 0) { fprintf(stderr, "libdvdread: DVDOpenImageFile(): Memory leak in align functions 1\n"); } } free(dvd); return NULL; } return dvd; }
void DVDClose( dvd_reader_t *dvd ) { if( dvd ) { if( dvd->dev ) dvdinput_close( dvd->dev ); if( dvd->path_root ) free( dvd->path_root ); if( dvd->udfcache ) FreeUDFCache( dvd->udfcache ); free( dvd ); } }
void DVDClose( dvd_reader_t *dvd ) { if( dvd ) { if( dvd->dev ) dvdinput_close( dvd->dev ); if( dvd->path_root ) free( dvd->path_root ); if( dvd->udfcache ) FreeUDFCache( dvd, dvd->udfcache ); if(dvd->align) { if(dvd->verbose >= 0) { fprintf(stderr, "libdvdread: DVDClose(): Memory leak in align functions\n"); } } free( dvd ); } }