Mercurial > mplayer.hg
annotate libmpdvdkit2/device.c @ 10368:6fb8a6a4a071
removing my (nonworking) email address
author | alex |
---|---|
date | Thu, 03 Jul 2003 20:22:51 +0000 |
parents | f0f0f176d298 |
children | 002e7a679a05 |
rev | line source |
---|---|
7027 | 1 /***************************************************************************** |
2 * device.h: DVD device access | |
3 ***************************************************************************** | |
4 * Copyright (C) 1998-2002 VideoLAN | |
5 * $Id$ | |
6 * | |
7 * Authors: Stéphane Borel <stef@via.ecp.fr> | |
8 * Samuel Hocevar <sam@zoy.org> | |
9 * Håkan Hjort <d95hjort@dtek.chalmers.se> | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
15 * |
7027 | 16 * This program is distributed in the hope that it will be useful, |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. | |
24 *****************************************************************************/ | |
25 | |
26 /***************************************************************************** | |
27 * Preamble | |
28 *****************************************************************************/ | |
29 #include "config.h" | |
30 | |
31 #include <stdio.h> | |
32 #include <stdlib.h> | |
33 #include <string.h> | |
34 #include <sys/types.h> | |
35 #include <sys/stat.h> | |
36 #include <fcntl.h> | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
37 #include <unistd.h> |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
38 #include <limits.h> |
7027 | 39 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
40 #if defined( WIN32 ) && !defined( SYS_CYGWIN ) |
7027 | 41 # include <io.h> /* read() */ |
42 #else | |
43 # include <sys/uio.h> /* struct iovec */ | |
44 #endif | |
45 | |
7033 | 46 #include "dvdcss.h" |
7027 | 47 |
48 #include "common.h" | |
49 #include "css.h" | |
50 #include "libdvdcss.h" | |
51 #include "ioctl.h" | |
52 #include "device.h" | |
53 | |
54 /***************************************************************************** | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
55 * Device reading prototypes |
7027 | 56 *****************************************************************************/ |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
57 static int libc_open ( dvdcss_t, char const * ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
58 static int libc_seek ( dvdcss_t, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
59 static int libc_read ( dvdcss_t, void *, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
60 static int libc_readv ( dvdcss_t, struct iovec *, int ); |
7027 | 61 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
62 #ifdef WIN32 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
63 static int win2k_open ( dvdcss_t, char const * ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
64 static int aspi_open ( dvdcss_t, char const * ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
65 static int win2k_seek ( dvdcss_t, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
66 static int aspi_seek ( dvdcss_t, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
67 static int win2k_read ( dvdcss_t, void *, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
68 static int aspi_read ( dvdcss_t, void *, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
69 static int win_readv ( dvdcss_t, struct iovec *, int ); |
7027 | 70 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
71 static int aspi_read_internal ( int, void *, int ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
72 #endif |
7027 | 73 |
74 int _dvdcss_use_ioctls( dvdcss_t dvdcss ) | |
75 { | |
76 #if defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
77 if( dvdcss->b_file ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
78 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
79 return 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
80 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
81 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
82 /* FIXME: implement this for Windows */ |
7027 | 83 if( WIN2K ) |
84 { | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
85 return 1; |
7027 | 86 } |
87 else | |
88 { | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
89 return 1; |
7027 | 90 } |
91 #else | |
92 struct stat fileinfo; | |
93 int ret; | |
94 | |
95 ret = fstat( dvdcss->i_fd, &fileinfo ); | |
96 if( ret < 0 ) | |
97 { | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
98 return 1; /* What to do? Be conservative and try to use the ioctls */ |
7027 | 99 } |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
100 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
101 /* Complete this list and check that we test for the right things |
7027 | 102 * (I've assumed for all OSs that 'r', (raw) device, are char devices |
103 * and those that don't contain/use an 'r' in the name are block devices) | |
104 * | |
105 * Linux needs a block device | |
106 * Solaris needs a char device | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
107 * Darwin needs a char device |
7027 | 108 * OpenBSD needs a char device |
109 * NetBSD needs a char device | |
110 * FreeBSD can use either the block or the char device | |
111 * BSD/OS can use either the block or the char device | |
112 */ | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
113 |
7027 | 114 /* Check if this is a block/char device */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
115 if( S_ISBLK( fileinfo.st_mode ) || |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
116 S_ISCHR( fileinfo.st_mode ) ) |
7027 | 117 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
118 return 1; |
7027 | 119 } |
120 else | |
121 { | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
122 return 0; |
7027 | 123 } |
124 #endif | |
125 } | |
126 | |
127 int _dvdcss_open ( dvdcss_t dvdcss ) | |
128 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
129 char psz_debug[200]; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
130 char const *psz_device = dvdcss->psz_device; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
131 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
132 snprintf( psz_debug, 199, "opening target `%s'", psz_device ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
133 psz_debug[199] = '\0'; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
134 _dvdcss_debug( dvdcss, psz_debug ); |
7027 | 135 |
136 #if defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
137 /* If device is not "X:", we are actually opening a file. */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
138 dvdcss->b_file = !psz_device[0] || psz_device[1] != ':' || psz_device[3]; |
7027 | 139 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
140 /* Initialize readv temporary buffer */ |
7027 | 141 dvdcss->p_readv_buffer = NULL; |
142 dvdcss->i_readv_buf_size = 0; | |
143 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
144 if( !dvdcss->b_file && WIN2K ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
145 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
146 _dvdcss_debug( dvdcss, "using Win2K API for access" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
147 dvdcss->pf_seek = win2k_seek; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
148 dvdcss->pf_read = win2k_read; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
149 dvdcss->pf_readv = win_readv; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
150 return win2k_open( dvdcss, psz_device ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
151 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
152 else if( !dvdcss->b_file ) |
7027 | 153 { |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
154 _dvdcss_debug( dvdcss, "using ASPI for access" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
155 dvdcss->pf_seek = aspi_seek; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
156 dvdcss->pf_read = aspi_read; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
157 dvdcss->pf_readv = win_readv; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
158 return aspi_open( dvdcss, psz_device ); |
7027 | 159 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
160 else |
7027 | 161 #endif |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
162 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
163 _dvdcss_debug( dvdcss, "using libc for access" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
164 dvdcss->pf_seek = libc_seek; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
165 dvdcss->pf_read = libc_read; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
166 dvdcss->pf_readv = libc_readv; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
167 return libc_open( dvdcss, psz_device ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
168 } |
7027 | 169 } |
170 | |
171 #ifndef WIN32 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
172 int _dvdcss_raw_open ( dvdcss_t dvdcss, char const *psz_device ) |
7027 | 173 { |
174 dvdcss->i_raw_fd = open( psz_device, 0 ); | |
175 | |
176 if( dvdcss->i_raw_fd == -1 ) | |
177 { | |
178 _dvdcss_error( dvdcss, "failed opening raw device, continuing" ); | |
179 return -1; | |
180 } | |
181 else | |
182 { | |
183 dvdcss->i_read_fd = dvdcss->i_raw_fd; | |
184 } | |
185 | |
186 return 0; | |
187 } | |
188 #endif | |
189 | |
190 int _dvdcss_close ( dvdcss_t dvdcss ) | |
191 { | |
192 #if defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
193 if( dvdcss->b_file ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
194 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
195 close( dvdcss->i_fd ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
196 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
197 else if( WIN2K ) |
7027 | 198 { |
199 CloseHandle( (HANDLE) dvdcss->i_fd ); | |
200 } | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
201 else /* ASPI */ |
7027 | 202 { |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
203 struct w32_aspidev *fd = (struct w32_aspidev *) dvdcss->i_fd; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
204 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
205 /* Unload aspi and free w32_aspidev structure */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
206 FreeLibrary( (HMODULE) fd->hASPI ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
207 free( (void*) dvdcss->i_fd ); |
7027 | 208 } |
209 | |
210 /* Free readv temporary buffer */ | |
211 if( dvdcss->p_readv_buffer ) | |
212 { | |
213 free( dvdcss->p_readv_buffer ); | |
214 dvdcss->p_readv_buffer = NULL; | |
215 dvdcss->i_readv_buf_size = 0; | |
216 } | |
217 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
218 return 0; |
7027 | 219 #else |
220 close( dvdcss->i_fd ); | |
221 | |
222 if( dvdcss->i_raw_fd >= 0 ) | |
223 { | |
224 close( dvdcss->i_raw_fd ); | |
225 dvdcss->i_raw_fd = -1; | |
226 } | |
227 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
228 return 0; |
7027 | 229 #endif |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
230 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
231 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
232 /* Following functions are local */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
233 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
234 /***************************************************************************** |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
235 * Open commands. |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
236 *****************************************************************************/ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
237 static int libc_open ( dvdcss_t dvdcss, char const *psz_device ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
238 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
239 #if !defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
240 dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, 0 ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
241 #else |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
242 dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, O_BINARY ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
243 #endif |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
244 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
245 if( dvdcss->i_fd == -1 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
246 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
247 _dvdcss_error( dvdcss, "failed opening device" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
248 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
249 } |
7027 | 250 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
251 dvdcss->i_pos = 0; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
252 |
7027 | 253 return 0; |
254 } | |
255 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
256 #if defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
257 static int win2k_open ( dvdcss_t dvdcss, char const *psz_device ) |
7027 | 258 { |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
259 char psz_dvd[7]; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
260 _snprintf( psz_dvd, 7, "\\\\.\\%c:", psz_device[0] ); |
7027 | 261 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
262 /* To work around an M$ bug in IOCTL_DVD_READ_STRUCTURE, we need read |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
263 * _and_ write access to the device (so we can make SCSI Pass Through |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
264 * Requests). Unfortunately this is only allowed if you have |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
265 * administrator priviledges so we allow for a fallback method with |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
266 * only read access to the device (in this case ioctl_ReadCopyright() |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
267 * won't send back the right result). |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
268 * (See Microsoft Q241374: Read and Write Access Required for SCSI |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
269 * Pass Through Requests) */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
270 (HANDLE) dvdcss->i_fd = |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
271 CreateFile( psz_dvd, GENERIC_READ | GENERIC_WRITE, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
272 FILE_SHARE_READ | FILE_SHARE_WRITE, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
273 NULL, OPEN_EXISTING, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
274 FILE_FLAG_RANDOM_ACCESS, NULL ); |
7027 | 275 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
276 if( (HANDLE) dvdcss->i_fd == INVALID_HANDLE_VALUE ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
277 (HANDLE) dvdcss->i_fd = |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
278 CreateFile( psz_dvd, GENERIC_READ, FILE_SHARE_READ, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
279 NULL, OPEN_EXISTING, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
280 FILE_FLAG_RANDOM_ACCESS, NULL ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
281 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
282 if( (HANDLE) dvdcss->i_fd == INVALID_HANDLE_VALUE ) |
7027 | 283 { |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
284 _dvdcss_error( dvdcss, "failed opening device" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
285 return -1; |
7027 | 286 } |
287 | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
288 dvdcss->i_pos = 0; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
289 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
290 return 0; |
7027 | 291 } |
292 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
293 static int aspi_open( dvdcss_t dvdcss, char const * psz_device ) |
7027 | 294 { |
295 HMODULE hASPI; | |
296 DWORD dwSupportInfo; | |
297 struct w32_aspidev *fd; | |
298 int i, j, i_hostadapters; | |
299 long (*lpGetSupport)( void ); | |
300 long (*lpSendCommand)( void* ); | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
301 char c_drive = psz_device[0]; |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
302 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
303 /* load aspi and init w32_aspidev structure */ |
7027 | 304 hASPI = LoadLibrary( "wnaspi32.dll" ); |
305 if( hASPI == NULL ) | |
306 { | |
307 _dvdcss_error( dvdcss, "unable to load wnaspi32.dll" ); | |
308 return -1; | |
309 } | |
310 | |
311 (FARPROC) lpGetSupport = GetProcAddress( hASPI, "GetASPI32SupportInfo" ); | |
312 (FARPROC) lpSendCommand = GetProcAddress( hASPI, "SendASPI32Command" ); | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
313 |
7027 | 314 if(lpGetSupport == NULL || lpSendCommand == NULL ) |
315 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
316 _dvdcss_error( dvdcss, "unable to get aspi function pointers" ); |
7027 | 317 FreeLibrary( hASPI ); |
318 return -1; | |
319 } | |
320 | |
321 dwSupportInfo = lpGetSupport(); | |
322 | |
323 if( HIBYTE( LOWORD ( dwSupportInfo ) ) == SS_NO_ADAPTERS ) | |
324 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
325 _dvdcss_error( dvdcss, "no ASPI adapters found" ); |
7027 | 326 FreeLibrary( hASPI ); |
327 return -1; | |
328 } | |
329 | |
330 if( HIBYTE( LOWORD ( dwSupportInfo ) ) != SS_COMP ) | |
331 { | |
332 _dvdcss_error( dvdcss, "unable to initalize aspi layer" ); | |
333 FreeLibrary( hASPI ); | |
334 return -1; | |
335 } | |
336 | |
337 i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) ); | |
338 if( i_hostadapters == 0 ) | |
339 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
340 _dvdcss_error( dvdcss, "no ASPI adapters ready" ); |
7027 | 341 FreeLibrary( hASPI ); |
342 return -1; | |
343 } | |
344 | |
345 fd = malloc( sizeof( struct w32_aspidev ) ); | |
346 if( fd == NULL ) | |
347 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
348 _dvdcss_error( dvdcss, "not enough memory" ); |
7027 | 349 FreeLibrary( hASPI ); |
350 return -1; | |
351 } | |
352 | |
353 fd->i_blocks = 0; | |
354 fd->hASPI = (long) hASPI; | |
355 fd->lpSendCommand = lpSendCommand; | |
356 | |
357 c_drive = c_drive > 'Z' ? c_drive - 'a' : c_drive - 'A'; | |
358 | |
359 for( i = 0; i < i_hostadapters; i++ ) | |
360 { | |
361 for( j = 0; j < 15; j++ ) | |
362 { | |
363 struct SRB_GetDiskInfo srbDiskInfo; | |
364 | |
365 srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; | |
366 srbDiskInfo.SRB_HaId = i; | |
367 srbDiskInfo.SRB_Flags = 0; | |
368 srbDiskInfo.SRB_Hdr_Rsvd = 0; | |
369 srbDiskInfo.SRB_Target = j; | |
370 srbDiskInfo.SRB_Lun = 0; | |
371 | |
372 lpSendCommand( (void*) &srbDiskInfo ); | |
373 | |
374 if( (srbDiskInfo.SRB_Status == SS_COMP) && | |
375 (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) | |
376 { | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
377 /* Make sure this is a cdrom device */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
378 struct SRB_GDEVBlock srbGDEVBlock; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
379 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
380 memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
381 srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
382 srbGDEVBlock.SRB_HaId = i; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
383 srbGDEVBlock.SRB_Target = j; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
384 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
385 lpSendCommand( (void*) &srbGDEVBlock ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
386 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
387 if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
388 ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
389 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
390 fd->i_sid = MAKEWORD( i, j ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
391 dvdcss->i_fd = (int) fd; |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
392 dvdcss->i_pos = 0; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
393 return 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
394 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
395 else |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
396 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
397 free( (void*) fd ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
398 FreeLibrary( hASPI ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
399 _dvdcss_error( dvdcss,"this is not a cdrom drive" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
400 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
401 } |
7027 | 402 } |
403 } | |
404 } | |
405 | |
406 free( (void*) fd ); | |
407 FreeLibrary( hASPI ); | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
408 _dvdcss_error( dvdcss, "unable to get haid and target (aspi)" ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
409 return -1; |
7027 | 410 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
411 #endif |
7027 | 412 |
413 /***************************************************************************** | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
414 * Seek commands. |
7027 | 415 *****************************************************************************/ |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
416 static int libc_seek( dvdcss_t dvdcss, int i_blocks ) |
7027 | 417 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
418 off_t i_seek; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
419 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
420 if( dvdcss->i_pos == i_blocks ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
421 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
422 /* We are already in position */ |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
423 return i_blocks; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
424 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
425 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
426 i_seek = lseek( dvdcss->i_read_fd, |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
427 (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE, SEEK_SET ); |
7027 | 428 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
429 if( i_seek < 0 ) |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
430 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
431 _dvdcss_error( dvdcss, "seek error" ); |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
432 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
433 return i_seek; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
434 } |
7027 | 435 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
436 dvdcss->i_pos = i_seek / DVDCSS_BLOCK_SIZE; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
437 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
438 return dvdcss->i_pos; |
7027 | 439 } |
440 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
441 #if defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
442 static int win2k_seek( dvdcss_t dvdcss, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
443 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
444 LARGE_INTEGER li_seek; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
445 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
446 #ifndef INVALID_SET_FILE_POINTER |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
447 # define INVALID_SET_FILE_POINTER ((DWORD)-1) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
448 #endif |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
449 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
450 if( dvdcss->i_pos == i_blocks ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
451 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
452 /* We are already in position */ |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
453 return i_blocks; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
454 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
455 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
456 li_seek.QuadPart = (LONGLONG)i_blocks * DVDCSS_BLOCK_SIZE; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
457 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
458 li_seek.LowPart = SetFilePointer( (HANDLE) dvdcss->i_fd, |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
459 li_seek.LowPart, |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
460 &li_seek.HighPart, FILE_BEGIN ); |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
461 if( (li_seek.LowPart == INVALID_SET_FILE_POINTER) |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
462 && GetLastError() != NO_ERROR) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
463 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
464 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
465 return -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
466 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
467 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
468 dvdcss->i_pos = li_seek.QuadPart / DVDCSS_BLOCK_SIZE; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
469 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
470 return dvdcss->i_pos; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
471 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
472 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
473 static int aspi_seek( dvdcss_t dvdcss, int i_blocks ) |
7027 | 474 { |
475 int i_old_blocks; | |
476 char sz_buf[ DVDCSS_BLOCK_SIZE ]; | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
477 struct w32_aspidev *fd = (struct w32_aspidev *) dvdcss->i_fd; |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
478 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
479 if( dvdcss->i_pos == i_blocks ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
480 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
481 /* We are already in position */ |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
482 return i_blocks; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
483 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
484 |
7027 | 485 i_old_blocks = fd->i_blocks; |
486 fd->i_blocks = i_blocks; | |
487 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
488 if( aspi_read_internal( dvdcss->i_fd, sz_buf, 1 ) == -1 ) |
7027 | 489 { |
490 fd->i_blocks = i_old_blocks; | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
491 dvdcss->i_pos = -1; |
7027 | 492 return -1; |
493 } | |
494 | |
495 (fd->i_blocks)--; | |
496 | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
497 dvdcss->i_pos = fd->i_blocks; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
498 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
499 return dvdcss->i_pos; |
7027 | 500 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
501 #endif |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
502 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
503 /***************************************************************************** |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
504 * Read commands. |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
505 *****************************************************************************/ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
506 static int libc_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
507 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
508 off_t i_ret; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
509 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
510 i_ret = read( dvdcss->i_read_fd, p_buffer, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
511 (off_t)i_blocks * DVDCSS_BLOCK_SIZE ); |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
512 |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
513 if( i_ret < 0 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
514 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
515 _dvdcss_error( dvdcss, "read error" ); |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
516 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
517 return i_ret; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
518 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
519 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
520 /* Handle partial reads */ |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
521 if( i_ret != (off_t)i_blocks * DVDCSS_BLOCK_SIZE ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
522 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
523 int i_seek; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
524 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
525 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
526 i_seek = libc_seek( dvdcss, i_ret / DVDCSS_BLOCK_SIZE ); |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
527 if( i_seek < 0 ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
528 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
529 return i_seek; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
530 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
531 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
532 /* We have to return now so that i_pos isn't clobbered */ |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
533 return i_ret / DVDCSS_BLOCK_SIZE; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
534 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
535 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
536 dvdcss->i_pos += i_ret / DVDCSS_BLOCK_SIZE; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
537 return i_ret / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
538 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
539 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
540 #if defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
541 static int win2k_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
542 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
543 int i_bytes; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
544 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
545 if( !ReadFile( (HANDLE) dvdcss->i_fd, p_buffer, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
546 i_blocks * DVDCSS_BLOCK_SIZE, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
547 (LPDWORD)&i_bytes, NULL ) ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
548 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
549 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
550 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
551 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
552 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
553 dvdcss->i_pos += i_bytes / DVDCSS_BLOCK_SIZE; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
554 return i_bytes / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
555 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
556 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
557 static int aspi_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
558 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
559 int i_read = aspi_read_internal( dvdcss->i_fd, p_buffer, i_blocks ); |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
560 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
561 if( i_read < 0 ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
562 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
563 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
564 return i_read; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
565 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
566 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
567 dvdcss->i_pos += i_read; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
568 return i_read; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
569 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
570 #endif |
7027 | 571 |
572 /***************************************************************************** | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
573 * Readv commands. |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
574 *****************************************************************************/ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
575 static int libc_readv ( dvdcss_t dvdcss, struct iovec *p_iovec, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
576 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
577 #if defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
578 int i_index, i_len, i_total = 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
579 unsigned char *p_base; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
580 int i_bytes; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
581 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
582 for( i_index = i_blocks; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
583 i_index; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
584 i_index--, p_iovec++ ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
585 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
586 i_len = p_iovec->iov_len; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
587 p_base = p_iovec->iov_base; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
588 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
589 if( i_len <= 0 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
590 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
591 continue; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
592 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
593 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
594 i_bytes = read( dvdcss->i_fd, p_base, i_len ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
595 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
596 if( i_bytes < 0 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
597 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
598 /* One of the reads failed, too bad. |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
599 * We won't even bother returning the reads that went ok, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
600 * and as in the posix spec the file postition is left |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
601 * unspecified after a failure */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
602 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
603 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
604 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
605 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
606 i_total += i_bytes; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
607 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
608 if( i_bytes != i_len ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
609 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
610 /* We reached the end of the file or a signal interrupted |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
611 * the read. Return a partial read. */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
612 int i_seek; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
613 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
614 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
615 i_seek = libc_seek( dvdcss, i_total / DVDCSS_BLOCK_SIZE ); |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
616 if( i_seek < 0 ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
617 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
618 return i_seek; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
619 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
620 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
621 /* We have to return now so that i_pos isn't clobbered */ |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
622 return i_total / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
623 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
624 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
625 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
626 dvdcss->i_pos += i_total / DVDCSS_BLOCK_SIZE; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
627 return i_total / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
628 #else |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
629 int i_read = readv( dvdcss->i_read_fd, p_iovec, i_blocks ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
630 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
631 if( i_read < 0 ) |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
632 { |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
633 dvdcss->i_pos = -1; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
634 return i_read; |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
635 } |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
636 |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
637 dvdcss->i_pos += i_read / DVDCSS_BLOCK_SIZE; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
638 return i_read / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
639 #endif |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
640 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
641 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
642 #if defined( WIN32 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
643 /***************************************************************************** |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
644 * win_readv: vectored read using ReadFile for Win2K and ASPI for win9x |
7027 | 645 *****************************************************************************/ |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
646 static int win_readv ( dvdcss_t dvdcss, struct iovec *p_iovec, int i_blocks ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
647 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
648 int i_index; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
649 int i_blocks_read, i_blocks_total = 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
650 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
651 /* Check the size of the readv temp buffer, just in case we need to |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
652 * realloc something bigger */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
653 if( dvdcss->i_readv_buf_size < i_blocks * DVDCSS_BLOCK_SIZE ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
654 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
655 dvdcss->i_readv_buf_size = i_blocks * DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
656 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
657 if( dvdcss->p_readv_buffer ) free( dvdcss->p_readv_buffer ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
658 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
659 /* Allocate a buffer which will be used as a temporary storage |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
660 * for readv */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
661 dvdcss->p_readv_buffer = malloc( dvdcss->i_readv_buf_size ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
662 if( !dvdcss->p_readv_buffer ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
663 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
664 _dvdcss_error( dvdcss, " failed (readv)" ); |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
665 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
666 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
667 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
668 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
669 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
670 for( i_index = i_blocks; i_index; i_index-- ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
671 { |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
672 i_blocks_total += p_iovec[i_index-1].iov_len; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
673 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
674 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
675 if( i_blocks_total <= 0 ) return 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
676 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
677 i_blocks_total /= DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
678 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
679 if( WIN2K ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
680 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
681 unsigned long int i_bytes; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
682 if( !ReadFile( (HANDLE)dvdcss->i_fd, dvdcss->p_readv_buffer, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
683 i_blocks_total * DVDCSS_BLOCK_SIZE, &i_bytes, NULL ) ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
684 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
685 /* The read failed... too bad. |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
686 * As in the posix spec the file postition is left |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
687 * unspecified after a failure */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
688 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
689 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
690 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
691 i_blocks_read = i_bytes / DVDCSS_BLOCK_SIZE; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
692 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
693 else /* Win9x */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
694 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
695 i_blocks_read = aspi_read_internal( dvdcss->i_fd, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
696 dvdcss->p_readv_buffer, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
697 i_blocks_total ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
698 if( i_blocks_read < 0 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
699 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
700 /* See above */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
701 dvdcss->i_pos = -1; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
702 return -1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
703 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
704 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
705 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
706 /* We just have to copy the content of the temp buffer into the iovecs */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
707 for( i_index = 0, i_blocks_total = i_blocks_read; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
708 i_blocks_total > 0; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
709 i_index++ ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
710 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
711 memcpy( p_iovec[i_index].iov_base, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
712 dvdcss->p_readv_buffer + (i_blocks_read - i_blocks_total) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
713 * DVDCSS_BLOCK_SIZE, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
714 p_iovec[i_index].iov_len ); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
715 /* if we read less blocks than asked, we'll just end up copying |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
716 * garbage, this isn't an issue as we return the number of |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
717 * blocks actually read */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
718 i_blocks_total -= ( p_iovec[i_index].iov_len / DVDCSS_BLOCK_SIZE ); |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
719 } |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
720 |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
721 dvdcss->i_pos += i_blocks_read; |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
722 return i_blocks_read; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
723 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
724 |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
725 static int aspi_read_internal( int i_fd, void *p_data, int i_blocks ) |
7027 | 726 { |
727 HANDLE hEvent; | |
728 struct SRB_ExecSCSICmd ssc; | |
729 struct w32_aspidev *fd = (struct w32_aspidev *) i_fd; | |
730 | |
731 /* Create the transfer completion event */ | |
732 hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); | |
733 if( hEvent == NULL ) | |
734 { | |
735 return -1; | |
736 } | |
737 | |
738 memset( &ssc, 0, sizeof( ssc ) ); | |
739 | |
740 ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; | |
741 ssc.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; | |
742 ssc.SRB_HaId = LOBYTE( fd->i_sid ); | |
743 ssc.SRB_Target = HIBYTE( fd->i_sid ); | |
744 ssc.SRB_SenseLen = SENSE_LEN; | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
745 |
7027 | 746 ssc.SRB_PostProc = (LPVOID) hEvent; |
747 ssc.SRB_BufPointer = p_data; | |
748 ssc.SRB_CDBLen = 12; | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
749 |
7027 | 750 ssc.CDBByte[0] = 0xA8; /* RAW */ |
751 ssc.CDBByte[2] = (UCHAR) (fd->i_blocks >> 24); | |
752 ssc.CDBByte[3] = (UCHAR) (fd->i_blocks >> 16) & 0xff; | |
753 ssc.CDBByte[4] = (UCHAR) (fd->i_blocks >> 8) & 0xff; | |
754 ssc.CDBByte[5] = (UCHAR) (fd->i_blocks) & 0xff; | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
755 |
7027 | 756 /* We have to break down the reads into 64kb pieces (ASPI restriction) */ |
757 if( i_blocks > 32 ) | |
758 { | |
759 ssc.SRB_BufLen = 32 * DVDCSS_BLOCK_SIZE; | |
760 ssc.CDBByte[9] = 32; | |
761 fd->i_blocks += 32; | |
762 | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
763 /* Initiate transfer */ |
7027 | 764 ResetEvent( hEvent ); |
765 fd->lpSendCommand( (void*) &ssc ); | |
766 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
7033
diff
changeset
|
767 /* transfer the next 64kb (aspi_read_internal is called recursively) |
7027 | 768 * We need to check the status of the read on return */ |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
769 if( aspi_read_internal( i_fd, |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
770 (uint8_t*) p_data + 32 * DVDCSS_BLOCK_SIZE, |
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
771 i_blocks - 32) < 0 ) |
7027 | 772 { |
773 return -1; | |
774 } | |
775 } | |
776 else | |
777 { | |
778 /* This is the last transfer */ | |
779 ssc.SRB_BufLen = i_blocks * DVDCSS_BLOCK_SIZE; | |
780 ssc.CDBByte[9] = (UCHAR) i_blocks; | |
781 fd->i_blocks += i_blocks; | |
782 | |
9333
f0f0f176d298
sync with libdvdcss 1.2.5 (including u8->uint8_t and whitespace cosmetics...)
arpi
parents:
8637
diff
changeset
|
783 /* Initiate transfer */ |
7027 | 784 ResetEvent( hEvent ); |
785 fd->lpSendCommand( (void*) &ssc ); | |
786 | |
787 } | |
788 | |
789 /* If the command has still not been processed, wait until it's finished */ | |
790 if( ssc.SRB_Status == SS_PENDING ) | |
791 { | |
792 WaitForSingleObject( hEvent, INFINITE ); | |
793 } | |
794 CloseHandle( hEvent ); | |
795 | |
796 /* check that the transfer went as planned */ | |
797 if( ssc.SRB_Status != SS_COMP ) | |
798 { | |
799 return -1; | |
800 } | |
801 | |
802 return i_blocks; | |
803 } | |
804 #endif | |
805 |