Mercurial > mplayer.hg
changeset 14861:caf9d95cd508
MPlayer-specific changes to libdvdcss
author | diego |
---|---|
date | Tue, 01 Mar 2005 06:58:15 +0000 |
parents | c2ddedd0619e |
children | ff63b650b30a |
files | libmpdvdkit2/libdvdcss_changes.diff |
diffstat | 1 files changed, 596 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdvdkit2/libdvdcss_changes.diff Tue Mar 01 06:58:15 2005 +0000 @@ -0,0 +1,596 @@ +--- bsdi_ioctl.c 2003-03-10 00:34:10.000000000 +0100 ++++ bsdi_ioctl.c 2005-03-01 07:41:41.000000000 +0100 +@@ -4,6 +4,10 @@ + * Hacked version of the linux cdrom.c kernel module - everything except the + * DVD handling ripped out and the rest rewritten to use raw SCSI commands + * on BSD/OS 4.2 (but should work with earlier versions as well). ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + */ + + #include <sys/types.h> +@@ -694,7 +698,7 @@ + struct cdrom_tocentry entry; + int ret, i; + +- bzero(tracks, sizeof (*tracks)); ++ memset(tracks, 0, sizeof (*tracks)); + ret = cdrom_ioctl(fd, CDROMREADTOCHDR, &header); + /* + * This whole business is a crock anyhow so we don't bother distinguishing +--- common.h 2003-06-13 19:33:35.000000000 +0200 ++++ common.h 2005-03-01 07:41:41.000000000 +0100 +@@ -3,7 +3,10 @@ + * Collection of useful common types and macros definitions + ***************************************************************************** + * Copyright (C) 1998, 1999, 2000 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * Authors: Samuel Hocevar <sam@via.ecp.fr> + * Vincent Seguin <seguin@via.ecp.fr> +@@ -27,21 +30,10 @@ + /***************************************************************************** + * Basic types definitions + *****************************************************************************/ +-#if defined( HAVE_STDINT_H ) +-# include <stdint.h> +-#elif defined( HAVE_INTTYPES_H ) +-# include <inttypes.h> +-#elif defined( SYS_CYGWIN ) +-# include <sys/types.h> +- /* Cygwin only defines half of these... */ +- typedef u_int8_t uint8_t; +- typedef u_int32_t uint32_t; +-#else +- /* Fallback types (very x86-centric, sorry) */ +- typedef unsigned char uint8_t; +- typedef signed char int8_t; +- typedef unsigned int uint32_t; +- typedef signed int int32_t; ++#include <inttypes.h> ++ ++#ifdef __CYGWIN__ ++#define SYS_CYGWIN + #endif + + #if defined( WIN32 ) +--- css.c 2003-07-29 01:37:06.000000000 +0200 ++++ css.c 2005-03-01 07:41:41.000000000 +0100 +@@ -2,7 +2,10 @@ + * css.c: Functions for DVD authentication and descrambling + ***************************************************************************** + * Copyright (C) 1999-2001 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * Author: Stéphane Borel <stef@via.ecp.fr> + * Håkan Hjort <d95hjort@dtek.chalmers.se> +@@ -40,19 +43,11 @@ + #include <string.h> + #include <sys/types.h> + #include <sys/stat.h> +-#ifdef HAVE_SYS_PARAM_H +-# include <sys/param.h> +-#endif +-#ifdef HAVE_UNISTD_H +-# include <unistd.h> +-#endif + #include <fcntl.h> ++#include <unistd.h> ++#include <limits.h> + +-#ifdef HAVE_LIMITS_H +-# include <limits.h> +-#endif +- +-#include "dvdcss/dvdcss.h" ++#include "dvdcss.h" + + #include "common.h" + #include "css.h" +--- device.c 2003-07-29 01:37:06.000000000 +0200 ++++ device.c 2005-03-01 07:41:41.000000000 +0100 +@@ -2,7 +2,10 @@ + * device.h: DVD device access + ***************************************************************************** + * Copyright (C) 1998-2002 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * Authors: Stéphane Borel <stef@via.ecp.fr> + * Samuel Hocevar <sam@zoy.org> +@@ -33,18 +36,9 @@ + #include <string.h> + #include <sys/types.h> + #include <sys/stat.h> +-#ifdef HAVE_SYS_PARAM_H +-# include <sys/param.h> +-#endif + #include <fcntl.h> +- +-#ifdef HAVE_UNISTD_H +-# include <unistd.h> +-#endif +- +-#ifdef HAVE_LIMITS_H +-# include <limits.h> +-#endif ++#include <unistd.h> ++#include <limits.h> + + #if defined( WIN32 ) && !defined( SYS_CYGWIN ) + # include <io.h> /* read() */ +@@ -52,7 +46,7 @@ + # include <sys/uio.h> /* struct iovec */ + #endif + +-#include "dvdcss/dvdcss.h" ++#include "dvdcss.h" + + #include "common.h" + #include "css.h" +@@ -143,8 +137,11 @@ + _dvdcss_debug( dvdcss, psz_debug ); + + #if defined( WIN32 ) +- /* If device is not "X:", we are actually opening a file. */ +- dvdcss->b_file = !psz_device[0] || psz_device[1] != ':' || psz_device[2]; ++ dvdcss->b_file = 1; ++ /* 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]))) ++ dvdcss->b_file = 0; + + /* Initialize readv temporary buffer */ + dvdcss->p_readv_buffer = NULL; +--- error.c 2003-03-10 01:15:31.000000000 +0100 ++++ error.c 2005-03-01 07:41:41.000000000 +0100 +@@ -2,7 +2,10 @@ + * error.c: error management functions + ***************************************************************************** + * Copyright (C) 1998-2002 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * Author: Samuel Hocevar <sam@zoy.org> + * +@@ -25,16 +28,9 @@ + + #include <stdio.h> + #include <stdlib.h> ++#include <limits.h> + +-#ifdef HAVE_SYS_PARAM_H +-# include <sys/param.h> +-#endif +- +-#ifdef HAVE_LIMITS_H +-# include <limits.h> +-#endif +- +-#include "dvdcss/dvdcss.h" ++#include "dvdcss.h" + + #include "common.h" + #include "css.h" +--- ioctl.c 2003-03-10 00:34:10.000000000 +0100 ++++ ioctl.c 2005-03-01 07:41:41.000000000 +0100 +@@ -2,7 +2,10 @@ + * ioctl.c: DVD ioctl replacement function + ***************************************************************************** + * Copyright (C) 1999-2001 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * Authors: Markus Kuespert <ltlBeBoy@beosmail.com> + * Samuel Hocevar <sam@zoy.org> +@@ -76,6 +79,7 @@ + # include <sys/scsi.h> + #endif + #ifdef SOLARIS_USCSI ++# include <dlfcn.h> + # include <unistd.h> + # include <stropts.h> + # include <sys/scsi/scsi_types.h> +@@ -112,6 +116,7 @@ + *****************************************************************************/ + #if defined( SOLARIS_USCSI ) + static void SolarisInitUSCSI( struct uscsi_cmd *p_sc, int i_type ); ++static int SolarisSendUSCSI( int fd, struct uscsi_cmd *p_sc ); + #endif + + /***************************************************************************** +@@ -192,7 +197,7 @@ + rs_cdb.cdb_opaque[ 6 ] = i_layer; + rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_COPYRIGHT; + +- i_ret = ioctl(i_fd, USCSICMD, &sc); ++ i_ret = SolarisSendUSCSI(i_fd, &sc); + + if( i_ret < 0 || sc.uscsi_status ) { + i_ret = -1; +@@ -351,7 +356,7 @@ + rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_DISCKEY; + rs_cdb.cdb_opaque[ 10 ] = *pi_agid << 6; + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -513,7 +518,7 @@ + rs_cdb.cdb_opaque[ 5 ] = ( i_pos ) & 0xff; + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -665,7 +670,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -787,7 +792,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -921,7 +926,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_ASF; + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -1054,7 +1059,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -1175,7 +1180,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -1299,7 +1304,7 @@ + p_buffer[ 1 ] = 0xe; + memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); + +- if( ioctl( i_fd, USCSICMD, &sc ) < 0 || sc.uscsi_status ) ++ if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status ) + { + return -1; + } +@@ -1436,7 +1441,7 @@ + p_buffer[ 1 ] = 0xa; + memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); + +- if( ioctl( i_fd, USCSICMD, &sc ) < 0 || sc.uscsi_status ) ++ if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status ) + { + return -1; + } +@@ -1578,7 +1583,7 @@ + + rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_RPC; + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -1728,7 +1733,7 @@ + p_buffer[ 1 ] = 6; + p_buffer[ 4 ] = i_pdrc; + +- i_ret = ioctl( i_fd, USCSICMD, &sc ); ++ i_ret = SolarisSendUSCSI( i_fd, &sc ); + + if( i_ret < 0 || sc.uscsi_status ) + { +@@ -1901,6 +1906,54 @@ + + USCSI_TIMEOUT( p_sc, 15 ); + } ++ ++/***************************************************************************** ++ * SolarisSendUSCSI: send a USCSICMD structure to the Solaris kernel ++ * for execution ++ ***************************************************************************** ++ * When available, this function uses the function smedia_uscsi_cmd() ++ * from solaris' libsmedia library (solaris 9 or newer) to execute the ++ * USCSI command. smedia_uscsi_cmd() allows USCSI commands for ++ * non-root users on removable media devices on solaris 9; sending the ++ * USCSI command directly to the device using the USCSICMD ioctl fails ++ * with an EPERM error on solaris 9. ++ * ++ * The code will fall back to the USCSICMD ioctl method, when ++ * libsmedia.so is not available or does not export the ++ * smedia_uscsi_cmd() function (on solaris releases upto and including ++ * solaris 8). Fortunatelly, on these old releases non-root users are ++ * allowed to perform USCSICMD ioctls on removable media devices. ++ *****************************************************************************/ ++static int SolarisSendUSCSI( int i_fd, struct uscsi_cmd *p_sc ) { ++ void *sm_hdl; ++ static int initialized; ++ static void* (*sm_get_handle)(int32_t); ++ static int (*sm_release_handle)(void*); ++ static int (*sm_uscsi_cmd)(void*, struct uscsi_cmd *); ++ ++ if (!initialized) ++ { ++ void *smedia_lib; ++ ++ smedia_lib = dlopen("libsmedia.so", RTLD_NOW); ++ if (smedia_lib) { ++ sm_get_handle = dlsym(smedia_lib, "smedia_get_handle"); ++ sm_release_handle = dlsym(smedia_lib, "smedia_release_handle"); ++ sm_uscsi_cmd = dlsym(smedia_lib, "smedia_uscsi_cmd"); ++ } ++ initialized = 1; ++ } ++ ++ if (sm_get_handle && sm_uscsi_cmd && sm_release_handle ++ && (sm_hdl = sm_get_handle(i_fd))) ++ { ++ int i_ret = sm_uscsi_cmd(sm_hdl, p_sc); ++ sm_release_handle(sm_hdl); ++ return i_ret; ++ } ++ ++ return ioctl( i_fd, USCSICMD, p_sc ); ++} + #endif + + #if defined( WIN32 ) +--- libdvdcss.c 2003-06-22 16:08:53.000000000 +0200 ++++ libdvdcss.c 2005-03-01 07:41:41.000000000 +0100 +@@ -5,7 +5,10 @@ + * Håkan Hjort <d95hjort@dtek.chalmers.se> + * + * Copyright (C) 1998-2002 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -22,7 +25,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + */ + +-/** ++/* + * \mainpage libdvdcss developer documentation + * + * \section intro Introduction +@@ -87,10 +90,7 @@ + * values. This will speed up descrambling of DVDs which are in the + * cache. The DVDCSS_CACHE directory is created if it does not exist, + * and a subdirectory is created named after the DVD's title or +- * manufacturing date. If DVDCSS_CACHE is not set or is empty, \e libdvdcss +- * will use the default value which is "${HOME}/.dvdcss/" under Unix and +- * "C:\Documents and Settings\$USER\Application Data\dvdcss\" under Win32. +- * The special value "off" disables caching. ++ * manufacturing date. + */ + + /* +@@ -103,28 +103,12 @@ + #include <string.h> + #include <sys/types.h> + #include <sys/stat.h> +-#ifdef HAVE_SYS_PARAM_H +-# include <sys/param.h> +-#endif +-#ifdef HAVE_PWD_H +-# include <pwd.h> +-#endif + #include <fcntl.h> + #include <errno.h> ++#include <unistd.h> ++#include <limits.h> + +-#ifdef HAVE_UNISTD_H +-# include <unistd.h> +-#endif +- +-#ifdef HAVE_LIMITS_H +-# include <limits.h> +-#endif +- +-#ifdef HAVE_DIRECT_H +-# include <direct.h> +-#endif +- +-#include "dvdcss/dvdcss.h" ++#include "dvdcss.h" + + #include "common.h" + #include "css.h" +@@ -132,6 +116,12 @@ + #include "ioctl.h" + #include "device.h" + ++#ifndef HAVE_MPLAYER ++ #include "get_path.c" ++#else ++ extern char * get_path( char * filename ); ++#endif ++ + /** + * \brief Symbol for version checks. + * +@@ -234,87 +224,11 @@ + } + + /* +- * If DVDCSS_CACHE was not set, try to guess a default value +- */ +- if( psz_cache == NULL || psz_cache[0] == '\0' ) +- { +-#ifdef HAVE_DIRECT_H +- typedef HRESULT( WINAPI *SHGETFOLDERPATH ) +- ( HWND, int, HANDLE, DWORD, LPTSTR ); +- +-# define CSIDL_FLAG_CREATE 0x8000 +-# define CSIDL_APPDATA 0x1A +-# define SHGFP_TYPE_CURRENT 0 +- +- char psz_home[MAX_PATH]; +- HINSTANCE p_dll; +- SHGETFOLDERPATH p_getpath; +- +- *psz_home = '\0'; +- +- /* Load the shfolder dll to retrieve SHGetFolderPath */ +- p_dll = LoadLibrary( "shfolder.dll" ); +- if( p_dll ) +- { +- p_getpath = (void*)GetProcAddress( p_dll, "SHGetFolderPathA" ); +- if( p_getpath ) +- { +- /* Get the "Application Data" folder for the current user */ +- if( p_getpath( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, +- NULL, SHGFP_TYPE_CURRENT, psz_home ) == S_OK ) +- { +- FreeLibrary( p_dll ); +- } +- else +- { +- *psz_home = '\0'; +- } +- } +- FreeLibrary( p_dll ); +- } +- +- /* Cache our keys in +- * C:\Documents and Settings\$USER\Application Data\dvdcss\ */ +- if( *psz_home ) +- { +- snprintf( psz_buffer, PATH_MAX, "%s/dvdcss", psz_home ); +- psz_buffer[PATH_MAX-1] = '\0'; +- psz_cache = psz_buffer; +- } +-#else +- char *psz_home = NULL; +-# ifdef HAVE_PWD_H +- struct passwd *p_pwd; +- +- /* Try looking in password file for home dir. */ +- p_pwd = getpwuid(getuid()); +- if( p_pwd ) +- { +- psz_home = p_pwd->pw_dir; +- } +-# endif +- +- if( psz_home == NULL ) +- { +- psz_home = getenv( "HOME" ); +- } +- +- /* Cache our keys in ${HOME}/.dvdcss/ */ +- if( psz_home ) +- { +- snprintf( psz_buffer, PATH_MAX, "%s/.dvdcss", psz_home ); +- psz_buffer[PATH_MAX-1] = '\0'; +- psz_cache = psz_buffer; +- } +-#endif +- } +- +- /* + * Find cache dir from the DVDCSS_CACHE environment variable + */ + if( psz_cache != NULL ) + { +- if( psz_cache[0] == '\0' || !strcmp( psz_cache, "off" ) ) ++ if( psz_cache[0] == '\0' ) + { + psz_cache = NULL; + } +@@ -325,6 +239,7 @@ + psz_cache = NULL; + } + } ++ else psz_cache = get_path( "DVDKeys" ); + + /* + * Open device +@@ -465,9 +380,10 @@ + dvdcss->psz_cachefile[0] = '\0'; + goto nocache; + } ++ i += sprintf( dvdcss->psz_cachefile + i, "/"); + +- i += sprintf( dvdcss->psz_cachefile + i, "/%s#%s", psz_title, +- psz_serial ); ++// i += sprintf( dvdcss->psz_cachefile + i, "/%s", psz_data ); ++ i += sprintf( dvdcss->psz_cachefile + i, "/%s#%s", psz_title, psz_serial ); + #if !defined( WIN32 ) || defined( SYS_CYGWIN ) + i_ret = mkdir( dvdcss->psz_cachefile, 0755 ); + #else +--- dvdcss/dvdcss.h 2003-04-18 20:05:36.000000000 +0200 ++++ dvdcss.h 2005-03-01 07:41:41.000000000 +0100 +@@ -10,7 +10,10 @@ + + /* + * Copyright (C) 1998-2002 VideoLAN +- * $Id$ ++ * ++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff. ++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ ++ * $Id$ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -67,6 +70,8 @@ + */ + extern dvdcss_t dvdcss_open ( char *psz_target ); + extern int dvdcss_close ( dvdcss_t ); ++extern int dvdcss_title ( dvdcss_t, ++ int i_block ); + extern int dvdcss_seek ( dvdcss_t, + int i_blocks, + int i_flags );