mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
various patches to libdvdcss
This commit is contained in:
parent
3a1e9a1dfa
commit
16981ff520
12
packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff
Normal file
12
packages/multimedia/libdvdcss/patches/05_fuseiso_compat.diff
Normal file
@ -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;
|
||||||
|
}
|
409
packages/multimedia/libdvdcss/patches/20_git.diff
Normal file
409
packages/multimedia/libdvdcss/patches/20_git.diff
Normal file
@ -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 <IOKit/storage/IODVDMedia.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef SYS_OS2
|
||||||
|
+# define INCL_DOS
|
||||||
|
+# define INCL_DOSDEVIOCTL
|
||||||
|
+# include <os2.h>
|
||||||
|
+#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
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user