* 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
# 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
*****************************************************************************/
*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 );
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 );
#elif defined( SYS_BEOS )
i_ret = -1;
+#elif defined( HPUX_SCTL_IO )
+ i_ret = -1;
+
#elif defined( SOLARIS_USCSI )
i_ret = -1;
*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 );
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 );
*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 );
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 );
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 );
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 );
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 );
}
#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