]> git.sesse.net Git - vlc/blobdiff - extras/libdvdcss/ioctl.c
* Added vlc-arts to the debian package generation.
[vlc] / extras / libdvdcss / ioctl.c
index fe26db05f9bc12b29814ffae864e5e12fe810dc9..7b18d172bf19225dd178d3c5fa8dddb096f3843f 100644 (file)
@@ -2,13 +2,14 @@
  * ioctl.c: DVD ioctl replacement function
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: ioctl.c,v 1.15 2001/12/09 17:01:35 sam Exp $
+ * $Id: ioctl.c,v 1.16 2001/12/11 14:43:38 sam Exp $
  *
  * Authors: Markus Kuespert <ltlBeBoy@beosmail.com>
  *          Samuel Hocevar <sam@zoy.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Håkan Hjort <d95hjort@dtek.chalmers.se>
  *          Eugenio Jarosiewicz <ej0@cise.ufl.edu>
+ *          David Siebörger <drs-videolan@rucus.ru.ac.za>
  *
  * 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
@@ -62,6 +63,9 @@
 #   include <malloc.h>
 #   include <scsi.h>
 #endif
+#ifdef HPUX_SCTL_IO
+#   include <sys/scsi.h>
+#endif
 #ifdef SOLARIS_USCSI
 #   include <unistd.h>
 #   include <stropts.h>
 static void BeInitRDC ( raw_device_command *, int );
 #endif
 
+/*****************************************************************************
+ * Local prototypes, HP-UX specific
+ *****************************************************************************/
+#if defined( HPUX_SCTL_IO )
+static void HPUXInitSCTL ( struct sctl_io *sctl_io, int i_type );
+#endif
+
 /*****************************************************************************
  * Local prototypes, Solaris specific
  *****************************************************************************/
@@ -138,6 +149,16 @@ int ioctl_ReadCopyright( int i_fd, int i_layer, int *pi_copyright )
 
     *pi_copyright = p_buffer[ 4 ];
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_READ_DVD_STRUCTURE, 8 );
+
+    sctl_io.cdb[ 6 ] = i_layer;
+    sctl_io.cdb[ 7 ] = DVD_STRUCT_COPYRIGHT;
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    *pi_copyright = p_buffer[ 4 ];
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_READ_DVD_STRUCTURE, 8 );
     
@@ -290,6 +311,21 @@ int ioctl_ReadDiscKey( int i_fd, int *pi_agid, u8 *p_key )
 
     memcpy( p_key, p_buffer + 4, 2048 );
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_READ_DVD_STRUCTURE, 2048 + 4 );
+
+    sctl_io.cdb[ 7 ]  = DVD_STRUCT_DISCKEY;
+    sctl_io.cdb[ 10 ] = *pi_agid << 6;
+    
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    if( i_ret < 0 )
+    {
+        return i_ret;
+    }
+
+    memcpy( p_key, p_buffer + 4, 2048 );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_READ_DVD_STRUCTURE, 2048 + 4 );
     
@@ -405,6 +441,9 @@ int ioctl_ReadTitleKey( int i_fd, int *pi_agid, int i_pos, u8 *p_key )
 #elif defined( SYS_BEOS )
     i_ret = -1;
 
+#elif defined( HPUX_SCTL_IO )
+    i_ret = -1;
+
 #elif defined( SOLARIS_USCSI )
     i_ret = -1;
 
@@ -479,6 +518,15 @@ int ioctl_ReportAgid( int i_fd, int *pi_agid )
 
     *pi_agid = p_buffer[ 7 ] >> 6;
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 );
+
+    sctl_io.cdb[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6);
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    *pi_agid = p_buffer[ 7 ] >> 6;
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_REPORT_KEY, 8 );
     
@@ -580,6 +628,15 @@ int ioctl_ReportChallenge( int i_fd, int *pi_agid, u8 *p_challenge )
 
     memcpy( p_challenge, p_buffer + 4, 12 );
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_REPORT_KEY, 16 );
+
+    sctl_io.cdb[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6);
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    memcpy( p_challenge, p_buffer + 4, 12 );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_REPORT_KEY, 16 );
     
@@ -694,6 +751,15 @@ int ioctl_ReportASF( int i_fd, int *pi_agid, int *pi_asf )
 
     *pi_asf = p_buffer[ 7 ] & 1;
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 );
+
+    sctl_io.cdb[ 10 ] = DVD_REPORT_ASF | (*pi_agid << 6);
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    *pi_asf = p_buffer[ 7 ] & 1;
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_REPORT_KEY, 8 );
     
@@ -809,6 +875,15 @@ int ioctl_ReportKey1( int i_fd, int *pi_agid, u8 *p_key )
 
     memcpy( p_key, p_buffer + 4, 8 );
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_REPORT_KEY, 12 );
+
+    sctl_io.cdb[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6);
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
+    memcpy( p_key, p_buffer + 4, 8 );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_REPORT_KEY, 12 );
     
@@ -914,6 +989,13 @@ int ioctl_InvalidateAgid( int i_fd, int *pi_agid )
 
     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);
+
+    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_REPORT_KEY, 0 );
     
@@ -1016,6 +1098,16 @@ int ioctl_SendChallenge( int i_fd, int *pi_agid, u8 *p_challenge )
 
     return ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_SEND_KEY, 16 );
+
+    sctl_io.cdb[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);
+
+    p_buffer[ 1 ] = 0xe;
+    memcpy( p_buffer + 4, p_challenge, 12 );
+
+    return ioctl( i_fd, SIOC_IO, &sctl_io );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_SEND_KEY, 16 );
     
@@ -1126,6 +1218,16 @@ int ioctl_SendKey2( int i_fd, int *pi_agid, u8 *p_key )
 
     return ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
 
+#elif defined( HPUX_SCTL_IO )
+    INIT_SCTL_IO( GPCMD_SEND_KEY, 12 );
+
+    sctl_io.cdb[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);
+
+    p_buffer[ 1 ] = 0xa;
+    memcpy( p_buffer + 4, p_key, 8 );
+
+    return ioctl( i_fd, SIOC_IO, &sctl_io );
+
 #elif defined( SOLARIS_USCSI )
     INIT_USCSI( GPCMD_SEND_KEY, 12 );
     
@@ -1237,6 +1339,39 @@ static void BeInitRDC( raw_device_command *p_rdc, int i_type )
 }
 #endif
 
+#if defined( HPUX_SCTL_IO )
+/*****************************************************************************
+ * HPUXInitSCTL: initialize a sctl_io structure for the HP-UX kernel
+ *****************************************************************************
+ * This function initializes a HP-UX command structure for future
+ * use, either a read command or a write command.
+ *****************************************************************************/
+static void HPUXInitSCTL( struct sctl_io *sctl_io, int i_type )
+{
+    memset( sctl_io->data, 0, sctl_io->data_length );
+
+    switch( i_type )
+    {
+        case GPCMD_SEND_KEY:
+            /* leave the flags to 0 */
+            break;
+
+        case GPCMD_READ_DVD_STRUCTURE:
+        case GPCMD_REPORT_KEY:
+            sctl_io->flags = SCTL_READ;
+            break;
+    }
+
+    sctl_io->cdb[ 0 ]        = i_type;
+
+    sctl_io->cdb[ 8 ]        = (sctl_io->data_length >> 8) & 0xff;
+    sctl_io->cdb[ 9 ]        =  sctl_io->data_length       & 0xff;
+    sctl_io->cdb_length      = 12;
+
+    sctl_io->max_msecs       = 1000000;
+}
+#endif
+
 #if defined( SOLARIS_USCSI )
 /*****************************************************************************
  * SolarisInitUSCSI: initialize a USCSICMD structure for the Solaris kernel