r31883 - in trunk/libdvdcss: css.c css.h libdvdcss.c
Author: reimar Date: Sun Aug 1 15:52:17 2010 New Revision: 31883 Log: Handle failing ioctls more gracefully for dvdcss. Also set b_scrambled and b_ioctls in the dvdcss_test function instead of both in and outside it and in case of b_scrambled forgetting to set it half of the time. Modified: trunk/libdvdcss/css.c trunk/libdvdcss/css.h trunk/libdvdcss/libdvdcss.c Modified: trunk/libdvdcss/css.c ============================================================================== --- trunk/libdvdcss/css.c Sun Aug 1 15:30:26 2010 (r31882) +++ trunk/libdvdcss/css.c Sun Aug 1 15:52:17 2010 (r31883) @@ -90,57 +90,48 @@ static int AttackPadding ( uint8_t co /***************************************************************************** * _dvdcss_test: check if the disc is encrypted or not ***************************************************************************** - * Return values: - * 1: DVD is scrambled but can be read - * 0: DVD is not scrambled and can be read - * -1: could not get "copyright" information - * -3: drive is RPC-II, region is not set, and DVD is scrambled: the RPC - * scheme will prevent us from reading the scrambled data + * Sets b_scrambled, b_ioctl *****************************************************************************/ -int _dvdcss_test( dvdcss_t dvdcss ) +void _dvdcss_test( dvdcss_t dvdcss ) { char const *psz_type, *psz_rpc; int i_ret, i_copyright, i_type, i_mask, i_rpc; i_ret = ioctl_ReadCopyright( dvdcss->i_fd, 0 /* i_layer */, &i_copyright ); -#ifdef WIN32 if( i_ret < 0 ) { /* Maybe we didn't have enough privileges to read the copyright * (see ioctl_ReadCopyright comments). * Apparently, on unencrypted DVDs _dvdcss_disckey() always fails, so * we can check this as a workaround. */ +#ifdef WIN32 i_ret = 0; +#else + /* Since it's the first ioctl we try to issue, we add a notice */ + print_error( dvdcss, "css error: could not get \"copyright\"" + " information, make sure there is a DVD in the drive," + " and that you have used the correct device node." ); + /* Try without ioctls */ + dvdcss->b_ioctls = 0; +#endif i_copyright = 1; if( _dvdcss_disckey( dvdcss ) < 0 ) { i_copyright = 0; } } -#endif - - if( i_ret < 0 ) - { - /* Since it's the first ioctl we try to issue, we add a notice */ - print_error( dvdcss, "css error: could not get \"copyright\"" - " information, make sure there is a DVD in the drive," - " and that you have used the correct device node." ); - - return -1; - } print_debug( dvdcss, "disc reports copyright information 0x%x", i_copyright ); + dvdcss->b_scrambled = i_copyright; i_ret = ioctl_ReportRPC( dvdcss->i_fd, &i_type, &i_mask, &i_rpc); if( i_ret < 0 ) { - print_error( dvdcss, "css error: could not get RPC status" ); - // do not return an error, the drive might be a region-free one - // and we definitely should not just fail for that case. - return i_copyright ? 1 : 0; + print_error( dvdcss, "css error: could not get RPC status, region-free drive?" ); + return; } switch( i_rpc ) @@ -166,10 +157,7 @@ int _dvdcss_test( dvdcss_t dvdcss ) { print_error( dvdcss, "css error: drive will prevent access to " "scrambled data" ); - return -3; } - - return i_copyright ? 1 : 0; } /***************************************************************************** Modified: trunk/libdvdcss/css.h ============================================================================== --- trunk/libdvdcss/css.h Sun Aug 1 15:30:26 2010 (r31882) +++ trunk/libdvdcss/css.h Sun Aug 1 15:52:17 2010 (r31883) @@ -48,7 +48,7 @@ typedef struct css_s /***************************************************************************** * Prototypes in css.c *****************************************************************************/ -int _dvdcss_test ( dvdcss_t ); +void _dvdcss_test ( dvdcss_t ); int _dvdcss_title ( dvdcss_t, int ); int _dvdcss_disckey ( dvdcss_t ); int _dvdcss_titlekey ( dvdcss_t, int , dvd_key_t ); Modified: trunk/libdvdcss/libdvdcss.c ============================================================================== --- trunk/libdvdcss/libdvdcss.c Sun Aug 1 15:30:26 2010 (r31882) +++ trunk/libdvdcss/libdvdcss.c Sun Aug 1 15:52:17 2010 (r31883) @@ -366,27 +366,7 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( if( dvdcss->b_ioctls ) { - i_ret = _dvdcss_test( dvdcss ); - - if( i_ret == -3 ) - { - print_debug( dvdcss, "scrambled disc on a region-free RPC-II " - "drive: possible failure, but continuing " - "anyway" ); - } - else if( i_ret < 0 ) - { - /* Disable the CSS ioctls and hope that it works? */ - print_debug( dvdcss, - "could not check whether the disc was scrambled" ); - dvdcss->b_ioctls = 0; - } - else - { - print_debug( dvdcss, i_ret ? "disc is scrambled" - : "disc is unscrambled" ); - dvdcss->b_scrambled = i_ret; - } + _dvdcss_test( dvdcss ); } /* If disc is CSS protected and the ioctls work, authenticate the drive */
On Sun, Aug 01, 2010 at 03:52:17PM +0200, reimar wrote:
Log: Handle failing ioctls more gracefully for dvdcss. Also set b_scrambled and b_ioctls in the dvdcss_test function instead of both in and outside it and in case of b_scrambled forgetting to set it half of the time.
Please don't just patch our libdvdcss fork, go through upstream. libdvdcss is actively maintained and we should really drop our local copy. This also appears to change API, so I'm not sure it is acceptable upstream... Diego
On Sun, Aug 01, 2010 at 10:28:39PM +0200, Diego Biurrun wrote:
This also appears to change API, so I'm not sure it is acceptable upstream...
No, that's only internal API, the external API headers are all in dvdcss.
participants (3)
-
Diego Biurrun -
reimar -
Reimar Döffinger