dvd_ioctl.c 12.8 KB
Newer Older
Sam Hocevar's avatar
 
Sam Hocevar committed
1 2 3 4
/*****************************************************************************
 * dvd_ioctl.c: DVD ioctl replacement function
 *****************************************************************************
 * Copyright (C) 1999-2001 VideoLAN
Sam Hocevar's avatar
 
Sam Hocevar committed
5
 * $Id: dvd_ioctl.c,v 1.7 2001/04/06 09:15:47 sam Exp $
Sam Hocevar's avatar
 
Sam Hocevar committed
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * Authors: Markus Kuespert <ltlBeBoy@beosmail.com>
 *          Samuel Hocevar <sam@zoy.org>
 *
 * 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
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include "defs.h"

Sam Hocevar's avatar
 
Sam Hocevar committed
30
#include <string.h>                                    /* memcpy(), memset() */
Sam Hocevar's avatar
 
Sam Hocevar committed
31
#include <sys/types.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
32
#include <netinet/in.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
33

Sam Hocevar's avatar
 
Sam Hocevar committed
34
#ifdef HAVE_SYS_DVDIO_H
Sam Hocevar's avatar
 
Sam Hocevar committed
35
#   include <sys/ioctl.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
36 37 38
#   include <sys/dvdio.h>
#endif
#ifdef LINUX_DVD
Sam Hocevar's avatar
 
Sam Hocevar committed
39
#   include <sys/ioctl.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
40 41 42
#   include <linux/cdrom.h>
#endif
#ifdef SYS_BEOS
Sam Hocevar's avatar
 
Sam Hocevar committed
43
#   include <sys/ioctl.h>
Sam Hocevar's avatar
 
Sam Hocevar committed
44 45 46
#   include <malloc.h>
#   include <scsi.h>
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
47 48 49
#ifdef SYS_DARWIN1_3
#   include <sys/ioctl.h>
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
50 51

#include "common.h"
Sam Hocevar's avatar
 
Sam Hocevar committed
52

Sam Hocevar's avatar
 
Sam Hocevar committed
53 54
#include "intf_msg.h"

Sam Hocevar's avatar
 
Sam Hocevar committed
55 56 57 58
#ifdef SYS_DARWIN1_3
#   include "DVDioctl/DVDioctl.h"
#endif

Sam Hocevar's avatar
 
Sam Hocevar committed
59
#include "dvd_css.h"
Sam Hocevar's avatar
 
Sam Hocevar committed
60 61 62
#include "dvd_ioctl.h"

/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
63
 * Local prototypes - BeOS specific
Sam Hocevar's avatar
 
Sam Hocevar committed
64 65
 *****************************************************************************/
#if defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
66
static void BeInitRDC ( raw_device_command *, void *, int );
Sam Hocevar's avatar
 
Sam Hocevar committed
67 68 69
#endif

/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
70
 * ioctl_ReadCopyright: check whether the disc is encrypted or not
Sam Hocevar's avatar
 
Sam Hocevar committed
71
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
72
int ioctl_ReadCopyright( int i_fd, int i_layer, int *pi_copyright )
Sam Hocevar's avatar
 
Sam Hocevar committed
73
{
Sam Hocevar's avatar
 
Sam Hocevar committed
74
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
75

Sam Hocevar's avatar
 
Sam Hocevar committed
76 77
#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
    dvd_struct dvd;
Sam Hocevar's avatar
 
Sam Hocevar committed
78

Sam Hocevar's avatar
 
Sam Hocevar committed
79 80
    dvd.type = DVD_STRUCT_COPYRIGHT;
    dvd.copyright.layer_num = i_layer;
Sam Hocevar's avatar
 
Sam Hocevar committed
81

Sam Hocevar's avatar
 
Sam Hocevar committed
82
    i_ret = ioctl( i_fd, DVD_READ_STRUCT, &dvd );
Sam Hocevar's avatar
 
Sam Hocevar committed
83

Sam Hocevar's avatar
 
Sam Hocevar committed
84
    *pi_copyright = dvd.copyright.cpst;
Sam Hocevar's avatar
 
Sam Hocevar committed
85

Sam Hocevar's avatar
 
Sam Hocevar committed
86
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
87 88
    raw_device_command rdc;
    u8 p_buffer[ 8 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
89

Sam Hocevar's avatar
 
Sam Hocevar committed
90
    BeInitRDC( &rdc, p_buffer, 8 );
Sam Hocevar's avatar
 
Sam Hocevar committed
91

Sam Hocevar's avatar
 
Sam Hocevar committed
92 93 94 95
    rdc.flags        = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ] = GPCMD_READ_DVD_STRUCTURE;
    rdc.command[ 6 ] = i_layer;
    rdc.command[ 7 ] = DVD_STRUCT_COPYRIGHT;
Sam Hocevar's avatar
 
Sam Hocevar committed
96

Sam Hocevar's avatar
 
Sam Hocevar committed
97
    i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
98

Sam Hocevar's avatar
 
Sam Hocevar committed
99
    *pi_copyright = p_buffer[ 4 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
100

Sam Hocevar's avatar
 
Sam Hocevar committed
101 102
#elif defined( SYS_DARWIN1_3 )
    intf_ErrMsg( "css error: DVD ioctls not fully functional yet" );
Sam Hocevar's avatar
 
Sam Hocevar committed
103

Sam Hocevar's avatar
 
Sam Hocevar committed
104 105
    intf_ErrMsg( "css error: assuming disc is unencrypted" );
    *pi_copyright = 0;
Sam Hocevar's avatar
 
Sam Hocevar committed
106

Sam Hocevar's avatar
 
Sam Hocevar committed
107
    i_ret = 0;
Sam Hocevar's avatar
 
Sam Hocevar committed
108

Sam Hocevar's avatar
 
Sam Hocevar committed
109
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
110 111
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
112

Sam Hocevar's avatar
 
Sam Hocevar committed
113
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
114
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
115
}
Sam Hocevar's avatar
 
Sam Hocevar committed
116

Sam Hocevar's avatar
 
Sam Hocevar committed
117
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
118
 * ioctl_ReadKey: get the disc key
Sam Hocevar's avatar
 
Sam Hocevar committed
119
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
120
int ioctl_ReadKey( css_t *p_css, u8 *p_key )
Sam Hocevar's avatar
 
Sam Hocevar committed
121 122
{
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
123

Sam Hocevar's avatar
 
Sam Hocevar committed
124 125
#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
    dvd_struct dvd;
Sam Hocevar's avatar
 
Sam Hocevar committed
126

Sam Hocevar's avatar
 
Sam Hocevar committed
127 128
    dvd.type = DVD_STRUCT_DISCKEY;
    dvd.disckey.agid = p_css->i_agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
129

Sam Hocevar's avatar
 
Sam Hocevar committed
130
    memset( dvd.disckey.value, 0, 2048 );
Sam Hocevar's avatar
 
Sam Hocevar committed
131

Sam Hocevar's avatar
 
Sam Hocevar committed
132
    i_ret = ioctl( p_css->i_fd, DVD_READ_STRUCT, &dvd );
Sam Hocevar's avatar
 
Sam Hocevar committed
133

Sam Hocevar's avatar
 
Sam Hocevar committed
134 135 136 137
    if( i_ret < 0 )
    {
        return i_ret;
    }
Sam Hocevar's avatar
 
Sam Hocevar committed
138

Sam Hocevar's avatar
 
Sam Hocevar committed
139
    memcpy( p_key, dvd.disckey.value, 2048 );
Sam Hocevar's avatar
 
Sam Hocevar committed
140

Sam Hocevar's avatar
 
Sam Hocevar committed
141 142 143
#elif defined( SYS_BEOS )
    raw_device_command rdc;
    u8 p_buffer[ 2048 + 4 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
144

Sam Hocevar's avatar
 
Sam Hocevar committed
145
    BeInitRDC( &rdc, p_buffer, 2048 + 4 );
Sam Hocevar's avatar
 
Sam Hocevar committed
146

Sam Hocevar's avatar
 
Sam Hocevar committed
147 148 149 150 151 152
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_READ_DVD_STRUCTURE;
    rdc.command[ 7 ]  = DVD_STRUCT_DISCKEY;
    rdc.command[ 10 ] = p_css->i_agid << 6;
    
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
153

Sam Hocevar's avatar
 
Sam Hocevar committed
154 155 156 157
    if( i_ret < 0 )
    {
        return i_ret;
    }
Sam Hocevar's avatar
 
Sam Hocevar committed
158

Sam Hocevar's avatar
 
Sam Hocevar committed
159
    memcpy( p_key, p_buffer + 4, 2048 );
Sam Hocevar's avatar
 
Sam Hocevar committed
160

Sam Hocevar's avatar
 
Sam Hocevar committed
161
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
162 163
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
164

Sam Hocevar's avatar
 
Sam Hocevar committed
165
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
166
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
167
}
Sam Hocevar's avatar
 
Sam Hocevar committed
168

Sam Hocevar's avatar
 
Sam Hocevar committed
169
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
170
 * ioctl_LUSendAgid: get AGID from the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
171
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
172
int ioctl_LUSendAgid( css_t *p_css )
Sam Hocevar's avatar
 
Sam Hocevar committed
173 174
{
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
175 176

#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
Sam Hocevar's avatar
 
Sam Hocevar committed
177
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
178

Sam Hocevar's avatar
 
Sam Hocevar committed
179 180
    auth_info.type = DVD_LU_SEND_AGID;
    auth_info.lsa.agid = p_css->i_agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
181

Sam Hocevar's avatar
 
Sam Hocevar committed
182
    i_ret = ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
183

Sam Hocevar's avatar
 
Sam Hocevar committed
184
    p_css->i_agid = auth_info.lsa.agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
185

Sam Hocevar's avatar
 
Sam Hocevar committed
186
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
187 188
    raw_device_command rdc;
    u8 p_buffer[ 8 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
189

Sam Hocevar's avatar
 
Sam Hocevar committed
190
    BeInitRDC( &rdc, p_buffer, 8 );
Sam Hocevar's avatar
 
Sam Hocevar committed
191

Sam Hocevar's avatar
 
Sam Hocevar committed
192 193 194
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x00 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
195

Sam Hocevar's avatar
 
Sam Hocevar committed
196
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
197

Sam Hocevar's avatar
 
Sam Hocevar committed
198
    p_css->i_agid = p_buffer[ 7 ] >> 6;
Sam Hocevar's avatar
 
Sam Hocevar committed
199

Sam Hocevar's avatar
 
Sam Hocevar committed
200
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
201 202
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
203

Sam Hocevar's avatar
 
Sam Hocevar committed
204
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
205
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
206
}
Sam Hocevar's avatar
 
Sam Hocevar committed
207

Sam Hocevar's avatar
 
Sam Hocevar committed
208
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
209
 * ioctl_LUSendChallenge: get challenge from the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
210
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
211
int ioctl_LUSendChallenge( css_t *p_css, u8 *p_challenge )
Sam Hocevar's avatar
 
Sam Hocevar committed
212 213
{
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
214 215

#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
Sam Hocevar's avatar
 
Sam Hocevar committed
216
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
217

Sam Hocevar's avatar
 
Sam Hocevar committed
218
    auth_info.type = DVD_LU_SEND_CHALLENGE;
Sam Hocevar's avatar
 
Sam Hocevar committed
219

Sam Hocevar's avatar
 
Sam Hocevar committed
220
    i_ret = ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
221

Sam Hocevar's avatar
 
Sam Hocevar committed
222
    memcpy( p_challenge, auth_info.lsc.chal, sizeof(dvd_challenge) );
Sam Hocevar's avatar
 
Sam Hocevar committed
223

Sam Hocevar's avatar
 
Sam Hocevar committed
224
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
225 226
    raw_device_command rdc;
    u8 p_buffer[ 16 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
227

Sam Hocevar's avatar
 
Sam Hocevar committed
228
    BeInitRDC( &rdc, p_buffer, 16 );
Sam Hocevar's avatar
 
Sam Hocevar committed
229

Sam Hocevar's avatar
 
Sam Hocevar committed
230 231 232
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x01 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
233

Sam Hocevar's avatar
 
Sam Hocevar committed
234
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
235

Sam Hocevar's avatar
 
Sam Hocevar committed
236
    memcpy( p_challenge, p_buffer + 4, 12 );
Sam Hocevar's avatar
 
Sam Hocevar committed
237

Sam Hocevar's avatar
 
Sam Hocevar committed
238
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
239 240
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
241

Sam Hocevar's avatar
 
Sam Hocevar committed
242
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
243
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
244
}
Sam Hocevar's avatar
 
Sam Hocevar committed
245

Sam Hocevar's avatar
 
Sam Hocevar committed
246
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
247
 * ioctl_LUSendASF: get ASF from the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
248
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
249
int ioctl_LUSendASF( css_t *p_css, int *pi_asf )
Sam Hocevar's avatar
 
Sam Hocevar committed
250
{
Sam Hocevar's avatar
 
Sam Hocevar committed
251 252
    int i_ret;

Sam Hocevar's avatar
 
Sam Hocevar committed
253 254
#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
255

Sam Hocevar's avatar
 
Sam Hocevar committed
256 257 258
    auth_info.type = DVD_LU_SEND_ASF;
    auth_info.lsasf.agid = p_css->i_agid;
    auth_info.lsasf.asf = *pi_asf;
Sam Hocevar's avatar
 
Sam Hocevar committed
259

Sam Hocevar's avatar
 
Sam Hocevar committed
260
    i_ret = ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
261

Sam Hocevar's avatar
 
Sam Hocevar committed
262
    *pi_asf = auth_info.lsasf.asf;
Sam Hocevar's avatar
 
Sam Hocevar committed
263

Sam Hocevar's avatar
 
Sam Hocevar committed
264
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
265 266
    raw_device_command rdc;
    u8 p_buffer[ 8 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
267

Sam Hocevar's avatar
 
Sam Hocevar committed
268
    BeInitRDC( &rdc, p_buffer, 8 );
Sam Hocevar's avatar
 
Sam Hocevar committed
269

Sam Hocevar's avatar
 
Sam Hocevar committed
270 271 272
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x05 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
273

Sam Hocevar's avatar
 
Sam Hocevar committed
274 275 276 277 278 279 280
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );

    *pi_asf = p_buffer[ 7 ] & 1;

#elif defined( SYS_DARWIN1_3 )
    dvdioctl_data_t data;
    u8 p_buffer[ 8 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
281

Sam Hocevar's avatar
 
Sam Hocevar committed
282 283 284 285 286
    data.p_buffer = p_buffer;
    data.i_lba = 0;
    data.i_agid = p_css->i_agid;
    data.i_keyclass = kCSS_CSS2_CPRM;
    data.i_keyformat = kASF;
Sam Hocevar's avatar
 
Sam Hocevar committed
287

Sam Hocevar's avatar
 
Sam Hocevar committed
288 289 290
    i_ret = ioctl( p_css->i_fd, IODVD_REPORT_KEY, &data );

    *pi_asf = p_buffer[ 7 ] & 1;
Sam Hocevar's avatar
 
Sam Hocevar committed
291

Sam Hocevar's avatar
 
Sam Hocevar committed
292
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
293 294
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
295

Sam Hocevar's avatar
 
Sam Hocevar committed
296
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
297
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
298
}
Sam Hocevar's avatar
 
Sam Hocevar committed
299

Sam Hocevar's avatar
 
Sam Hocevar committed
300
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
301
 * ioctl_LUSendKey1: get the first key from the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
302
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
303
int ioctl_LUSendKey1( css_t *p_css, u8 *p_key )
Sam Hocevar's avatar
 
Sam Hocevar committed
304 305
{
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
306 307

#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
Sam Hocevar's avatar
 
Sam Hocevar committed
308
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
309

Sam Hocevar's avatar
 
Sam Hocevar committed
310 311
    auth_info.type = DVD_LU_SEND_KEY1;
    auth_info.lsk.agid = p_css->i_agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
312

Sam Hocevar's avatar
 
Sam Hocevar committed
313
    i_ret = ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
314

Sam Hocevar's avatar
 
Sam Hocevar committed
315
    memcpy( p_key, auth_info.lsk.key, sizeof(dvd_key) );
Sam Hocevar's avatar
 
Sam Hocevar committed
316

Sam Hocevar's avatar
 
Sam Hocevar committed
317
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
318 319
    raw_device_command rdc;
    u8 p_buffer[ 12 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
320

Sam Hocevar's avatar
 
Sam Hocevar committed
321
    BeInitRDC( &rdc, p_buffer, 12 );
Sam Hocevar's avatar
 
Sam Hocevar committed
322

Sam Hocevar's avatar
 
Sam Hocevar committed
323 324 325
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x02 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
326

Sam Hocevar's avatar
 
Sam Hocevar committed
327
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
328

Sam Hocevar's avatar
 
Sam Hocevar committed
329
    memcpy( p_key, p_buffer + 4, 8 );
Sam Hocevar's avatar
 
Sam Hocevar committed
330

Sam Hocevar's avatar
 
Sam Hocevar committed
331
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
332 333
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
334

Sam Hocevar's avatar
 
Sam Hocevar committed
335
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
336
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
337 338 339
}

/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
340
 * ioctl_InvalidateAgid: invalidate the current AGID
Sam Hocevar's avatar
 
Sam Hocevar committed
341
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
342
int ioctl_InvalidateAgid( css_t *p_css )
Sam Hocevar's avatar
 
Sam Hocevar committed
343
{
Sam Hocevar's avatar
 
Sam Hocevar committed
344
    int i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
345 346

#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
Sam Hocevar's avatar
 
Sam Hocevar committed
347
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
348

Sam Hocevar's avatar
 
Sam Hocevar committed
349 350
    auth_info.type = DVD_INVALIDATE_AGID;
    auth_info.lsa.agid = p_css->i_agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
351

Sam Hocevar's avatar
 
Sam Hocevar committed
352
    i_ret = ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
353

Sam Hocevar's avatar
 
Sam Hocevar committed
354
    p_css->i_agid = auth_info.lsa.agid;
Sam Hocevar's avatar
 
Sam Hocevar committed
355

Sam Hocevar's avatar
 
Sam Hocevar committed
356
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
357 358
    raw_device_command rdc;
    u8 p_buffer[ 0 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
359

Sam Hocevar's avatar
 
Sam Hocevar committed
360
    BeInitRDC( &rdc, p_buffer, 0 );
Sam Hocevar's avatar
 
Sam Hocevar committed
361

Sam Hocevar's avatar
 
Sam Hocevar committed
362 363 364
    rdc.flags         = B_RAW_DEVICE_DATA_IN;
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x3f | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
365

Sam Hocevar's avatar
 
Sam Hocevar committed
366
    i_ret = ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
367 368

#else
Sam Hocevar's avatar
 
Sam Hocevar committed
369 370
    /* DVD ioctls unavailable - do as if the ioctl failed */
    i_ret = -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
371 372

#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
373
    return i_ret;
Sam Hocevar's avatar
 
Sam Hocevar committed
374 375 376
}

/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
377
 * ioctl_HostSendChallenge: send challenge to the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
378
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
379
int ioctl_HostSendChallenge( css_t *p_css, u8 *p_challenge )
Sam Hocevar's avatar
 
Sam Hocevar committed
380
{
Sam Hocevar's avatar
 
Sam Hocevar committed
381 382
#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
    dvd_authinfo auth_info;
Sam Hocevar's avatar
 
Sam Hocevar committed
383

Sam Hocevar's avatar
 
Sam Hocevar committed
384
    auth_info.type = DVD_HOST_SEND_CHALLENGE;
Sam Hocevar's avatar
 
Sam Hocevar committed
385

Sam Hocevar's avatar
 
Sam Hocevar committed
386
    memcpy( auth_info.hsc.chal, p_challenge, sizeof(dvd_challenge) );
Sam Hocevar's avatar
 
Sam Hocevar committed
387

Sam Hocevar's avatar
 
Sam Hocevar committed
388
    return ioctl( p_css->i_fd, DVD_AUTH, &auth_info );
Sam Hocevar's avatar
 
Sam Hocevar committed
389

Sam Hocevar's avatar
 
Sam Hocevar committed
390
#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
391 392
    raw_device_command rdc;
    u8 p_buffer[ 16 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
393

Sam Hocevar's avatar
 
Sam Hocevar committed
394
    BeInitRDC( &rdc, p_buffer, 16 );
Sam Hocevar's avatar
 
Sam Hocevar committed
395

Sam Hocevar's avatar
 
Sam Hocevar committed
396 397
    rdc.command[ 0 ]  = GPCMD_SEND_KEY;
    rdc.command[ 10 ] = 0x01 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
398

Sam Hocevar's avatar
 
Sam Hocevar committed
399
    p_buffer[ 1 ] = 0xe;
Sam Hocevar's avatar
 
Sam Hocevar committed
400
    memcpy( p_buffer + 4, p_challenge, 12 );
Sam Hocevar's avatar
 
Sam Hocevar committed
401

Sam Hocevar's avatar
 
Sam Hocevar committed
402
    return ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
403

Sam Hocevar's avatar
 
Sam Hocevar committed
404
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
405
    /* DVD ioctls unavailable - do as if the ioctl failed */
Sam Hocevar's avatar
 
Sam Hocevar committed
406 407 408
    return -1;

#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
409 410 411
}

/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
412
 * ioctl_HostSendKey2: send the second key to the drive
Sam Hocevar's avatar
 
Sam Hocevar committed
413
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
414
int ioctl_HostSendKey2( css_t *p_css, u8 *p_key )
Sam Hocevar's avatar
 
Sam Hocevar committed
415
{
Sam Hocevar's avatar
 
Sam Hocevar committed
416 417 418 419 420 421 422 423 424 425 426
#if defined( HAVE_SYS_DVDIO_H ) || defined( LINUX_DVD )
    dvd_authinfo auth_info;

    auth_info.type = DVD_HOST_SEND_KEY2;
    auth_info.hsk.agid = p_css->i_agid;

    memcpy( auth_info.hsk.key, p_key, sizeof(dvd_key) );

    return ioctl( p_css->i_fd, DVD_AUTH, &auth_info );

#elif defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
427 428
    raw_device_command rdc;
    u8 p_buffer[ 12 ];
Sam Hocevar's avatar
 
Sam Hocevar committed
429

Sam Hocevar's avatar
 
Sam Hocevar committed
430
    BeInitRDC( &rdc, p_buffer, 12 );
Sam Hocevar's avatar
 
Sam Hocevar committed
431

Sam Hocevar's avatar
 
Sam Hocevar committed
432 433
    rdc.command[ 0 ]  = GPCMD_REPORT_KEY;
    rdc.command[ 10 ] = 0x3 | (p_css->i_agid << 6);
Sam Hocevar's avatar
 
Sam Hocevar committed
434

Sam Hocevar's avatar
 
Sam Hocevar committed
435
    p_buffer[ 1 ] = 0xa;
Sam Hocevar's avatar
 
Sam Hocevar committed
436
    memcpy( p_buffer + 4, p_key, 8 );
Sam Hocevar's avatar
 
Sam Hocevar committed
437

Sam Hocevar's avatar
 
Sam Hocevar committed
438
    return ioctl( p_css->i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );
Sam Hocevar's avatar
 
Sam Hocevar committed
439

Sam Hocevar's avatar
 
Sam Hocevar committed
440
#else
Sam Hocevar's avatar
 
Sam Hocevar committed
441
    /* DVD ioctls unavailable - do as if the ioctl failed */
Sam Hocevar's avatar
 
Sam Hocevar committed
442
    return -1;
Sam Hocevar's avatar
 
Sam Hocevar committed
443

Sam Hocevar's avatar
 
Sam Hocevar committed
444
#endif
Sam Hocevar's avatar
 
Sam Hocevar committed
445 446
}

Sam Hocevar's avatar
 
Sam Hocevar committed
447 448 449
/* Local prototypes */

#if defined( SYS_BEOS )
Sam Hocevar's avatar
 
Sam Hocevar committed
450
/*****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
451
 * BeInitRDC: initialize a RDC structure for the BeOS kernel
Sam Hocevar's avatar
 
Sam Hocevar committed
452
 *****************************************************************************
Sam Hocevar's avatar
 
Sam Hocevar committed
453 454
 * This function initializes a BeOS raw device command structure for future
 * use, either a read command or a write command.
Sam Hocevar's avatar
 
Sam Hocevar committed
455
 *****************************************************************************/
Sam Hocevar's avatar
 
Sam Hocevar committed
456
static void BeInitRDC( raw_device_command *p_rdc, void *p_buffer, int i_len )
Sam Hocevar's avatar
 
Sam Hocevar committed
457
{
Sam Hocevar's avatar
 
Sam Hocevar committed
458 459
    memset( p_rdc, 0, sizeof( raw_device_command ) );
    memset( p_buffer, 0, i_len );
Sam Hocevar's avatar
 
Sam Hocevar committed
460

Sam Hocevar's avatar
 
Sam Hocevar committed
461 462 463
    p_rdc->command[ 8 ]      = (i_len >> 8) & 0xff;
    p_rdc->command[ 9 ]      =  i_len       & 0xff;
    p_rdc->command_length    = 12;
Sam Hocevar's avatar
 
Sam Hocevar committed
464

Sam Hocevar's avatar
 
Sam Hocevar committed
465 466
    p_rdc->data              = (char *)p_buffer;
    p_rdc->data_length       = i_len;
Sam Hocevar's avatar
 
Sam Hocevar committed
467

Sam Hocevar's avatar
 
Sam Hocevar committed
468 469
    p_rdc->sense_data        = NULL;
    p_rdc->sense_data_length = 0;
Sam Hocevar's avatar
 
Sam Hocevar committed
470

Sam Hocevar's avatar
 
Sam Hocevar committed
471
    p_rdc->timeout           = 1000000;
Sam Hocevar's avatar
 
Sam Hocevar committed
472
}
Sam Hocevar's avatar
 
Sam Hocevar committed
473

Sam Hocevar's avatar
 
Sam Hocevar committed
474 475
#endif