From 16981ff52062d1deaaa65078c62dee325dac8879 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 7 Jun 2009 22:34:52 +0200 Subject: [PATCH] various patches to libdvdcss --- .../libdvdcss/patches/05_fuseiso_compat.diff | 12 + .../multimedia/libdvdcss/patches/20_git.diff | 409 ++++++++++++++++++ 2 files changed, 421 insertions(+) create mode 100644 packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff create mode 100644 packages/multimedia/libdvdcss/patches/20_git.diff diff --git a/packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff b/packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff new file mode 100644 index 0000000000..22e9f9611b --- /dev/null +++ b/packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff @@ -0,0 +1,12 @@ +diff -Nurp libdvdcss-1.2.9.orig/src/libdvdcss.c libdvdcss-1.2.9/src/libdvdcss.c +--- libdvdcss-1.2.9.orig/src/libdvdcss.c 2004-08-13 21:40:18.000000000 +0800 ++++ libdvdcss-1.2.9/src/libdvdcss.c 2008-07-02 00:09:24.000000000 +0800 +@@ -417,7 +417,7 @@ extern dvdcss_t dvdcss_open ( char *psz_ + } + + if( p_sector[0] == 0x00 && p_sector[1] == 0x00 +- && p_sector[2] == 0x01 && p_sector[3] == 0xba ) ++ && p_sector[2] == 0x01 && p_sector[3] == 0xba || !strncmp(p_sector,"DVDVIDEO",8)) + { + goto nocache; + } diff --git a/packages/multimedia/libdvdcss/patches/20_git.diff b/packages/multimedia/libdvdcss/patches/20_git.diff new file mode 100644 index 0000000000..2cd226088e --- /dev/null +++ b/packages/multimedia/libdvdcss/patches/20_git.diff @@ -0,0 +1,409 @@ +--- a/src/css.c 2008-08-30 02:42:47.000000000 +0800 ++++ b/src/css.c 2009-05-26 20:25:07.000000000 +0800 +@@ -89,10 +89,19 @@ 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 ++ * -2: could not get RPC information (reading the disc might be possible) ++ * -3: drive is RPC-II, region is not set, and DVD is scrambled: the RPC ++ * scheme will prevent us from reading the scrambled data + *****************************************************************************/ + int _dvdcss_test( dvdcss_t dvdcss ) + { +- int i_ret, i_copyright; ++ 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 ); + +@@ -115,14 +124,51 @@ int _dvdcss_test( dvdcss_t dvdcss ) + if( i_ret < 0 ) + { + /* Since it's the first ioctl we try to issue, we add a notice */ +- print_error( dvdcss, "css error: ioctl_ReadCopyright failed, " +- "make sure there is a DVD in the drive, and that " +- "you have used the correct device node." ); ++ 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 ); ++ ++ 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" ); ++ return -2; ++ } + +- return i_ret; ++ switch( i_rpc ) ++ { ++ case 0: psz_rpc = "RPC-I"; break; ++ case 1: psz_rpc = "RPC-II"; break; ++ default: psz_rpc = "unknown RPC scheme"; break; ++ } ++ ++ switch( i_type ) ++ { ++ case 0: psz_type = "no region code set"; break; ++ case 1: psz_type = "region code set"; break; ++ case 2: psz_type = "one region change remaining"; break; ++ case 3: psz_type = "region code set permanently"; break; ++ default: psz_type = "unknown status"; break; ++ } ++ ++ print_debug( dvdcss, "drive region mask 0x%x, %s, %s", ++ i_mask, psz_rpc, psz_type ); ++ ++ if( i_copyright && i_rpc == 1 && i_type == 0 ) ++ { ++ print_error( dvdcss, "css error: drive will prevent access to " ++ "scrambled data" ); ++ return -3; + } + +- return i_copyright; ++ return i_copyright ? 1 : 0; + } + + /***************************************************************************** +--- a/src/device.c 2008-07-13 20:25:49.000000000 +0800 ++++ b/src/device.c 2009-05-26 20:25:07.000000000 +0800 +@@ -65,6 +65,12 @@ + # include + #endif + ++#ifdef SYS_OS2 ++# define INCL_DOS ++# define INCL_DOSDEVIOCTL ++# include ++#endif ++ + #include "dvdcss/dvdcss.h" + + #include "common.h" +@@ -91,6 +97,12 @@ static int aspi_read ( dvdcss_t, void * + static int win_readv ( dvdcss_t, struct iovec *, int ); + + static int aspi_read_internal ( int, void *, int ); ++#elif defined( SYS_OS2 ) ++static int os2_open ( dvdcss_t, char const * ); ++/* just use macros for libc */ ++# define os2_seek libc_seek ++# define os2_read libc_read ++# define os2_readv libc_readv + #endif + + int _dvdcss_use_ioctls( dvdcss_t dvdcss ) +@@ -110,6 +122,16 @@ int _dvdcss_use_ioctls( dvdcss_t dvdcss + { + return 1; + } ++#elif defined( SYS_OS2 ) ++ ULONG ulMode; ++ ++ if( DosQueryFHState( dvdcss->i_fd, &ulMode ) != 0 ) ++ return 1; /* What to do? Be conservative and try to use the ioctls */ ++ ++ if( ulMode & OPEN_FLAGS_DASD ) ++ return 1; ++ ++ return 0; + #else + struct stat fileinfo; + int ret; +@@ -157,6 +179,28 @@ void _dvdcss_check ( dvdcss_t dvdcss ) + kern_return_t kern_result; + io_iterator_t media_iterator; + CFMutableDictionaryRef classes_to_match; ++#elif defined( SYS_OS2 ) ++#pragma pack( 1 ) ++ struct ++ { ++ BYTE bCmdInfo; ++ BYTE bDrive; ++ } param; ++ ++ struct ++ { ++ BYTE abEBPB[31]; ++ USHORT usCylinders; ++ BYTE bDevType; ++ USHORT usDevAttr; ++ } data; ++#pragma pack() ++ ++ ULONG ulParamLen; ++ ULONG ulDataLen; ++ ULONG rc; ++ ++ int i; + #else + char *ppsz_devices[] = { "/dev/dvd", "/dev/cdrom", "/dev/hdc", NULL }; + int i, i_fd; +@@ -270,6 +314,32 @@ void _dvdcss_check ( dvdcss_t dvdcss ) + } + + IOObjectRelease( media_iterator ); ++#elif defined( SYS_OS2 ) ++ for( i = 0; i < 26; i++ ) ++ { ++ param.bCmdInfo = 0; ++ param.bDrive = i; ++ ++ rc = DosDevIOCtl( ( HFILE )-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, ++ ¶m, sizeof( param ), &ulParamLen, ++ &data, sizeof( data ), &ulDataLen ); ++ ++ if( rc == 0 ) ++ { ++ /* Check for removable and for cylinders */ ++ if( ( data.usDevAttr & 1 ) == 0 && data.usCylinders == 0xFFFF ) ++ { ++ char psz_dvd[] = "A:"; ++ ++ psz_dvd[0] += i; ++ ++ print_debug( dvdcss, "defaulting to drive `%s'", psz_dvd ); ++ free( dvdcss->psz_device ); ++ dvdcss->psz_device = strdup( psz_dvd ); ++ return; ++ } ++ } ++ } + #else + for( i = 0; ppsz_devices[i]; i++ ) + { +@@ -322,6 +392,18 @@ int _dvdcss_open ( dvdcss_t dvdcss ) + return aspi_open( dvdcss, psz_device ); + } + else ++#elif defined( SYS_OS2 ) ++ /* If device is "X:" or "X:\", we are not actually opening a file. */ ++ if( psz_device[0] && psz_device[1] == ':' && ++ ( !psz_device[2] || ( psz_device[2] == '\\' && !psz_device[3] ) ) ) ++ { ++ print_debug( dvdcss, "using OS2 API for access" ); ++ dvdcss->pf_seek = os2_seek; ++ dvdcss->pf_read = os2_read; ++ dvdcss->pf_readv = os2_readv; ++ return os2_open( dvdcss, psz_device ); ++ } ++ else + #endif + { + print_debug( dvdcss, "using libc for access" ); +@@ -332,7 +414,7 @@ int _dvdcss_open ( dvdcss_t dvdcss ) + } + } + +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + int _dvdcss_raw_open ( dvdcss_t dvdcss, char const *psz_device ) + { + dvdcss->i_raw_fd = open( psz_device, 0 ); +@@ -385,11 +467,13 @@ int _dvdcss_close ( dvdcss_t dvdcss ) + #else + close( dvdcss->i_fd ); + ++#ifndef SYS_OS2 + if( dvdcss->i_raw_fd >= 0 ) + { + close( dvdcss->i_raw_fd ); + dvdcss->i_raw_fd = -1; + } ++#endif + + return 0; + #endif +@@ -402,7 +486,7 @@ int _dvdcss_close ( dvdcss_t dvdcss ) + *****************************************************************************/ + static int libc_open ( dvdcss_t dvdcss, char const *psz_device ) + { +-#if !defined( WIN32 ) ++#if !defined( WIN32 ) && !defined( SYS_OS2 ) + dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, 0 ); + #else + dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, O_BINARY ); +@@ -578,6 +662,35 @@ static int aspi_open( dvdcss_t dvdcss, c + } + #endif + ++#ifdef SYS_OS2 ++static int os2_open ( dvdcss_t dvdcss, char const *psz_device ) ++{ ++ char psz_dvd[] = "X:"; ++ HFILE hfile; ++ ULONG ulAction; ++ ULONG rc; ++ ++ psz_dvd[0] = psz_device[0]; ++ ++ rc = DosOpen( ( PSZ )psz_dvd, &hfile, &ulAction, 0, FILE_NORMAL, ++ OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, ++ OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, ++ NULL ); ++ ++ if( rc ) ++ { ++ print_error( dvdcss, "failed to open device" ); ++ return -1; ++ } ++ ++ dvdcss->i_fd = dvdcss->i_read_fd = hfile; ++ ++ dvdcss->i_pos = 0; ++ ++ return 0; ++} ++#endif ++ + /***************************************************************************** + * Seek commands. + *****************************************************************************/ +--- a/src/device.h 2008-08-30 02:39:44.000000000 +0800 ++++ b/src/device.h 2009-05-26 20:25:07.000000000 +0800 +@@ -52,7 +52,7 @@ int _dvdcss_close ( dvdcss_t ); + /***************************************************************************** + * Device reading prototypes, raw-device specific + *****************************************************************************/ +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + int _dvdcss_raw_open ( dvdcss_t, char const * ); + #endif + +--- a/src/libdvdcss.c 2008-08-30 02:41:51.000000000 +0800 ++++ b/src/libdvdcss.c 2009-05-26 20:25:07.000000000 +0800 +@@ -166,9 +173,10 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + char *psz_method = getenv( "DVDCSS_METHOD" ); + char *psz_verbose = getenv( "DVDCSS_VERBOSE" ); + char *psz_cache = getenv( "DVDCSS_CACHE" ); +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" ); + #endif ++ char *psz_ignore_rpc = getenv( "DVDCSS_IGNORE_RPC" ); + + dvdcss_t dvdcss; + +@@ -184,7 +192,7 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + /* + * Initialize structure with default values + */ +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + dvdcss->i_raw_fd = -1; + #endif + dvdcss->p_titles = NULL; +@@ -194,6 +202,7 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + dvdcss->psz_cachefile[0] = '\0'; + dvdcss->b_debug = 0; + dvdcss->b_errors = 0; ++ dvdcss->b_ignore_rpc = 0; + + /* + * Find verbosity from DVDCSS_VERBOSE environment variable +@@ -306,7 +315,25 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + /* Cache our keys in ${HOME}/.dvdcss/ */ + if( psz_home ) + { +- snprintf( psz_buffer, PATH_MAX, "%s/.dvdcss", psz_home ); ++ int home_pos = 0; ++ ++#ifdef SYS_OS2 ++ if( *psz_home == '/' || *psz_home == '\\') ++ { ++ char *psz_unixroot = getenv("UNIXROOT"); ++ ++ if( psz_unixroot && ++ psz_unixroot[0] && ++ psz_unixroot[1] == ':' && ++ psz_unixroot[2] == '\0') ++ { ++ strcpy( psz_buffer, psz_unixroot ); ++ home_pos = 2; ++ } ++ } ++#endif ++ snprintf( psz_buffer + home_pos, PATH_MAX - home_pos, ++ "%s/.dvdcss", psz_home ); + psz_buffer[PATH_MAX-1] = '\0'; + psz_cache = psz_buffer; + } +@@ -345,11 +372,20 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + + dvdcss->b_scrambled = 1; /* Assume the worst */ + dvdcss->b_ioctls = _dvdcss_use_ioctls( dvdcss ); ++ dvdcss->b_ignore_rpc = psz_ignore_rpc ? atoi( psz_ignore_rpc ) : 0; + + if( dvdcss->b_ioctls ) + { + i_ret = _dvdcss_test( dvdcss ); +- if( i_ret < 0 ) ++ ++ if( i_ret == -3 && !dvdcss->b_ignore_rpc ) ++ { ++ /* Scrambled disk, RPC-II drive, no region set: bail out */ ++ free( dvdcss->psz_device ); ++ free( dvdcss ); ++ return NULL; ++ } ++ else if( i_ret < 0 ) + { + /* Disable the CSS ioctls and hope that it works? */ + print_debug( dvdcss, +@@ -402,7 +438,6 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + if( psz_cache ) + { + uint8_t p_sector[DVDCSS_BLOCK_SIZE]; +- char psz_debug[PATH_MAX + 30]; + char psz_key[1 + KEY_SIZE * 2 + 1]; + char *psz_title; + uint8_t *psz_serial; +@@ -530,13 +565,12 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( + /* Pointer to the filename we will use. */ + dvdcss->psz_block = dvdcss->psz_cachefile + i; + +- sprintf( psz_debug, "using CSS key cache dir: %s", +- dvdcss->psz_cachefile ); +- print_debug( dvdcss, psz_debug ); ++ print_debug( dvdcss, "using CSS key cache dir: %s", ++ dvdcss->psz_cachefile ); + } + nocache: + +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + if( psz_raw_device != NULL ) + { + _dvdcss_raw_open( dvdcss, psz_raw_device ); +--- a/src/libdvdcss.h 2008-08-30 02:39:56.000000000 +0800 ++++ b/src/libdvdcss.h 2009-05-26 20:25:07.000000000 +0800 +@@ -45,6 +45,7 @@ struct dvdcss_s + css_t css; + int b_ioctls; + int b_scrambled; ++ int b_ignore_rpc; + dvd_title_t *p_titles; + + /* Key cache directory and pointer to the filename */ +@@ -62,7 +63,7 @@ struct dvdcss_s + int i_readv_buf_size; + #endif + +-#ifndef WIN32 ++#if !defined(WIN32) && !defined(SYS_OS2) + int i_raw_fd; + #endif + };