Mercurial > libdvdread4.hg
comparison dvd_reader.c @ 37:a57cd30a83bb src
modified DVDOpen() to use a unified DVDOpen_error label; patch by Erik Hovland
| author | nicodvb |
|---|---|
| date | Tue, 28 Apr 2009 13:19:51 +0000 |
| parents | 79c9b639bf9d |
| children | 9f1804080f76 |
comparison
equal
deleted
inserted
replaced
| 36:79c9b639bf9d | 37:a57cd30a83bb |
|---|---|
| 328 | 328 |
| 329 | 329 |
| 330 dvd_reader_t *DVDOpen( const char *ppath ) | 330 dvd_reader_t *DVDOpen( const char *ppath ) |
| 331 { | 331 { |
| 332 struct stat fileinfo; | 332 struct stat fileinfo; |
| 333 int ret, have_css; | 333 int ret, have_css, retval, cdir = 0; |
| 334 dvd_reader_t *ret_val = NULL; | 334 dvd_reader_t *ret_val = NULL; |
| 335 char *dev_name = NULL; | 335 char *dev_name = NULL; |
| 336 char *path; | 336 char *path = NULL, *new_path = NULL, *path_copy = NULL; |
| 337 | 337 |
| 338 #ifdef _MSC_VER | 338 #ifdef _MSC_VER |
| 339 int len; | 339 int len; |
| 340 #endif | 340 #endif |
| 341 | 341 |
| 342 if( ppath == NULL ) | 342 if( ppath == NULL ) |
| 343 return 0; | 343 goto DVDOpen_error; |
| 344 | 344 |
| 345 path = strdup(ppath); | 345 path = strdup(ppath); |
| 346 if( path == NULL ) | 346 if( path == NULL ) |
| 347 return 0; | 347 goto DVDOpen_error; |
| 348 | 348 |
| 349 /* Try to open libdvdcss or fall back to standard functions */ | 349 /* Try to open libdvdcss or fall back to standard functions */ |
| 350 have_css = dvdinput_setup(); | 350 have_css = dvdinput_setup(); |
| 351 | 351 |
| 352 #ifdef _MSC_VER | 352 #ifdef _MSC_VER |
| 372 } | 372 } |
| 373 | 373 |
| 374 /* If we can't stat the file, give up */ | 374 /* If we can't stat the file, give up */ |
| 375 fprintf( stderr, "libdvdread: Can't stat %s\n", path ); | 375 fprintf( stderr, "libdvdread: Can't stat %s\n", path ); |
| 376 perror(""); | 376 perror(""); |
| 377 free(path); | 377 goto DVDOpen_error; |
| 378 return NULL; | |
| 379 } | 378 } |
| 380 | 379 |
| 381 /* First check if this is a block/char device or a file*/ | 380 /* First check if this is a block/char device or a file*/ |
| 382 if( S_ISBLK( fileinfo.st_mode ) || | 381 if( S_ISBLK( fileinfo.st_mode ) || |
| 383 S_ISCHR( fileinfo.st_mode ) || | 382 S_ISCHR( fileinfo.st_mode ) || |
| 397 free(path); | 396 free(path); |
| 398 return ret_val; | 397 return ret_val; |
| 399 | 398 |
| 400 } else if( S_ISDIR( fileinfo.st_mode ) ) { | 399 } else if( S_ISDIR( fileinfo.st_mode ) ) { |
| 401 dvd_reader_t *auth_drive = 0; | 400 dvd_reader_t *auth_drive = 0; |
| 402 char *path_copy; | |
| 403 #if defined(SYS_BSD) | 401 #if defined(SYS_BSD) |
| 404 struct fstab* fe; | 402 struct fstab* fe; |
| 405 #elif defined(__sun) || defined(__linux__) | 403 #elif defined(__sun) || defined(__linux__) |
| 406 FILE *mntfile; | 404 FILE *mntfile; |
| 407 #endif | 405 #endif |
| 408 | 406 |
| 409 /* XXX: We should scream real loud here. */ | 407 /* XXX: We should scream real loud here. */ |
| 410 if( !(path_copy = strdup( path ) ) ) { | 408 if( !(path_copy = strdup( path ) ) ) |
| 411 free(path); | 409 goto DVDOpen_error; |
| 412 return NULL; | |
| 413 } | |
| 414 | 410 |
| 415 #ifndef WIN32 /* don't have fchdir, and getcwd( NULL, ... ) is strange */ | 411 #ifndef WIN32 /* don't have fchdir, and getcwd( NULL, ... ) is strange */ |
| 416 /* Also WIN32 does not have symlinks, so we don't need this bit of code. */ | 412 /* Also WIN32 does not have symlinks, so we don't need this bit of code. */ |
| 417 | 413 |
| 418 /* Resolve any symlinks and get the absolute dir name. */ | 414 /* Resolve any symlinks and get the absolute dir name. */ |
| 419 { | 415 { |
| 420 char *new_path; | 416 if( ( cdir = open( ".", O_RDONLY ) ) >= 0 ) { |
| 421 int cdir = open( ".", O_RDONLY ); | 417 if( chdir( path_copy ) == -1 ) { |
| 422 | 418 goto DVDOpen_error; |
| 423 if( cdir >= 0 ) { | 419 } |
| 424 chdir( path_copy ); | |
| 425 new_path = malloc(PATH_MAX+1); | 420 new_path = malloc(PATH_MAX+1); |
| 426 if(!new_path) { | 421 if(!new_path) { |
| 427 free(path); | 422 goto DVDOpen_error; |
| 428 return NULL; | |
| 429 } | 423 } |
| 430 getcwd(new_path, PATH_MAX ); | 424 if( getcwd( new_path, PATH_MAX ) == NULL ) { |
| 431 fchdir( cdir ); | 425 goto DVDOpen_error; |
| 426 } | |
| 427 retval = fchdir( cdir ); | |
| 432 close( cdir ); | 428 close( cdir ); |
| 433 free( path_copy ); | 429 cdir = -1; |
| 434 path_copy = new_path; | 430 if( retval == -1 ) { |
| 431 goto DVDOpen_error; | |
| 432 } | |
| 433 path_copy = new_path; | |
| 434 new_path = NULL; | |
| 435 } | 435 } |
| 436 } | 436 } |
| 437 #endif | 437 #endif |
| 438 | 438 |
| 439 /** | 439 /** |
| 525 "CSS authentication not available.\n", dev_name ); | 525 "CSS authentication not available.\n", dev_name ); |
| 526 } | 526 } |
| 527 #endif | 527 #endif |
| 528 | 528 |
| 529 free( dev_name ); | 529 free( dev_name ); |
| 530 dev_name = NULL; | |
| 530 free( path_copy ); | 531 free( path_copy ); |
| 532 path_copy = NULL; | |
| 531 | 533 |
| 532 /** | 534 /** |
| 533 * If we've opened a drive, just use that. | 535 * If we've opened a drive, just use that. |
| 534 */ | 536 */ |
| 535 if( auth_drive ) { | 537 if( auth_drive ) { |
| 542 ret_val = DVDOpenPath( path ); | 544 ret_val = DVDOpenPath( path ); |
| 543 free( path ); | 545 free( path ); |
| 544 return ret_val; | 546 return ret_val; |
| 545 } | 547 } |
| 546 | 548 |
| 549 DVDOpen_error: | |
| 547 /* If it's none of the above, screw it. */ | 550 /* If it's none of the above, screw it. */ |
| 548 fprintf( stderr, "libdvdread: Could not open %s\n", path ); | 551 fprintf( stderr, "libdvdread: Could not open %s\n", path ); |
| 552 if( path != NULL ) | |
| 549 free( path ); | 553 free( path ); |
| 554 if ( path_copy != NULL ) | |
| 555 free( path_copy ); | |
| 556 if ( cdir >= 0 ) | |
| 557 close( cdir ); | |
| 558 if ( new_path != NULL ) | |
| 559 free( new_path ); | |
| 550 return NULL; | 560 return NULL; |
| 551 } | 561 } |
| 552 | 562 |
| 553 void DVDClose( dvd_reader_t *dvd ) | 563 void DVDClose( dvd_reader_t *dvd ) |
| 554 { | 564 { |
