# HG changeset patch # User diego # Date 1364049146 0 # Node ID 691431d2289e3dac382752cc50b41cce5d00c98d # Parent 9b4ba0fb999b4cef53a3a642aa30fd33c788e86f Update internal libdvdcss to Git revision 39e0e2b. diff -r 9b4ba0fb999b -r 691431d2289e Copyright --- a/Copyright Sat Mar 23 00:50:51 2013 +0000 +++ b/Copyright Sat Mar 23 14:32:26 2013 +0000 @@ -22,7 +22,7 @@ Name: libdvdcss -Version: Subversion r256 + local changes +Version: Git 39e0e2b URL: http://developers.videolan.org/libdvdcss/ Directory: libdvdcss Copyright: 1998-2008 VideoLAN diff -r 9b4ba0fb999b -r 691431d2289e Makefile --- a/Makefile Sat Mar 23 00:50:51 2013 +0000 +++ b/Makefile Sat Mar 23 14:32:26 2013 +0000 @@ -859,7 +859,7 @@ gui/%: CFLAGS += -Wno-strict-prototypes -libdvdcss/%: CFLAGS := -Ilibdvdcss -DVERSION=\"1.2.12\" $(CFLAGS_LIBDVDCSS) $(CFLAGS) +libdvdcss/%: CFLAGS := $(CFLAGS_LIBDVDCSS) $(CFLAGS) libdvdnav/%: CFLAGS := -Ilibdvdnav -DHAVE_CONFIG_H -DVERSION=\"MPlayer-custom\" $(CFLAGS) libdvdread4/%: CFLAGS := -Ilibdvdread4 $(CFLAGS_LIBDVDCSS_DVDREAD) $(CFLAGS) diff -r 9b4ba0fb999b -r 691431d2289e configure --- a/configure Sat Mar 23 00:50:51 2013 +0000 +++ b/configure Sat Mar 23 14:32:26 2013 +0000 @@ -3843,13 +3843,8 @@ echocheck "direct.h" _direct_h=no -header_check direct.h && _direct_h=yes -if [ $_direct_h = yes ]; then - def_direct_h='#define HAVE_DIRECT_H 1' -else - # libdvdcss checks this via #ifdef, so we need #undef here. - def_direct_h='#undef HAVE_DIRECT_H' -fi +def_direct_h='#define HAVE_DIRECT_H 0' +header_check direct.h && _direct_h=yes && def_direct_h='#define HAVE_DIRECT_H 1' echores "$_direct_h" @@ -5958,20 +5953,20 @@ echocheck "internal libdvdcss" +def_broken_mkdir='#undef HAVE_BROKEN_MKDIR' def_dvdio='#undef DVD_STRUCT_IN_SYS_DVDIO_H' def_dvd='#undef DVD_STRUCT_IN_DVD_H' def_cdio='#undef DVD_STRUCT_IN_SYS_CDIO_H' def_cdrom='#undef DVD_STRUCT_IN_LINUX_CDROM_H' -def_bsdi_dvd='#undef DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H' def_hpux_scsi_h='#undef HPUX_SCTL_IO' def_sol_scsi_h='#undef SOLARIS_USCSI' +def_sys_uio_h='#undef HAVE_SYS_UIO_H' _dvdio=no _dvd=no _cdio=no _cdrom=no _sol_scsi_h=no _hpux_scsi_h=no -_bsdi_dvd=no if test "$_libdvdcss_internal" = auto && test "$_dvdread_internal" = yes ; then _libdvdcss_internal=no test -d libdvdcss && _libdvdcss_internal=yes @@ -6001,13 +5996,17 @@ header_check sys/scsi.h && _hpux_scsi_h=yes && def_hpux_scsi_h='#define HPUX_SCTL_IO 1' || _libdvdcss_internal=no - elif bsdos; then - header_check dvd.h && _bsdi_dvd=yes && - def_bsdi_dvd='#define DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H 1' - fi + fi + + statement_check_broken stddef.h sys/stat.h 'mkdir(NULL, 0)' || + def_broken_mkdir='#define HAVE_BROKEN_MKDIR 1' + + header_check "sys/uio.h" && + def_sys_uio_h='#define HAVE_SYS_UIO_H 1' + fi if test "$_libdvdcss_internal" = yes ; then - if linux || netbsd || openbsd || bsdos || wine ; then + if linux || netbsd || openbsd || wine ; then def_dvd_linux='#define HAVE_LINUX_DVD_STRUCT 1' openbsd && def_dvd_openbsd='#define HAVE_OPENBSD_DVD_STRUCT 1' elif freebsd || dragonfly ; then @@ -6016,9 +6015,9 @@ def_dvd_darwin='#define DARWIN_DVD_IOCTL' extra_ldflags="$extra_ldflags -framework IOKit -framework Carbon" elif cygwin ; then - cflags_libdvdcss="-DSYS_CYGWIN -DWIN32" - elif os2 ; then - cflags_libdvdcss="-DSYS_OS2" + cflags_libdvdcss="-D_WIN32_IE=0x0500 -mwin32" + elif mingw ; then + cflags_libdvdcss="-D_WIN32_IE=0x0500" fi cflags_libdvdcss_dvdread="-Ilibdvdcss" def_dvdcss="#define HAVE_DVDCSS_DVDCSS_H 1" @@ -8618,6 +8617,11 @@ #undef FAST_OSD #undef FAST_OSD_TABLE +/* Required for libdvdcss and some files below stream/. */ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + /* Define this to enable MPEG-1/2 image postprocessing in libmpeg2 */ #define MPEG12_POSTPROC 1 #define ATTRIBUTE_ALIGNED_MAX 16 @@ -8637,7 +8641,7 @@ #define HAVE_ERRNO_H 1 #define HAVE_INTTYPES_H 1 #define HAVE_UNISTD_H 1 -$def_bsdi_dvd +$def_broken_mkdir $def_cdio $def_cdrom $def_dvd @@ -8649,6 +8653,7 @@ $def_dvdio $def_hpux_scsi_h $def_sol_scsi_h +$def_sys_uio_h /* libdvdcss + libdvdread */ #define HAVE_LIMITS_H 1 diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/bsdi_dvd.h --- a/libdvdcss/bsdi_dvd.h Sat Mar 23 00:50:51 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,344 +0,0 @@ -/* - * $Id$ -*/ - -#ifndef DVDCSS_BSDI_DVD_H -#define DVDCSS_BSDI_DVD_H - -#include -#include -#include - -__BEGIN_DECLS -int dvd_cdrom_ioctl(int, unsigned long, void *); -int cdrom_blocksize(int, int); -void dvd_cdrom_debug(int); -__END_DECLS - -#define ioctl(a,b,c) dvd_cdrom_ioctl((a),(b),(c)) - -typedef unsigned char __u8; -typedef unsigned short __u16; -typedef unsigned int __u32; - -#define DVD_READ_STRUCT 0x5390 /* Read structure */ -#define DVD_WRITE_STRUCT 0x5391 /* Write structure */ -#define DVD_AUTH 0x5392 /* Authentication */ - -#define DVD_STRUCT_PHYSICAL 0x00 -#define DVD_STRUCT_COPYRIGHT 0x01 -#define DVD_STRUCT_DISCKEY 0x02 -#define DVD_STRUCT_BCA 0x03 -#define DVD_STRUCT_MANUFACT 0x04 - -struct dvd_layer { - __u8 book_version : 4; - __u8 book_type : 4; - __u8 min_rate : 4; - __u8 disc_size : 4; - __u8 layer_type : 4; - __u8 track_path : 1; - __u8 nlayers : 2; - __u8 track_density : 4; - __u8 linear_density : 4; - __u8 bca : 1; - __u32 start_sector; - __u32 end_sector; - __u32 end_sector_l0; -}; - -struct dvd_physical { - __u8 type; - __u8 layer_num; - struct dvd_layer layer[4]; -}; - -struct dvd_copyright { - __u8 type; - - __u8 layer_num; - __u8 cpst; - __u8 rmi; -}; - -struct dvd_disckey { - __u8 type; - - unsigned agid : 2; - __u8 value[2048]; -}; - -struct dvd_bca { - __u8 type; - - int len; - __u8 value[188]; -}; - -struct dvd_manufact { - __u8 type; - - __u8 layer_num; - int len; - __u8 value[2048]; -}; - -typedef union { - __u8 type; - - struct dvd_physical physical; - struct dvd_copyright copyright; - struct dvd_disckey disckey; - struct dvd_bca bca; - struct dvd_manufact manufact; -} dvd_struct; - -/* - * DVD authentication ioctl - */ - -/* Authentication states */ -#define DVD_LU_SEND_AGID 0 -#define DVD_HOST_SEND_CHALLENGE 1 -#define DVD_LU_SEND_KEY1 2 -#define DVD_LU_SEND_CHALLENGE 3 -#define DVD_HOST_SEND_KEY2 4 - -/* Termination states */ -#define DVD_AUTH_ESTABLISHED 5 -#define DVD_AUTH_FAILURE 6 - -/* Other functions */ -#define DVD_LU_SEND_TITLE_KEY 7 -#define DVD_LU_SEND_ASF 8 -#define DVD_INVALIDATE_AGID 9 -#define DVD_LU_SEND_RPC_STATE 10 -#define DVD_HOST_SEND_RPC_STATE 11 - -/* State data */ -typedef __u8 dvd_key[5]; /* 40-bit value, MSB is first elem. */ -typedef __u8 dvd_challenge[10]; /* 80-bit value, MSB is first elem. */ - -struct dvd_lu_send_agid { - __u8 type; - unsigned agid : 2; -}; - -struct dvd_host_send_challenge { - __u8 type; - unsigned agid : 2; - - dvd_challenge chal; -}; - -struct dvd_send_key { - __u8 type; - unsigned agid : 2; - - dvd_key key; -}; - -struct dvd_lu_send_challenge { - __u8 type; - unsigned agid : 2; - - dvd_challenge chal; -}; - -#define DVD_CPM_NO_COPYRIGHT 0 -#define DVD_CPM_COPYRIGHTED 1 - -#define DVD_CP_SEC_NONE 0 -#define DVD_CP_SEC_EXIST 1 - -#define DVD_CGMS_UNRESTRICTED 0 -#define DVD_CGMS_SINGLE 2 -#define DVD_CGMS_RESTRICTED 3 - -struct dvd_lu_send_title_key { - __u8 type; - unsigned agid : 2; - - dvd_key title_key; - int lba; - unsigned cpm : 1; - unsigned cp_sec : 1; - unsigned cgms : 2; -}; - -struct dvd_lu_send_asf { - __u8 type; - unsigned agid : 2; - - unsigned asf : 1; -}; - -struct dvd_host_send_rpcstate { - __u8 type; - __u8 pdrc; -}; - -struct dvd_lu_send_rpcstate { - __u8 type : 2; - __u8 vra : 3; - __u8 ucca : 3; - __u8 region_mask; - __u8 rpc_scheme; -}; - -typedef union { - __u8 type; - - struct dvd_lu_send_agid lsa; - struct dvd_host_send_challenge hsc; - struct dvd_send_key lsk; - struct dvd_lu_send_challenge lsc; - struct dvd_send_key hsk; - struct dvd_lu_send_title_key lstk; - struct dvd_lu_send_asf lsasf; - struct dvd_host_send_rpcstate hrpcs; - struct dvd_lu_send_rpcstate lrpcs; -} dvd_authinfo; - - -typedef struct { - __u16 report_key_length; - __u8 reserved1; - __u8 reserved2; -#if BYTE_ORDER == BIG_ENDIAN - __u8 type_code : 2; - __u8 vra : 3; - __u8 ucca : 3; -#elif BYTE_ORDER == LITTLE_ENDIAN - __u8 ucca : 3; - __u8 vra : 3; - __u8 type_code : 2; -#endif - __u8 region_mask; - __u8 rpc_scheme; - __u8 reserved3; -} rpc_state_t; - -/* - * Stuff for the CDROM ioctls -*/ - -#define CDROMREADTOCHDR 0x5305 /* Read TOC header (cdrom_tochdr) */ -#define CDROMREADTOCENTRY 0x5306 /* Read TOC entry (cdrom_tocentry) */ -#define CDROMEJECT 0x5309 /* Ejects the cdrom media */ -#define CDROMCLOSETRAY 0x5319 /* Reverse of CDROMEJECT */ -#define CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */ -#define CDROM_DISC_STATUS 0x5327 /* Get disc type, etc. */ -#define CDROMREADMODE2 0x530c /* Read CDROM mode 2 data (2336 Bytes) */ -#define CDROMREADMODE1 0x530d /* Read CDROM mode 1 data (2048 Bytes) */ -#define CDROMREADRAW 0x5314 /* read data in raw mode (2352 bytes) */ - -#define CD_MINS 74 /* max. minutes per CD, not really a limit */ -#define CD_SECS 60 /* seconds per minute */ -#define CD_FRAMES 75 /* frames per second */ -#define CD_MSF_OFFSET 150 /* MSF numbering offset of first frame */ - -#define CD_HEAD_SIZE 4 /* header (address) bytes per raw data frame */ -#define CD_SYNC_SIZE 12 /* 12 sync bytes per raw data frame */ -#define CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */ -#define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */ -#define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE) /*2336*/ -#define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE) /*2340*/ - -/* CD-ROM address types (cdrom_tocentry.cdte_format) */ -#define CDROM_LBA 0x01 /* logical block: first frame is #0 */ -#define CDROM_MSF 0x02 /* minute-second-frame: binary. not bcd here!*/ - -/* bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl) */ -#define CDROM_DATA_TRACK 0x04 - -/* The leadout track is always 0xAA, regardless of # of tracks on disc */ -#define CDROM_LEADOUT 0xAA - -/* drive status returned by CDROM_DRIVE_STATUS ioctl */ -#define CDS_NO_INFO 0 /* if not implemented */ -#define CDS_NO_DISC 1 -#define CDS_TRAY_OPEN 2 -#define CDS_DRIVE_NOT_READY 3 -#define CDS_DISC_OK 4 - -/* - * Return values for CDROM_DISC_STATUS ioctl. - * Can also return CDS_NO_INFO and CDS_NO_DISC from above -*/ -#define CDS_AUDIO 100 -#define CDS_DATA_1 101 -#define CDS_DATA_2 102 -#define CDS_XA_2_1 103 -#define CDS_XA_2_2 104 -#define CDS_MIXED 105 - -/* For compile compatibility only - we don't support changers */ -#define CDSL_NONE ((int) (~0U>>1)-1) -#define CDSL_CURRENT ((int) (~0U>>1)) - -struct cdrom_msf -{ - __u8 cdmsf_min0; /* start minute */ - __u8 cdmsf_sec0; /* start second */ - __u8 cdmsf_frame0; /* start frame */ - __u8 cdmsf_min1; /* end minute */ - __u8 cdmsf_sec1; /* end second */ - __u8 cdmsf_frame1; /* end frame */ -}; - -struct cdrom_tochdr - { - __u8 cdth_trk0; /* start track */ - __u8 cdth_trk1; /* end track */ - }; - -struct cdrom_msf0 -{ - __u8 minute; - __u8 second; - __u8 frame; -}; - -union cdrom_addr -{ - struct cdrom_msf0 msf; - int lba; -}; - -struct cdrom_tocentry -{ - __u8 cdte_track; - __u8 cdte_adr :4; - __u8 cdte_ctrl :4; - __u8 cdte_format; - union cdrom_addr cdte_addr; - __u8 cdte_datamode; -}; - -struct modesel_head -{ - __u8 reserved1; - __u8 medium; - __u8 reserved2; - __u8 block_desc_length; - __u8 density; - __u8 number_of_blocks_hi; - __u8 number_of_blocks_med; - __u8 number_of_blocks_lo; - __u8 reserved3; - __u8 block_length_hi; - __u8 block_length_med; - __u8 block_length_lo; -}; - -typedef struct -{ - int data; - int audio; - int cdi; - int xa; - int error; -} tracktype; - -#endif /* DVDCSS_BSDI_DVD_H */ diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/common.h --- a/libdvdcss/common.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/common.h Sat Mar 23 14:32:26 2013 +0000 @@ -3,7 +3,6 @@ * Collection of useful common types and macros definitions ***************************************************************************** * Copyright (C) 1998, 1999, 2000 VideoLAN - * $Id$ * * Authors: Sam Hocevar * Vincent Seguin @@ -34,11 +33,6 @@ # include #elif defined( HAVE_INTTYPES_H ) # include -#elif defined( SYS_CYGWIN ) -# include - /* 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; @@ -48,6 +42,7 @@ #endif #if defined( WIN32 ) +# include /* _lseeki64 */ # ifndef PATH_MAX # define PATH_MAX MAX_PATH @@ -74,6 +69,7 @@ # define off_t __int64 # endif # define stat _stati64 +# define snprintf _snprintf # endif #endif diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/css.c --- a/libdvdcss/css.c Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/css.c Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * css.c: Functions for DVD authentication and descrambling ***************************************************************************** * Copyright (C) 1999-2008 VideoLAN - * $Id$ * * Authors: Stéphane Borel * Håkan Hjort @@ -62,6 +61,8 @@ #include "ioctl.h" #include "device.h" +#define PSZ_KEY_SIZE (KEY_SIZE * 3) + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -87,44 +88,54 @@ static int AttackPadding ( uint8_t const[], int, uint8_t * ); #endif +static int _dvdcss_titlekey ( dvdcss_t, int , dvd_key_t ); + /***************************************************************************** * _dvdcss_test: check if the disc is encrypted or not ***************************************************************************** - * Sets b_scrambled, b_ioctls + * 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 *****************************************************************************/ -void _dvdcss_test( dvdcss_t dvdcss ) +int _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); @@ -157,7 +168,10 @@ { print_error( dvdcss, "css error: drive will prevent access to " "scrambled data" ); + return -3; } + + return i_copyright ? 1 : 0; } /***************************************************************************** @@ -205,12 +219,12 @@ if( i_fd >= 0 ) { - char psz_key[KEY_SIZE * 3]; + char psz_key[PSZ_KEY_SIZE]; unsigned int k0, k1, k2, k3, k4; - psz_key[KEY_SIZE * 3 - 1] = '\0'; + psz_key[PSZ_KEY_SIZE - 1] = '\0'; - if( read( i_fd, psz_key, KEY_SIZE * 3 - 1 ) == KEY_SIZE * 3 - 1 + if( read( i_fd, psz_key, PSZ_KEY_SIZE - 1 ) == PSZ_KEY_SIZE - 1 && sscanf( psz_key, "%x:%x:%x:%x:%x", &k0, &k1, &k2, &k3, &k4 ) == 5 ) { @@ -237,7 +251,7 @@ if( i_ret < 0 ) { - print_error( dvdcss, "fatal error in vts css key" ); + print_error( dvdcss, "fatal error in VTS CSS key" ); return i_ret; } @@ -254,13 +268,17 @@ i_fd = open( dvdcss->psz_cachefile, O_RDWR|O_CREAT, 0644 ); if( i_fd >= 0 ) { - char psz_key[KEY_SIZE * 3 + 2]; + char psz_key[PSZ_KEY_SIZE + 2]; sprintf( psz_key, "%02x:%02x:%02x:%02x:%02x\r\n", p_title_key[0], p_title_key[1], p_title_key[2], p_title_key[3], p_title_key[4] ); - write( i_fd, psz_key, KEY_SIZE * 3 + 1 ); + if( write( i_fd, psz_key, PSZ_KEY_SIZE + 1 ) < PSZ_KEY_SIZE + 1 ) + { + print_error( dvdcss, + "Error caching key on disk, continuing..\n" ); + } close( i_fd ); } } @@ -327,7 +345,7 @@ return -1; } - /* This should have invaidated the AGID and got us ASF=1. */ + /* This should have invalidated the AGID and got us ASF=1. */ if( GetASF( dvdcss ) != 1 ) { /* Region mismatch (or region not set) is the most likely source. */ @@ -395,7 +413,7 @@ /***************************************************************************** * _dvdcss_titlekey: get title key. *****************************************************************************/ -int _dvdcss_titlekey( dvdcss_t dvdcss, int i_pos, dvd_key_t p_title_key ) +static int _dvdcss_titlekey( dvdcss_t dvdcss, int i_pos, dvd_key_t p_title_key ) { static uint8_t p_garbage[ DVDCSS_BLOCK_SIZE ]; /* we never read it back */ uint8_t p_key[ KEY_SIZE ]; @@ -443,9 +461,9 @@ break; case 1: - /* Drive status is ok. */ + /* Drive status is OK. */ /* If the title key request failed, but we did not loose ASF, - * we might stil have the AGID. Other code assume that we + * we might still have the AGID. Other code assumes that we * will not after this so invalidate it(?). */ if( i_ret < 0 ) { @@ -498,7 +516,7 @@ /* METHOD is TITLE, we can't use the ioctls or requesting the title key * failed above. For these cases we try to crack the key instead. */ - /* For now, the read limit is 9Gb / 2048 = 4718592 sectors. */ + /* For now, the read limit is 9GB / 2048 = 4718592 sectors. */ i_ret = CrackTitleKey( dvdcss, i_pos, 4718592, p_key ); memcpy( p_title_key, p_key, KEY_SIZE ); @@ -561,7 +579,7 @@ * It simulates the mutual authentication between logical unit and host, * and stops when a session key (called bus key) has been established. * Always do the full auth sequence. Some drives seem to lie and always - * respond with ASF=1. For instance the old DVD roms on Compaq Armada says + * respond with ASF=1. For instance the old DVD-ROMs on Compaq Armada says * that ASF=1 from the start and then later fail with a 'read of scrambled * block without authentication' error. *****************************************************************************/ @@ -743,7 +761,7 @@ /***************************************************************************** * CryptKey : shuffles bits and unencrypt keys. ***************************************************************************** - * Used during authentication and disc key negociation in GetBusKey. + * Used during authentication and disc key negotiation in GetBusKey. * i_key_type : 0->key1, 1->key2, 2->buskey. * i_variant : between 0 and 31. *****************************************************************************/ @@ -751,13 +769,13 @@ uint8_t const *p_challenge, uint8_t *p_key ) { /* Permutation table for challenge */ - uint8_t pp_perm_challenge[3][10] = + static const uint8_t pp_perm_challenge[3][10] = { { 1, 3, 0, 7, 5, 2, 9, 6, 4, 8 }, { 6, 1, 9, 3, 8, 5, 7, 4, 0, 2 }, { 4, 0, 3, 5, 7, 2, 8, 6, 1, 9 } }; /* Permutation table for variant table for key2 and buskey */ - uint8_t pp_perm_variant[2][32] = + static const uint8_t pp_perm_variant[2][32] = { { 0x0a, 0x08, 0x0e, 0x0c, 0x0b, 0x09, 0x0f, 0x0d, 0x1a, 0x18, 0x1e, 0x1c, 0x1b, 0x19, 0x1f, 0x1d, 0x02, 0x00, 0x06, 0x04, 0x03, 0x01, 0x07, 0x05, @@ -767,14 +785,14 @@ 0x13, 0x1b, 0x17, 0x1f, 0x03, 0x0b, 0x07, 0x0f, 0x11, 0x19, 0x15, 0x1d, 0x01, 0x09, 0x05, 0x0d } }; - uint8_t p_variants[32] = + static const uint8_t p_variants[32] = { 0xB7, 0x74, 0x85, 0xD0, 0xCC, 0xDB, 0xCA, 0x73, 0x03, 0xFE, 0x31, 0x03, 0x52, 0xE0, 0xB7, 0x42, 0x63, 0x16, 0xF2, 0x2A, 0x79, 0x52, 0xFF, 0x1B, 0x7A, 0x11, 0xCA, 0x1A, 0x9B, 0x40, 0xAD, 0x01 }; /* The "secret" key */ - uint8_t p_secret[5] = { 0x55, 0xD6, 0xC4, 0xC5, 0x28 }; + static const uint8_t p_secret[5] = { 0x55, 0xD6, 0xC4, 0xC5, 0x28 }; uint8_t p_bits[30], p_scratch[10], p_tmp1[5], p_tmp2[5]; uint8_t i_lfsr0_o; /* 1 bit used */ @@ -824,7 +842,7 @@ * The first LFSR is of degree 25, and has a polynomial of: * x^13 + x^5 + x^4 + x^1 + 1 * - * The second LSFR is of degree 17, and has a (primitive) polynomial of: + * The second LFSR is of degree 17, and has a (primitive) polynomial of: * x^15 + x^1 + 1 * * I don't know if these polynomials are primitive modulo 2, and thus @@ -838,7 +856,7 @@ */ /* In order to ensure that the LFSR works we need to ensure that the - * initial values are non-zero. Thus when we initialise them from + * initial values are non-zero. Thus when we initialize them from * the seed, we ensure that a bit is set. */ i_lfsr0 = ( p_tmp1[0] << 17 ) | ( p_tmp1[1] << 9 ) | @@ -947,7 +965,7 @@ * in _dvdcss_titlekey. * The player keys and the resulting disc key are only used as KEKs * (key encryption keys). - * Decryption is slightly dependant on the type of key: + * Decryption is slightly dependent on the type of key: * -for disc key, invert is 0x00, * -for title key, invert if 0xff. *****************************************************************************/ @@ -1182,7 +1200,7 @@ } } - /* Initing our Really big table */ + /* Initializing our really big table */ BigTable = calloc( 16777216, sizeof(int) ); if( BigTable == NULL ) { @@ -1211,7 +1229,7 @@ } /* - * We are done initing, now reverse hash + * We are done initializing, now reverse hash */ tmp5 = p_disc_key[0] ^ p_css_tab1[ p_disc_key[1] ]; @@ -1229,7 +1247,7 @@ out1[ i ] = p_css_tab4[ tmp ]; } - /* cumpute and cache some variables */ + /* compute and cache some variables */ C[0] = nStepA >> 8; C[1] = nStepA & 0xff; tmp = p_disc_key[3] ^ p_css_tab1[ p_disc_key[4] ]; @@ -1345,7 +1363,7 @@ /* iterate cipher 4 times to reconstruct LFSR2 */ for( i = 0 ; i < 4 ; i++ ) { - /* advance LFSR1 normaly */ + /* advance LFSR1 normally */ i_t4 = p_css_tab2[i_t2] ^ p_css_tab3[i_t1]; i_t2 = i_t1 >> 1; i_t1 = ( ( i_t1 & 1 ) << 8 ) ^ i_t4; @@ -1398,7 +1416,7 @@ { i_t1 = i_t3 & 0xff; i_t3 = ( i_t3 >> 8 ); - /* easy to code, and fast enough bruteforce + /* easy to code, and fast enough brute-force * search for byte shifted in */ for( j = 0 ; j < 256 ; j++ ) { @@ -1446,11 +1464,11 @@ * Various pieces for the title crack engine. ****************************************************************************** * The length of the PES packet is located at 0x12-0x13. - * The the copyrigth protection bits are located at 0x14 (bits 0x20 and 0x10). + * The the copyright protection bits are located at 0x14 (bits 0x20 and 0x10). * The data of the PES packet begins at 0x15 (if there isn't any PTS/DTS) * or at 0x?? if there are both PTS and DTS's. * The seed value used with the unscrambling key is the 5 bytes at 0x54-0x58. - * The scrabled part of a sector begins at 0x80. + * The scrambled part of a sector begins at 0x80. *****************************************************************************/ /* Statistics */ @@ -1594,7 +1612,7 @@ ****************************************************************************** * Tries to find a repeating pattern just before the encrypted part starts. * Then it guesses that the plain text for first encrypted bytes are - * a contiuation of that pattern. + * a continuation of that pattern. *****************************************************************************/ static int AttackPattern( uint8_t const p_sec[ DVDCSS_BLOCK_SIZE ], int i_pos, uint8_t *p_key ) @@ -1655,7 +1673,7 @@ ****************************************************************************** * DVD specifies that there must only be one type of data in every sector. * Every sector is one pack and so must obviously be 2048 bytes long. - * For the last pice of video data before a VOBU boundary there might not + * For the last piece of video data before a VOBU boundary there might not * be exactly the right amount of data to fill a sector. Then one has to * pad the pack to 2048 bytes. For just a few bytes this is done in the * header but for any large amount you insert a PES packet from the @@ -1670,7 +1688,7 @@ i_pes_length = (p_sec[0x12]<<8) | p_sec[0x13]; - /* Coverd by the test below but usfull for debuging. */ + /* Covered by the test below but useful for debugging. */ if( i_pes_length == DVDCSS_BLOCK_SIZE - 0x14 ) return 0; /* There must be room for at least 4? bytes of padding stream, @@ -1699,7 +1717,7 @@ are also known. */ /* An encrypted SPU PES packet with another encrypted PES packet following. - Normaly if the following was a padding stream that would be in plain + Normally if the following was a padding stream that would be in plain text. So it will be another SPU PES packet. */ if( p_sec[0x11] == 0xbd && p_sec[0x17 + p_sec[0x16]] >= 0x20 && @@ -1709,7 +1727,7 @@ } /* A Video PES packet with another encrypted PES packet following. - * No reason execpt for time stamps to break the data into two packets. + * No reason except for time stamps to break the data into two packets. * So it's likely that the following PES packet is a padding stream. */ if( p_sec[0x11] == 0xe0 ) { diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/css.h --- a/libdvdcss/css.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/css.h Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * css.h: Structures for DVD authentication and unscrambling ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id$ * * Author: Stéphane Borel * @@ -45,7 +44,7 @@ typedef struct css_s { - int i_agid; /* Current Authenication Grant ID. */ + int i_agid; /* Current Authentication Grant ID. */ dvd_key_t p_bus_key; /* Current session key. */ dvd_key_t p_disc_key; /* This DVD disc's key. */ dvd_key_t p_title_key; /* Current title key. */ @@ -54,10 +53,9 @@ /***************************************************************************** * Prototypes in css.c *****************************************************************************/ -void _dvdcss_test ( dvdcss_t ); +int _dvdcss_test ( dvdcss_t ); int _dvdcss_title ( dvdcss_t, int ); int _dvdcss_disckey ( dvdcss_t ); -int _dvdcss_titlekey ( dvdcss_t, int , dvd_key_t ); int _dvdcss_unscramble ( uint8_t *, uint8_t * ); #endif /* DVDCSS_CSS_H */ diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/csstables.h --- a/libdvdcss/csstables.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/csstables.h Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * csstables.h: CSS Tables for DVD unscrambling ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id$ * * Author: Stéphane Borel * @@ -32,7 +31,7 @@ #ifndef DVDCSS_CSSTABLES_H #define DVDCSS_CSSTABLES_H -static uint8_t p_css_tab1[ 256 ] = +static const uint8_t p_css_tab1[ 256 ] = { 0x33, 0x73, 0x3b, 0x26, 0x63, 0x23, 0x6b, 0x76, 0x3e, 0x7e, 0x36, 0x2b, 0x6e, 0x2e, 0x66, 0x7b, @@ -68,7 +67,7 @@ 0xba, 0xfa, 0xb2, 0xaf, 0xea, 0xaa, 0xe2, 0xff }; -static uint8_t p_css_tab2[ 256 ] = +static const uint8_t p_css_tab2[ 256 ] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, @@ -104,7 +103,7 @@ 0xe4, 0xe5, 0xe6, 0xe7, 0xe0, 0xe1, 0xe2, 0xe3 }; -static uint8_t p_css_tab3[ 512 ] = +static const uint8_t p_css_tab3[ 512 ] = { 0x00, 0x24, 0x49, 0x6d, 0x92, 0xb6, 0xdb, 0xff, 0x00, 0x24, 0x49, 0x6d, 0x92, 0xb6, 0xdb, 0xff, @@ -172,7 +171,7 @@ 0x00, 0x24, 0x49, 0x6d, 0x92, 0xb6, 0xdb, 0xff }; -static uint8_t p_css_tab4[ 256 ] = +static const uint8_t p_css_tab4[ 256 ] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, @@ -208,7 +207,7 @@ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; -static uint8_t p_css_tab5[ 256 ] = +static const uint8_t p_css_tab5[ 256 ] = { 0xff, 0x7f, 0xbf, 0x3f, 0xdf, 0x5f, 0x9f, 0x1f, 0xef, 0x6f, 0xaf, 0x2f, 0xcf, 0x4f, 0x8f, 0x0f, @@ -244,7 +243,7 @@ 0xe0, 0x60, 0xa0, 0x20, 0xc0, 0x40, 0x80, 0x00 }; -static uint8_t p_crypt_tab0[ 256 ] = +static const uint8_t p_crypt_tab0[ 256 ] = { 0xB7, 0xF4, 0x82, 0x57, 0xDA, 0x4D, 0xDB, 0xE2, 0x2F, 0x52, 0x1A, 0xA8, 0x68, 0x5A, 0x8A, 0xFF, @@ -280,7 +279,7 @@ 0xAD, 0x94, 0x77, 0x04, 0x9A, 0x39, 0xCF, 0x7C }; -static uint8_t p_crypt_tab1[ 256 ] = +static const uint8_t p_crypt_tab1[ 256 ] = { 0x8C, 0x47, 0xB0, 0xE1, 0xEB, 0xFC, 0xEB, 0x56, 0x10, 0xE5, 0x2C, 0x1A, 0x5D, 0xEF, 0xBE, 0x4F, @@ -316,7 +315,7 @@ 0xAA, 0x1B, 0x79, 0x8E, 0x97, 0xB4, 0xC3, 0xF4 }; -static uint8_t p_crypt_tab2[ 256 ] = +static const uint8_t p_crypt_tab2[ 256 ] = { 0xB7, 0x75, 0x81, 0xD5, 0xDC, 0xCA, 0xDE, 0x66, 0x23, 0xDF, 0x15, 0x26, 0x62, 0xD1, 0x83, 0x77, @@ -352,7 +351,7 @@ 0x29, 0x91, 0xF0, 0x02, 0x18, 0x3A, 0x4E, 0x7C }; -static uint8_t p_crypt_tab3[ 288 ] = +static const uint8_t p_crypt_tab3[ 288 ] = { 0x73, 0x51, 0x95, 0xE1, 0x12, 0xE4, 0xC0, 0x58, 0xEE, 0xF2, 0x08, 0x1B, 0xA9, 0xFA, 0x98, 0x4C, diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/device.c --- a/libdvdcss/device.c Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/device.c Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * device.h: DVD device access ***************************************************************************** * Copyright (C) 1998-2006 VideoLAN - * $Id$ * * Authors: Stéphane Borel * Sam Hocevar @@ -49,12 +48,6 @@ # include #endif -#if defined( WIN32 ) && !defined( SYS_CYGWIN ) -# include /* read() */ -#else -# include /* struct iovec */ -#endif - #ifdef DARWIN_DVD_IOCTL # include # include @@ -65,7 +58,7 @@ # include #endif -#ifdef SYS_OS2 +#ifdef __OS2__ # define INCL_DOS # define INCL_DOSDEVIOCTL # include @@ -99,7 +92,7 @@ static int win_readv ( dvdcss_t, struct iovec *, int ); static int aspi_read_internal ( int, void *, int ); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) static int os2_open ( dvdcss_t, char const * ); /* just use macros for libc */ # define os2_seek libc_seek @@ -124,7 +117,7 @@ { return 1; } -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) ULONG ulMode; if( DosQueryFHState( dvdcss->i_fd, &ulMode ) != 0 ) @@ -154,7 +147,6 @@ * OpenBSD needs a char device * NetBSD needs a char device * FreeBSD can use either the block or the char device - * BSD/OS can use either the block or the char device */ /* Check if this is a block/char device */ @@ -181,7 +173,7 @@ kern_return_t kern_result; io_iterator_t media_iterator; CFMutableDictionaryRef classes_to_match; -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) #pragma pack( 1 ) struct { @@ -239,7 +231,7 @@ /* Remove trailing backslash */ psz_device[2] = '\0'; - /* FIXME: we want to differenciate between CD and DVD drives + /* FIXME: we want to differentiate between CD and DVD drives * using DeviceIoControl() */ print_debug( dvdcss, "defaulting to drive `%s'", psz_device ); free( dvdcss->psz_device ); @@ -316,7 +308,7 @@ } IOObjectRelease( media_iterator ); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) for( i = 0; i < 26; i++ ) { param.bCmdInfo = 0; @@ -394,7 +386,7 @@ return aspi_open( dvdcss, psz_device ); } else -#elif defined( SYS_OS2 ) +#elif defined( __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] ) ) ) @@ -416,7 +408,7 @@ } } -#if !defined(WIN32) && !defined(SYS_OS2) +#ifdef DVDCSS_RAW_OPEN int _dvdcss_raw_open ( dvdcss_t dvdcss, char const *psz_device ) { dvdcss->i_raw_fd = open( psz_device, 0 ); @@ -452,7 +444,7 @@ { struct w32_aspidev *fd = (struct w32_aspidev *) dvdcss->i_fd; - /* Unload aspi and free w32_aspidev structure */ + /* Unload ASPI and free w32_aspidev structure */ FreeLibrary( (HMODULE) fd->hASPI ); free( (void*) dvdcss->i_fd ); } @@ -469,7 +461,7 @@ #else close( dvdcss->i_fd ); -#ifndef SYS_OS2 +#ifdef DVDCSS_RAW_OPEN if( dvdcss->i_raw_fd >= 0 ) { close( dvdcss->i_raw_fd ); @@ -488,11 +480,7 @@ *****************************************************************************/ static int libc_open ( dvdcss_t dvdcss, char const *psz_device ) { -#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 ); -#endif if( dvdcss->i_fd == -1 ) { @@ -516,7 +504,7 @@ /* To work around an M$ bug in IOCTL_DVD_READ_STRUCTURE, we need read * _and_ write access to the device (so we can make SCSI Pass Through * Requests). Unfortunately this is only allowed if you have - * administrator priviledges so we allow for a fallback method with + * administrator privileges so we allow for a fallback method with * only read access to the device (in this case ioctl_ReadCopyright() * won't send back the right result). * (See Microsoft Q241374: Read and Write Access Required for SCSI @@ -554,7 +542,7 @@ SENDASPI32COMMAND lpSendCommand; char c_drive = psz_device[0]; - /* load aspi and init w32_aspidev structure */ + /* load ASPI and init w32_aspidev structure */ hASPI = LoadLibrary( "wnaspi32.dll" ); if( hASPI == NULL ) { @@ -567,7 +555,7 @@ if(lpGetSupport == NULL || lpSendCommand == NULL ) { - print_error( dvdcss, "unable to get aspi function pointers" ); + print_error( dvdcss, "unable to get ASPI function pointers" ); FreeLibrary( hASPI ); return -1; } @@ -583,7 +571,7 @@ if( HIBYTE( LOWORD ( dwSupportInfo ) ) != SS_COMP ) { - print_error( dvdcss, "unable to initalize aspi layer" ); + print_error( dvdcss, "unable to initialize ASPI layer" ); FreeLibrary( hASPI ); return -1; } @@ -628,10 +616,9 @@ if( (srbDiskInfo.SRB_Status == SS_COMP) && (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) { - /* Make sure this is a cdrom device */ - struct SRB_GDEVBlock srbGDEVBlock; + /* Make sure this is a CD-ROM device */ + struct SRB_GDEVBlock srbGDEVBlock = { 0 }; - memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; srbGDEVBlock.SRB_HaId = i; srbGDEVBlock.SRB_Target = j; @@ -650,7 +637,7 @@ { free( (void*) fd ); FreeLibrary( hASPI ); - print_error( dvdcss,"this is not a cdrom drive" ); + print_error( dvdcss,"this is not a CD-ROM drive" ); return -1; } } @@ -659,12 +646,12 @@ free( (void*) fd ); FreeLibrary( hASPI ); - print_error( dvdcss, "unable to get haid and target (aspi)" ); + print_error( dvdcss, "unable to get haid and target (ASPI)" ); return -1; } #endif -#ifdef SYS_OS2 +#ifdef __OS2__ static int os2_open ( dvdcss_t dvdcss, char const *psz_device ) { char psz_dvd[] = "X:"; @@ -881,8 +868,8 @@ if( i_bytes < 0 ) { /* One of the reads failed, too bad. - * We won't even bother returning the reads that went ok, - * and as in the posix spec the file postition is left + * We won't even bother returning the reads that went OK, + * and as in the POSIX spec the file position is left * unspecified after a failure */ dvdcss->i_pos = -1; return -1; @@ -968,7 +955,7 @@ i_blocks_total * DVDCSS_BLOCK_SIZE, &i_bytes, NULL ) ) { /* The read failed... too bad. - * As in the posix spec the file postition is left + * As in the POSIX spec the file position is left * unspecified after a failure */ dvdcss->i_pos = -1; return -1; @@ -1010,7 +997,7 @@ static int aspi_read_internal( int i_fd, void *p_data, int i_blocks ) { HANDLE hEvent; - struct SRB_ExecSCSICmd ssc; + struct SRB_ExecSCSICmd ssc = { 0 }; struct w32_aspidev *fd = (struct w32_aspidev *) i_fd; /* Create the transfer completion event */ @@ -1020,8 +1007,6 @@ return -1; } - memset( &ssc, 0, sizeof( ssc ) ); - ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; ssc.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; ssc.SRB_HaId = LOBYTE( fd->i_sid ); @@ -1038,7 +1023,7 @@ ssc.CDBByte[4] = (UCHAR) (fd->i_blocks >> 8) & 0xff; ssc.CDBByte[5] = (UCHAR) (fd->i_blocks) & 0xff; - /* We have to break down the reads into 64kb pieces (ASPI restriction) */ + /* We have to break down the reads into 64KB pieces (ASPI restriction) */ if( i_blocks > 32 ) { ssc.SRB_BufLen = 32 * DVDCSS_BLOCK_SIZE; @@ -1049,7 +1034,7 @@ ResetEvent( hEvent ); fd->lpSendCommand( (void*) &ssc ); - /* transfer the next 64kb (aspi_read_internal is called recursively) + /* transfer the next 64KB (aspi_read_internal is called recursively) * We need to check the status of the read on return */ if( aspi_read_internal( i_fd, (uint8_t*) p_data + 32 * DVDCSS_BLOCK_SIZE, diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/device.h --- a/libdvdcss/device.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/device.h Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * device.h: DVD device access ***************************************************************************** * Copyright (C) 1998-2002 VideoLAN - * $Id$ * * Authors: Stéphane Borel * Sam Hocevar @@ -26,11 +25,18 @@ #ifndef DVDCSS_DEVICE_H #define DVDCSS_DEVICE_H +#include "config.h" + /***************************************************************************** * iovec structure: vectored data entry *****************************************************************************/ -#if defined( WIN32 ) && !defined( SYS_CYGWIN ) +#ifndef HAVE_SYS_UIO_H # include /* read() */ +struct iovec +{ + void *iov_base; /* Pointer to data. */ + size_t iov_len; /* Length of data. */ +}; #else # include # include /* struct iovec */ @@ -38,14 +44,11 @@ #include "dvdcss/dvdcss.h" -#if defined( WIN32 ) && !defined( SYS_CYGWIN ) -struct iovec -{ - void *iov_base; /* Pointer to data. */ - size_t iov_len; /* Length of data. */ -}; +#if !defined(WIN32) && !defined(__OS2__) +# define DVDCSS_RAW_OPEN #endif + /***************************************************************************** * Device reading prototypes *****************************************************************************/ @@ -57,8 +60,6 @@ /***************************************************************************** * Device reading prototypes, raw-device specific *****************************************************************************/ -#if !defined(WIN32) && !defined(SYS_OS2) int _dvdcss_raw_open ( dvdcss_t, char const * ); -#endif #endif /* DVDCSS_DEVICE_H */ diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/dvdcss/dvdcss.h --- a/libdvdcss/dvdcss/dvdcss.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/dvdcss/dvdcss.h Sat Mar 23 14:32:26 2013 +0000 @@ -10,7 +10,6 @@ /* * Copyright (C) 1998-2008 VideoLAN - * $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 @@ -60,17 +59,12 @@ #define LIBDVDCSS_EXPORT __declspec(dllexport) extern #elif defined(LIBDVDCSS_IMPORTS) #define LIBDVDCSS_EXPORT __declspec(dllimport) extern -#elif defined(HAVE_VISIBILITY) +#elif defined(SUPPORT_ATTRIBUTE_VISIBILITY_DEFAULT) #define LIBDVDCSS_EXPORT __attribute__((visibility("default"))) extern #else #define LIBDVDCSS_EXPORT extern #endif -/* - * Our version number. The variable name contains the interface version. - */ -LIBDVDCSS_EXPORT char * dvdcss_interface_2; - /* * Exported prototypes. @@ -92,16 +86,6 @@ LIBDVDCSS_EXPORT int dvdcss_is_scrambled ( dvdcss_t ); - -/* - * Deprecated stuff. - */ -#ifndef _DOXYGEN_SKIP_ME -#define dvdcss_title(a,b) dvdcss_seek(a,b,DVDCSS_SEEK_KEY) -#define dvdcss_handle dvdcss_t -#endif - - #ifdef __cplusplus } #endif diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/error.c --- a/libdvdcss/error.c Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/error.c Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * error.c: error management functions ***************************************************************************** * Copyright (C) 1998-2002 VideoLAN - * $Id$ * * Author: Sam Hocevar * diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/ioctl.c --- a/libdvdcss/ioctl.c Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/ioctl.c Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * ioctl.c: DVD ioctl replacement function ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id$ * * Authors: Markus Kuespert * Sam Hocevar @@ -41,7 +40,7 @@ #if defined( WIN32 ) # include # include -#elif defined ( SYS_OS2 ) +#elif defined ( __OS2__ ) # define INCL_DOSFILEMGR # define INCL_DOSDEVICES # define INCL_DOSDEVIOCTL @@ -65,10 +64,7 @@ #ifdef DVD_STRUCT_IN_DVD_H # include #endif -#ifdef DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H -# include "bsdi_dvd.h" -#endif -#ifdef SYS_BEOS +#ifdef __BEOS__ # include # include #endif @@ -97,7 +93,7 @@ /***************************************************************************** * Local prototypes, BeOS specific *****************************************************************************/ -#if defined( SYS_BEOS ) +#if defined( __BEOS__ ) static void BeInitRDC ( raw_device_command *, int ); #endif @@ -135,7 +131,7 @@ /***************************************************************************** * Local prototypes, OS2 specific *****************************************************************************/ -#if defined( SYS_OS2 ) +#if defined( __OS2__ ) static void OS2InitSDC( struct OS2_ExecSCSICmd *, int ); #endif @@ -147,9 +143,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_struct dvd; - - memset( &dvd, 0, sizeof( dvd ) ); + dvd_struct dvd = { 0 }; + dvd.type = DVD_STRUCT_COPYRIGHT; dvd.copyright.layer_num = i_layer; @@ -158,9 +153,8 @@ *pi_copyright = dvd.copyright.cpst; #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_struct dvd; - - memset( &dvd, 0, sizeof( dvd ) ); + struct dvd_struct dvd = { 0 }; + dvd.format = DVD_STRUCT_COPYRIGHT; dvd.layer_num = i_layer; @@ -168,7 +162,7 @@ *pi_copyright = dvd.cpst; -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_READ_DVD_STRUCTURE, 8 ); rdc.command[ 6 ] = i_layer; @@ -221,7 +215,7 @@ /* When using IOCTL_DVD_READ_STRUCTURE and DVD_COPYRIGHT_DESCRIPTOR, CopyrightProtectionType seems to be always 6 ??? - To work around this MS bug we try to send a raw scsi command + To work around this MS bug we try to send a raw SCSI command instead (if we've got enough privileges to do so). */ sptd.Cdb[ 6 ] = i_layer; @@ -257,7 +251,7 @@ *pi_copyright = p_buffer[4]; -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_READ_DVD_STRUCTURE, 8 ); sdc.command[ 6 ] = i_layer; @@ -284,12 +278,10 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_struct dvd; - - memset( &dvd, 0, sizeof( dvd ) ); + dvd_struct dvd = { 0 }; + dvd.type = DVD_STRUCT_DISCKEY; dvd.disckey.agid = *pi_agid; - memset( dvd.disckey.value, 0, DVD_DISCKEY_SIZE ); i_ret = ioctl( i_fd, DVD_READ_STRUCT, &dvd ); @@ -301,12 +293,10 @@ memcpy( p_key, dvd.disckey.value, DVD_DISCKEY_SIZE ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_struct dvd; - - memset( &dvd, 0, sizeof( dvd ) ); + struct dvd_struct dvd = { 0 }; + dvd.format = DVD_STRUCT_DISCKEY; dvd.agid = *pi_agid; - memset( dvd.data, 0, DVD_DISCKEY_SIZE ); i_ret = ioctl( i_fd, DVDIOCREADSTRUCTURE, &dvd ); @@ -317,7 +307,7 @@ memcpy( p_key, dvd.data, DVD_DISCKEY_SIZE ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); rdc.command[ 7 ] = DVD_STRUCT_DISCKEY; @@ -377,11 +367,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_DISK_KEY_LENGTH]; + uint8_t buffer[DVD_DISK_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_DISK_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdDiskKey; @@ -425,7 +413,7 @@ memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); -#elif defined ( SYS_OS2 ) +#elif defined ( __OS2__ ) INIT_SSC( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); sdc.command[ 7 ] = DVD_STRUCT_DISCKEY; @@ -457,9 +445,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_TITLE_KEY; auth_info.lstk.agid = *pi_agid; auth_info.lstk.lba = i_pos; @@ -469,9 +456,8 @@ memcpy( p_key, auth_info.lstk.title_key, DVD_KEY_SIZE ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_TITLE_KEY; auth_info.agid = *pi_agid; auth_info.lba = i_pos; @@ -480,7 +466,7 @@ memcpy( p_key, auth_info.keychal, DVD_KEY_SIZE ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 12 ); rdc.command[ 2 ] = ( i_pos >> 24 ) & 0xff; @@ -545,11 +531,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_TITLE_KEY_LENGTH]; + uint8_t buffer[DVD_TITLE_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_TITLE_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdTitleKey; @@ -591,7 +575,7 @@ memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 12 ); sdc.command[ 2 ] = ( i_pos >> 24 ) & 0xff; @@ -623,9 +607,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_AGID; auth_info.lsa.agid = *pi_agid; @@ -634,9 +617,8 @@ *pi_agid = auth_info.lsa.agid; #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_AGID; auth_info.agid = *pi_agid; @@ -644,7 +626,7 @@ *pi_agid = auth_info.agid; -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 8 ); rdc.command[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); @@ -719,7 +701,7 @@ *pi_agid = p_buffer[ 7 ] >> 6; -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 8 ); sdc.command[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); @@ -745,9 +727,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_CHALLENGE; auth_info.lsc.agid = *pi_agid; @@ -756,9 +737,8 @@ memcpy( p_challenge, auth_info.lsc.chal, DVD_CHALLENGE_SIZE ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_CHALLENGE; auth_info.agid = *pi_agid; @@ -766,7 +746,7 @@ memcpy( p_challenge, auth_info.keychal, DVD_CHALLENGE_SIZE ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 16 ); rdc.command[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); @@ -812,11 +792,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_CHALLENGE_KEY_LENGTH]; + uint8_t buffer[DVD_CHALLENGE_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_CHALLENGE_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdChallengeKey; @@ -853,7 +831,7 @@ memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 16 ); sdc.command[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); @@ -879,9 +857,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_ASF; auth_info.lsasf.asf = *pi_asf; @@ -890,9 +867,8 @@ *pi_asf = auth_info.lsasf.asf; #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_ASF; auth_info.asf = *pi_asf; @@ -900,7 +876,7 @@ *pi_asf = auth_info.asf; -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 8 ); rdc.command[ 10 ] = DVD_REPORT_ASF; @@ -944,16 +920,16 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_ASF_LENGTH]; + uint8_t buffer[DVD_ASF_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - - memset( &buffer, 0, sizeof( buffer ) ); + PDVD_ASF keyData; key->KeyLength = DVD_ASF_LENGTH; key->KeyType = DvdAsf; key->KeyFlags = 0; - ((PDVD_ASF)key->KeyData)->SuccessFlag = *pi_asf; + keyData = (PDVD_ASF)key->KeyData; + keyData->SuccessFlag = *pi_asf; i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; @@ -963,7 +939,8 @@ return i_ret; } - *pi_asf = ((PDVD_ASF)key->KeyData)->SuccessFlag; + keyData = (PDVD_ASF)key->KeyData; + *pi_asf = keyData->SuccessFlag; } else { @@ -986,7 +963,7 @@ *pi_asf = p_buffer[ 7 ] & 1; -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 8 ); sdc.command[ 10 ] = DVD_REPORT_ASF; @@ -1012,9 +989,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_KEY1; auth_info.lsk.agid = *pi_agid; @@ -1023,9 +999,8 @@ memcpy( p_key, auth_info.lsk.key, DVD_KEY_SIZE ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_KEY1; auth_info.agid = *pi_agid; @@ -1033,7 +1008,7 @@ memcpy( p_key, auth_info.keychal, DVD_KEY_SIZE ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 12 ); rdc.command[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); @@ -1079,11 +1054,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_BUS_KEY_LENGTH]; + uint8_t buffer[DVD_BUS_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_BUS_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdBusKey1; @@ -1115,7 +1088,7 @@ memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 12 ); sdc.command[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); @@ -1141,41 +1114,39 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); - auth_info.type = DVD_INVALIDATE_AGID; + dvd_authinfo auth_info = { 0 }; + + auth_info.type = DVDCSS_INVALIDATE_AGID; auth_info.lsa.agid = *pi_agid; i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); - auth_info.format = DVD_INVALIDATE_AGID; + struct dvd_authinfo auth_info = { 0 }; + + auth_info.format = DVDCSS_INVALIDATE_AGID; auth_info.agid = *pi_agid; i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 0 ); - rdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + rdc.command[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); #elif defined( HPUX_SCTL_IO ) INIT_SCTL_IO( GPCMD_REPORT_KEY, 0 ); - sctl_io.cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + sctl_io.cdb[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); #elif defined( SOLARIS_USCSI ) INIT_USCSI( GPCMD_REPORT_KEY, 0 ); - rs_cdb.cdb_opaque[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + rs_cdb.cdb_opaque[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = SolarisSendUSCSI( i_fd, &sc ); @@ -1212,7 +1183,7 @@ ssc.CDBByte[ 9 ] = 0; #endif - ssc.CDBByte[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + ssc.CDBByte[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = WinSendSSC( i_fd, &ssc ); } @@ -1221,18 +1192,18 @@ INIT_CPT( GPCMD_REPORT_KEY, 0 ); - p_cpt->cam_cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + p_cpt->cam_cdb[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 1 ); sdc.data_length = 0; sdc.command[ 8 ] = 0; sdc.command[ 9 ] = 0; - sdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); + sdc.command[ 10 ] = DVDCSS_INVALIDATE_AGID | (*pi_agid << 6); i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, &sdc, sizeof(sdc), &ulParamLen, @@ -1252,9 +1223,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_HOST_SEND_CHALLENGE; auth_info.hsc.agid = *pi_agid; @@ -1263,9 +1233,8 @@ i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_SEND_CHALLENGE; auth_info.agid = *pi_agid; @@ -1273,7 +1242,7 @@ i_ret = ioctl( i_fd, DVDIOCSENDKEY, &auth_info ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_SEND_KEY, 16 ); rdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); @@ -1324,11 +1293,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_CHALLENGE_KEY_LENGTH]; + uint8_t buffer[DVD_CHALLENGE_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_CHALLENGE_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdChallengeKey; @@ -1362,7 +1329,7 @@ i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_SEND_KEY, 16 ); sdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); @@ -1389,9 +1356,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_HOST_SEND_KEY2; auth_info.hsk.agid = *pi_agid; @@ -1400,9 +1366,8 @@ i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_SEND_KEY2; auth_info.agid = *pi_agid; @@ -1410,7 +1375,7 @@ i_ret = ioctl( i_fd, DVDIOCSENDKEY, &auth_info ); -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_SEND_KEY, 12 ); rdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); @@ -1461,11 +1426,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_BUS_KEY_LENGTH]; + uint8_t buffer[DVD_BUS_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - memset( &buffer, 0, sizeof( buffer ) ); - key->KeyLength = DVD_BUS_KEY_LENGTH; key->SessionId = *pi_agid; key->KeyType = DvdBusKey2; @@ -1499,7 +1462,7 @@ i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_SEND_KEY, 12 ); sdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); @@ -1526,9 +1489,8 @@ int i_ret; #if defined( HAVE_LINUX_DVD_STRUCT ) && defined( DVD_LU_SEND_RPC_STATE ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + dvd_authinfo auth_info = { 0 }; + auth_info.type = DVD_LU_SEND_RPC_STATE; i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); @@ -1542,9 +1504,8 @@ i_ret = -1; #elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); + struct dvd_authinfo auth_info = { 0 }; + auth_info.format = DVD_REPORT_RPC; i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); @@ -1553,7 +1514,7 @@ *p_mask = auth_info.region; // ?? *p_scheme = auth_info.rpc_scheme; -#elif defined( SYS_BEOS ) +#elif defined( __BEOS__ ) INIT_RDC( GPCMD_REPORT_KEY, 8 ); rdc.command[ 10 ] = DVD_REPORT_RPC; @@ -1607,10 +1568,9 @@ if( WIN2K ) /* NT/2k/XP */ { DWORD tmp; - uint8_t buffer[DVD_RPC_KEY_LENGTH]; + uint8_t buffer[DVD_RPC_KEY_LENGTH] = { 0 }; PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; - - memset( &buffer, 0, sizeof( buffer ) ); + PDVD_RPC_KEY keyData; key->KeyLength = DVD_RPC_KEY_LENGTH; key->KeyType = DvdGetRpcKey; @@ -1624,9 +1584,10 @@ return i_ret; } - *p_type = ((PDVD_RPC_KEY)key->KeyData)->TypeCode; - *p_mask = ((PDVD_RPC_KEY)key->KeyData)->RegionMask; - *p_scheme = ((PDVD_RPC_KEY)key->KeyData)->RpcScheme; + keyData = (PDVD_RPC_KEY)key->KeyData; + *p_type = keyData->TypeCode; + *p_mask = keyData->RegionMask; + *p_scheme = keyData->RpcScheme; } else { @@ -1653,7 +1614,7 @@ *p_mask = p_buffer[ 5 ]; *p_scheme = p_buffer[ 6 ]; -#elif defined( SYS_OS2 ) +#elif defined( __OS2__ ) INIT_SSC( GPCMD_REPORT_KEY, 8 ); sdc.command[ 10 ] = DVD_REPORT_RPC; @@ -1673,136 +1634,9 @@ return i_ret; } -/***************************************************************************** - * ioctl_SendRPC: set RPC status for the drive - *****************************************************************************/ -int ioctl_SendRPC( int i_fd, int i_pdrc ) -{ - int i_ret; - -#if defined( HAVE_LINUX_DVD_STRUCT ) && defined( DVD_HOST_SEND_RPC_STATE ) - dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); - auth_info.type = DVD_HOST_SEND_RPC_STATE; - auth_info.hrpcs.pdrc = i_pdrc; - - i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); - -#elif defined( HAVE_LINUX_DVD_STRUCT ) - /* FIXME: OpenBSD doesn't know this */ - i_ret = -1; - -#elif defined( HAVE_BSD_DVD_STRUCT ) - struct dvd_authinfo auth_info; - - memset( &auth_info, 0, sizeof( auth_info ) ); - auth_info.format = DVD_SEND_RPC; - auth_info.region = i_pdrc; - - i_ret = ioctl( i_fd, DVDIOCSENDKEY, &auth_info ); - -#elif defined( SYS_BEOS ) - INIT_RDC( GPCMD_SEND_KEY, 8 ); - - rdc.command[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); - -#elif defined( HPUX_SCTL_IO ) - INIT_SCTL_IO( GPCMD_SEND_KEY, 8 ); - - sctl_io.cdb[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); - -#elif defined( SOLARIS_USCSI ) - INIT_USCSI( GPCMD_SEND_KEY, 8 ); - - rs_cdb.cdb_opaque[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = SolarisSendUSCSI( i_fd, &sc ); - - if( i_ret < 0 || sc.uscsi_status ) - { - i_ret = -1; - } - -#elif defined( DARWIN_DVD_IOCTL ) - INIT_DVDIOCTL( dk_dvd_send_key_t, DVDRegionPlaybackControlInfo, - kDVDKeyFormatSetRegion ); - - dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; - dvdbs.driveRegion = i_pdrc; - - i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd ); - -#elif defined( WIN32 ) - if( WIN2K ) /* NT/2k/XP */ - { - INIT_SPTD( GPCMD_SEND_KEY, 8 ); - - sptd.Cdb[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = SEND_SPTD( i_fd, &sptd, &tmp ); - } - else - { - INIT_SSC( GPCMD_SEND_KEY, 8 ); - - ssc.CDBByte[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = WinSendSSC( i_fd, &ssc ); - } - -#elif defined( __QNXNTO__ ) - - INIT_CPT( GPCMD_SEND_KEY, 8 ); - - p_cpt->cam_cdb[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); - -#elif defined( SYS_OS2 ) - INIT_SSC( GPCMD_SEND_KEY, 8 ); - - sdc.command[ 10 ] = DVD_SEND_RPC; - - p_buffer[ 1 ] = 6; - p_buffer[ 4 ] = i_pdrc; - - i_ret = DosDevIOCtl( i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, - &sdc, sizeof(sdc), &ulParamLen, - p_buffer, sizeof(p_buffer), &ulDataLen ); - -#else -# error "DVD ioctls are unavailable on this system" - -#endif - return i_ret; -} - /* Local prototypes */ -#if defined( SYS_BEOS ) +#if defined( __BEOS__ ) /***************************************************************************** * BeInitRDC: initialize a RDC structure for the BeOS kernel ***************************************************************************** @@ -1872,7 +1706,7 @@ /***************************************************************************** * SolarisInitUSCSI: initialize a USCSICMD structure for the Solaris kernel ***************************************************************************** - * This function initializes a Solaris userspace scsi command structure for + * This function initializes a Solaris userspace SCSI command structure for * future use, either a read command or a write command. *****************************************************************************/ static void SolarisInitUSCSI( struct uscsi_cmd *p_sc, int i_type ) @@ -1917,8 +1751,8 @@ * * 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 + * smedia_uscsi_cmd() function (on Solaris releases up to and including + * Solaris 8). Fortunately, 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 ) @@ -2093,7 +1927,7 @@ } #endif -#if defined( SYS_OS2 ) +#if defined( __OS2__ ) /***************************************************************************** * OS2InitSDC: initialize a SDC structure for the Execute SCSI-command ***************************************************************************** diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/ioctl.h --- a/libdvdcss/ioctl.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/ioctl.h Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * ioctl.h: DVD ioctl replacement function ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id$ * * Authors: Sam Hocevar * @@ -35,7 +34,6 @@ int ioctl_SendChallenge ( int, int *, uint8_t * ); int ioctl_SendKey2 ( int, int *, uint8_t * ); int ioctl_ReportRPC ( int, int *, int *, int * ); -int ioctl_SendRPC ( int, int ); #define DVD_KEY_SIZE 5 #define DVD_CHALLENGE_SIZE 10 @@ -44,11 +42,10 @@ /***************************************************************************** * Common macro, BeOS specific *****************************************************************************/ -#if defined( SYS_BEOS ) +#if defined( __BEOS__ ) #define INIT_RDC( TYPE, SIZE ) \ - raw_device_command rdc; \ + raw_device_command rdc = { 0 }; \ uint8_t p_buffer[ (SIZE)+1 ]; \ - memset( &rdc, 0, sizeof( raw_device_command ) ); \ rdc.data = (char *)p_buffer; \ rdc.data_length = (SIZE); \ BeInitRDC( &rdc, (TYPE) ); @@ -59,9 +56,8 @@ *****************************************************************************/ #if defined( HPUX_SCTL_IO ) #define INIT_SCTL_IO( TYPE, SIZE ) \ - struct sctl_io sctl_io; \ + struct sctl_io sctl_io = { 0 }; \ uint8_t p_buffer[ (SIZE)+1 ]; \ - memset( &sctl_io, 0, sizeof( sctl_io ) ); \ sctl_io.data = (void *)p_buffer; \ sctl_io.data_length = (SIZE); \ HPUXInitSCTL( &sctl_io, (TYPE) ); @@ -74,10 +70,9 @@ #define USCSI_TIMEOUT( SC, TO ) ( (SC)->uscsi_timeout = (TO) ) #define USCSI_RESID( SC ) ( (SC)->uscsi_resid ) #define INIT_USCSI( TYPE, SIZE ) \ - struct uscsi_cmd sc; \ + struct uscsi_cmd sc = { 0 }; \ union scsi_cdb rs_cdb; \ uint8_t p_buffer[ (SIZE)+1 ]; \ - memset( &sc, 0, sizeof( struct uscsi_cmd ) ); \ sc.uscsi_cdb = (caddr_t)&rs_cdb; \ sc.uscsi_bufaddr = (caddr_t)p_buffer; \ sc.uscsi_buflen = (SIZE); \ @@ -89,10 +84,8 @@ *****************************************************************************/ #if defined( DARWIN_DVD_IOCTL ) #define INIT_DVDIOCTL( DKDVD_TYPE, BUFFER_TYPE, FORMAT ) \ - DKDVD_TYPE dvd; \ - BUFFER_TYPE dvdbs; \ - memset( &dvd, 0, sizeof(dvd) ); \ - memset( &dvdbs, 0, sizeof(dvdbs) ); \ + DKDVD_TYPE dvd = { 0 }; \ + BUFFER_TYPE dvdbs = { 0 }; \ dvd.format = FORMAT; \ dvd.buffer = &dvdbs; \ dvd.bufferLength = sizeof(dvdbs); @@ -104,9 +97,8 @@ #if defined( WIN32 ) #define INIT_SPTD( TYPE, SIZE ) \ DWORD tmp; \ - SCSI_PASS_THROUGH_DIRECT sptd; \ + SCSI_PASS_THROUGH_DIRECT sptd = { 0 }; \ uint8_t p_buffer[ (SIZE) ]; \ - memset( &sptd, 0, sizeof( SCSI_PASS_THROUGH_DIRECT ) ); \ sptd.Length = sizeof( SCSI_PASS_THROUGH_DIRECT ); \ sptd.DataBuffer = p_buffer; \ sptd.DataTransferLength = (SIZE); \ @@ -117,10 +109,9 @@ (SPTD), sizeof( SCSI_PASS_THROUGH_DIRECT ), \ (TMP), NULL ) ? 0 : -1) #define INIT_SSC( TYPE, SIZE ) \ - struct SRB_ExecSCSICmd ssc; \ + struct SRB_ExecSCSICmd ssc = { 0 }; \ uint8_t p_buffer[ (SIZE)+1 ]; \ - memset( &ssc, 0, sizeof( struct SRB_ExecSCSICmd ) ); \ - ssc.SRB_BufPointer = (char *)p_buffer; \ + ssc.SRB_BufPointer = (unsigned char *)p_buffer; \ ssc.SRB_BufLen = (SIZE); \ WinInitSSC( &ssc, (TYPE) ); #endif @@ -130,12 +121,11 @@ *****************************************************************************/ #if defined( __QNXNTO__ ) #define INIT_CPT( TYPE, SIZE ) \ - CAM_PASS_THRU * p_cpt; \ + CAM_PASS_THRU * p_cpt = { 0 }; \ uint8_t * p_buffer; \ int structSize = sizeof( CAM_PASS_THRU ) + (SIZE); \ p_cpt = (CAM_PASS_THRU *) malloc ( structSize ); \ p_buffer = (uint8_t *) p_cpt + sizeof( CAM_PASS_THRU ); \ - memset( p_cpt, 0, structSize ); \ p_cpt->cam_data_ptr = sizeof( CAM_PASS_THRU ); \ p_cpt->cam_dxfer_len = (SIZE); \ QNXInitCPT( p_cpt, (TYPE) ); @@ -144,14 +134,12 @@ /***************************************************************************** * Common macro, OS2 specific *****************************************************************************/ -#if defined( SYS_OS2 ) +#if defined( __OS2__ ) #define INIT_SSC( TYPE, SIZE ) \ - struct OS2_ExecSCSICmd sdc; \ - uint8_t p_buffer[ (SIZE)+1 ]; \ + struct OS2_ExecSCSICmd sdc = { 0 }; \ + uint8_t p_buffer[ (SIZE) + 1 ] = { 0 }; \ unsigned long ulParamLen; \ unsigned long ulDataLen; \ - memset( &sdc, 0, sizeof( OS2_ExecSCSICmd ) ); \ - memset( &p_buffer, 0, SIZE ); \ sdc.data_length = (SIZE); \ ulParamLen = sizeof(sdc); \ OS2InitSDC( &sdc, (TYPE) ) @@ -168,30 +156,28 @@ /***************************************************************************** * Various DVD I/O tables *****************************************************************************/ -#if defined( SYS_BEOS ) || defined( WIN32 ) || defined ( SOLARIS_USCSI ) || defined ( HPUX_SCTL_IO ) || defined ( __QNXNTO__ ) || defined ( SYS_OS2 ) - /* The generic packet command opcodes for CD/DVD Logical Units, - * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ -# define GPCMD_READ_DVD_STRUCTURE 0xad -# define GPCMD_REPORT_KEY 0xa4 -# define GPCMD_SEND_KEY 0xa3 - /* DVD struct types */ -# define DVD_STRUCT_PHYSICAL 0x00 -# define DVD_STRUCT_COPYRIGHT 0x01 -# define DVD_STRUCT_DISCKEY 0x02 -# define DVD_STRUCT_BCA 0x03 -# define DVD_STRUCT_MANUFACT 0x04 - /* Key formats */ -# define DVD_REPORT_AGID 0x00 -# define DVD_REPORT_CHALLENGE 0x01 -# define DVD_SEND_CHALLENGE 0x01 -# define DVD_REPORT_KEY1 0x02 -# define DVD_SEND_KEY2 0x03 -# define DVD_REPORT_TITLE_KEY 0x04 -# define DVD_REPORT_ASF 0x05 -# define DVD_SEND_RPC 0x06 -# define DVD_REPORT_RPC 0x08 -# define DVD_INVALIDATE_AGID 0x3f -#endif +/* The generic packet command opcodes for CD/DVD Logical Units, + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ +#define GPCMD_READ_DVD_STRUCTURE 0xad +#define GPCMD_REPORT_KEY 0xa4 +#define GPCMD_SEND_KEY 0xa3 + /* DVD struct types */ +#define DVD_STRUCT_PHYSICAL 0x00 +#define DVD_STRUCT_COPYRIGHT 0x01 +#define DVD_STRUCT_DISCKEY 0x02 +#define DVD_STRUCT_BCA 0x03 +#define DVD_STRUCT_MANUFACT 0x04 + /* Key formats */ +#define DVD_REPORT_AGID 0x00 +#define DVD_REPORT_CHALLENGE 0x01 +#define DVD_SEND_CHALLENGE 0x01 +#define DVD_REPORT_KEY1 0x02 +#define DVD_SEND_KEY2 0x03 +#define DVD_REPORT_TITLE_KEY 0x04 +#define DVD_REPORT_ASF 0x05 +#define DVD_SEND_RPC 0x06 +#define DVD_REPORT_RPC 0x08 +#define DVDCSS_INVALIDATE_AGID 0x3f /***************************************************************************** * win32 ioctl specific @@ -408,7 +394,7 @@ /***************************************************************************** * OS2 ioctl specific *****************************************************************************/ -#if defined( SYS_OS2 ) +#if defined( __OS2__ ) #define CDROMDISK_EXECMD 0x7A diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/libdvdcss.c --- a/libdvdcss/libdvdcss.c Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/libdvdcss.c Sat Mar 23 14:32:26 2013 +0000 @@ -5,7 +5,6 @@ * Håkan Hjort * * Copyright (C) 1998-2008 VideoLAN - * $Id$ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +30,7 @@ * device without having to bother about the decryption. The important features * are: * \li portability: currently supported platforms are GNU/Linux, FreeBSD, - * NetBSD, OpenBSD, BSD/OS, BeOS, Windows 95/98, Windows NT/2000, MacOS X, + * NetBSD, OpenBSD, BeOS, Windows 98/ME, Windows NT/2000/XP, Mac OS X, * Solaris, HP-UX and OS/2. * \li adaptability: unlike most similar projects, libdvdcss doesn't require * the region of your drive to be set and will try its best to read from @@ -50,7 +49,7 @@ * * \section env Environment variables * - * Some environment variables can be used to change the behaviour of + * Some environment variables can be used to change the behavior of * \e libdvdcss without having to modify the program which uses it. These * variables are: * @@ -120,8 +119,8 @@ # include #endif -#ifdef HAVE_DIRECT_H -# include +#if defined(_WIN32_IE) && _WIN32_IE >= 0x500 +# include #endif #include "dvdcss/dvdcss.h" @@ -132,17 +131,10 @@ #include "ioctl.h" #include "device.h" -/** - * \brief Symbol for version checks. - * - * The name of this symbol contains the library major number, which makes it - * easy to check which \e libdvdcss development headers are installed on the - * system with tools such as autoconf. - * - * The variable itself contains the exact version number of the library, - * which can be useful for specific feature needs. - */ -char * dvdcss_interface_2 = VERSION; +#ifdef HAVE_BROKEN_MKDIR +#include +#define mkdir(a, b) _mkdir(a) +#endif /** * \brief Open a DVD device or directory and return a dvdcss instance. @@ -166,7 +158,7 @@ char *psz_method = getenv( "DVDCSS_METHOD" ); char *psz_verbose = getenv( "DVDCSS_VERBOSE" ); char *psz_cache = getenv( "DVDCSS_CACHE" ); -#if !defined(WIN32) && !defined(SYS_OS2) +#ifdef DVDCSS_RAW_OPEN char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" ); #endif @@ -184,7 +176,7 @@ /* * Initialize structure with default values */ -#if !defined(WIN32) && !defined(SYS_OS2) +#ifdef DVDCSS_RAW_OPEN dvdcss->i_raw_fd = -1; #endif dvdcss->p_titles = NULL; @@ -238,42 +230,15 @@ */ if( psz_cache == NULL || psz_cache[0] == '\0' ) { -#ifdef WIN32 - typedef HRESULT( WINAPI *SHGETFOLDERPATH ) - ( HWND, int, HANDLE, DWORD, LPTSTR ); - -# define CSIDL_FLAG_CREATE 0x8000 -# define CSIDL_APPDATA 0x1A -# define SHGFP_TYPE_CURRENT 0 - +#if defined(_WIN32_IE) && _WIN32_IE >= 0x500 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 ) - { - *psz_home = '\0'; - } - } - FreeLibrary( p_dll ); - } /* Cache our keys in * C:\Documents and Settings\$USER\Application Data\dvdcss\ */ - if( *psz_home ) + if (SHGetFolderPathA (NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, + NULL, SHGFP_TYPE_CURRENT, psz_home ) == S_OK) { - snprintf( psz_buffer, PATH_MAX, "%s/dvdcss", psz_home ); + snprintf( psz_buffer, PATH_MAX, "%s\\dvdcss", psz_home ); psz_buffer[PATH_MAX-1] = '\0'; psz_cache = psz_buffer; } @@ -304,7 +269,7 @@ { int home_pos = 0; -#ifdef SYS_OS2 +#ifdef __OS2__ if( *psz_home == '/' || *psz_home == '\\') { char *psz_unixroot = getenv("UNIXROOT"); @@ -362,9 +327,30 @@ if( dvdcss->b_ioctls ) { - _dvdcss_test( dvdcss ); + 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; + } } + memset( dvdcss->css.p_disc_key, 0, KEY_SIZE ); /* If disc is CSS protected and the ioctls work, authenticate the drive */ if( dvdcss->b_scrambled && dvdcss->b_ioctls ) { @@ -375,15 +361,12 @@ print_debug( dvdcss, "could not get disc key" ); } } - else - { - memset( dvdcss->css.p_disc_key, 0, KEY_SIZE ); - } /* If the cache is enabled, write the cache directory tag */ if( psz_cache ) { - char *psz_tag = "Signature: 8a477f597d28d172789f06886806bc55\r\n" + static const char psz_tag[] = + "Signature: 8a477f597d28d172789f06886806bc55\r\n" "# This file is a cache directory tag created by libdvdcss.\r\n" "# For information about cache directory tags, see:\r\n" "# http://www.brynosaurus.com/cachedir/\r\n"; @@ -394,7 +377,12 @@ i_fd = open( psz_tagfile, O_RDWR|O_CREAT, 0644 ); if( i_fd >= 0 ) { - write( i_fd, psz_tag, strlen(psz_tag) ); + size_t len = strlen(psz_tag); + if( write( i_fd, psz_tag, len ) < (long)len ) + { + print_error( dvdcss, + "Error writing cache directory tag, continuing..\n" ); + } close( i_fd ); } } @@ -500,11 +488,7 @@ /* We have a disc name or ID, we can create the cache dir */ i = sprintf( dvdcss->psz_cachefile, "%s", psz_cache ); -#if !defined( WIN32 ) || defined( SYS_CYGWIN ) i_ret = mkdir( dvdcss->psz_cachefile, 0755 ); -#else - i_ret = mkdir( dvdcss->psz_cachefile ); -#endif if( i_ret < 0 && errno != EEXIST ) { print_error( dvdcss, "failed creating cache directory" ); @@ -514,11 +498,7 @@ i += sprintf( dvdcss->psz_cachefile + i, "/%s-%s%s", psz_title, psz_serial, psz_key ); -#if !defined( WIN32 ) || defined( SYS_CYGWIN ) i_ret = mkdir( dvdcss->psz_cachefile, 0755 ); -#else - i_ret = mkdir( dvdcss->psz_cachefile ); -#endif if( i_ret < 0 && errno != EEXIST ) { print_error( dvdcss, "failed creating cache subdirectory" ); @@ -535,7 +515,7 @@ } nocache: -#if !defined(WIN32) && !defined(SYS_OS2) +#ifdef DVDCSS_RAW_OPEN if( psz_raw_device != NULL ) { _dvdcss_raw_open( dvdcss, psz_raw_device ); @@ -569,7 +549,7 @@ * * \param dvdcss a \e libdvdcss instance. * \param i_blocks an absolute block offset to seek to. - * \param i_flags #DVDCSS_NOFLAGS, optionally ored with one of #DVDCSS_SEEK_KEY + * \param i_flags #DVDCSS_NOFLAGS, optionally ORed with one of #DVDCSS_SEEK_KEY * or #DVDCSS_SEEK_MPEG. * \return the new position in blocks, or a negative value in case an error * happened. @@ -579,13 +559,12 @@ * You typically set \p i_flags to #DVDCSS_NOFLAGS when seeking in a .IFO. * * If #DVDCSS_SEEK_MPEG is specified in \p i_flags and if \e libdvdcss finds it - * reasonable to do so (ie, if the dvdcss method is not "title"), the current + * reasonable to do so (i.e., if the dvdcss method is not "title"), the current * title key will be checked and a new one will be calculated if necessary. * This flag is typically used when reading data from a VOB. * * If #DVDCSS_SEEK_KEY is specified, the title key will be always checked, - * even with the "title" method. This is equivalent to using the now - * deprecated dvdcss_title() call. This flag is typically used when seeking + * even with the "title" method. This flag is typically used when seeking * in a new title. */ LIBDVDCSS_EXPORT int dvdcss_seek ( dvdcss_t dvdcss, int i_blocks, int i_flags ) @@ -611,7 +590,7 @@ * \param dvdcss a \e libdvdcss instance. * \param p_buffer a buffer that will contain the data read from the disc. * \param i_blocks the amount of blocks to read. - * \param i_flags #DVDCSS_NOFLAGS, optionally ored with #DVDCSS_READ_DECRYPT. + * \param i_flags #DVDCSS_NOFLAGS, optionally ORed with #DVDCSS_READ_DECRYPT. * \return the amount of blocks read, or a negative value in case an * error happened. * @@ -681,7 +660,7 @@ * \param p_iovec a pointer to an array of iovec structures that will contain * the data read from the disc. * \param i_blocks the amount of blocks to read. - * \param i_flags #DVDCSS_NOFLAGS, optionally ored with #DVDCSS_READ_DECRYPT. + * \param i_flags #DVDCSS_NOFLAGS, optionally ORed with #DVDCSS_READ_DECRYPT. * \return the amount of blocks read, or a negative value in case an * error happened. * @@ -786,15 +765,6 @@ return 0; } -/* - * Deprecated. See dvdcss_seek(). - */ -#undef dvdcss_title -LIBDVDCSS_EXPORT int dvdcss_title ( dvdcss_t dvdcss, int i_block ) -{ - return _dvdcss_title( dvdcss, i_block ); -} - /** * \brief Return 1 if the DVD is scrambled, 0 otherwise. * diff -r 9b4ba0fb999b -r 691431d2289e libdvdcss/libdvdcss.h --- a/libdvdcss/libdvdcss.h Sat Mar 23 00:50:51 2013 +0000 +++ b/libdvdcss/libdvdcss.h Sat Mar 23 14:32:26 2013 +0000 @@ -2,7 +2,6 @@ * libdvdcss.h: private DVD reading library data ***************************************************************************** * Copyright (C) 1998-2001 VideoLAN - * $Id$ * * Authors: Stéphane Borel * Sam Hocevar @@ -27,8 +26,7 @@ #include "dvdcss/dvdcss.h" #include "css.h" - -struct iovec; +#include "device.h" /***************************************************************************** * The libdvdcss structure @@ -68,7 +66,7 @@ int i_readv_buf_size; #endif -#if !defined(WIN32) && !defined(SYS_OS2) +#ifdef DVDCSS_RAW_OPEN int i_raw_fd; #endif }; diff -r 9b4ba0fb999b -r 691431d2289e stream/stream.h --- a/stream/stream.h Sat Mar 23 00:50:51 2013 +0000 +++ b/stream/stream.h Sat Mar 23 14:32:26 2013 +0000 @@ -29,10 +29,6 @@ #include #include -#ifndef O_BINARY -#define O_BINARY 0 -#endif - #define STREAMTYPE_DUMMY -1 // for placeholders, when the actual reading is handled in the demuxer #define STREAMTYPE_FILE 0 // read from seekable file #define STREAMTYPE_VCD 1 // raw mode-2 CDROM reading, 2324 bytes/sector