changeset 35952:691431d2289e

Update internal libdvdcss to Git revision 39e0e2b.
author diego
date Sat, 23 Mar 2013 14:32:26 +0000
parents 9b4ba0fb999b
children 2211ce940290
files Copyright Makefile configure libdvdcss/bsdi_dvd.h libdvdcss/common.h libdvdcss/css.c libdvdcss/css.h libdvdcss/csstables.h libdvdcss/device.c libdvdcss/device.h libdvdcss/dvdcss/dvdcss.h libdvdcss/error.c libdvdcss/ioctl.c libdvdcss/ioctl.h libdvdcss/libdvdcss.c libdvdcss/libdvdcss.h stream/stream.h
diffstat 17 files changed, 329 insertions(+), 904 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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)
 
--- 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
--- 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 <sys/cdefs.h>
-#include <machine/endian.h>
-#include <sys/ioctl.h>
-
-__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 */
--- 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 <sam@via.ecp.fr>
  *          Vincent Seguin <seguin@via.ecp.fr>
@@ -34,11 +33,6 @@
 #   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;
@@ -48,6 +42,7 @@
 #endif
 
 #if defined( WIN32 )
+#   include <io.h>                                             /* _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
--- 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 <stef@via.ecp.fr>
  *          Håkan Hjort <d95hjort@dtek.chalmers.se>
@@ -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 )
     {
--- 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 <stef@via.ecp.fr>
  *
@@ -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 */
--- 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 <stef@via.ecp.fr>
  *
@@ -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,
--- 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 <stef@via.ecp.fr>
  *          Sam Hocevar <sam@zoy.org>
@@ -49,12 +48,6 @@
 #   include <limits.h>
 #endif
 
-#if defined( WIN32 ) && !defined( SYS_CYGWIN )
-#   include <io.h>                                                 /* read() */
-#else
-#   include <sys/uio.h>                                      /* struct iovec */
-#endif
-
 #ifdef DARWIN_DVD_IOCTL
 #   include <paths.h>
 #   include <CoreFoundation/CoreFoundation.h>
@@ -65,7 +58,7 @@
 #   include <IOKit/storage/IODVDMedia.h>
 #endif
 
-#ifdef SYS_OS2
+#ifdef __OS2__
 #   define INCL_DOS
 #   define INCL_DOSDEVIOCTL
 #   include <os2.h>
@@ -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,
--- 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 <stef@via.ecp.fr>
  *          Sam Hocevar <sam@zoy.org>
@@ -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 <io.h>                                                 /* read() */
+struct iovec
+{
+    void *iov_base;     /* Pointer to data. */
+    size_t iov_len;     /* Length of data.  */
+};
 #else
 #   include <sys/types.h>
 #   include <sys/uio.h>                                      /* 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 */
--- 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
--- 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 <sam@zoy.org>
  *
--- 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 <ltlBeBoy@beosmail.com>
  *          Sam Hocevar <sam@zoy.org>
@@ -41,7 +40,7 @@
 #if defined( WIN32 )
 #   include <windows.h>
 #   include <winioctl.h>
-#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 <dvd.h>
 #endif
-#ifdef DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H
-#   include "bsdi_dvd.h"
-#endif
-#ifdef SYS_BEOS
+#ifdef __BEOS__
 #   include <malloc.h>
 #   include <scsi.h>
 #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
  *****************************************************************************
--- 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 <sam@zoy.org>
  *
@@ -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
 
--- 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 <d95hjort@dtek.chalmers.se>
  *
  * 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 <limits.h>
 #endif
 
-#ifdef HAVE_DIRECT_H
-#   include <direct.h>
+#if defined(_WIN32_IE) && _WIN32_IE >= 0x500
+#   include <shlobj.h>
 #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 <direct.h>
+#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.
  *
--- 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 <stef@via.ecp.fr>
  *          Sam Hocevar <sam@zoy.org>
@@ -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
 };
--- 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 <sys/types.h>
 #include <fcntl.h>
 
-#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