1 --- libdvdcss-1.2.10.org/src/device.c 2008-07-13 14:25:49.000000000 +0200
2 +++ libdvdcss-1.2.10/src/device.c 2013-11-18 22:39:50.000000000 +0100
7 - close( dvdcss->i_fd );
8 + if ( dvdcss->p_read_file )
10 + fclose( dvdcss->p_read_file );
11 + free ( dvdcss->p_read_buf );
12 + dvdcss->p_read_file = NULL;
15 if( dvdcss->i_raw_fd >= 0 )
18 static int libc_open ( dvdcss_t dvdcss, char const *psz_device )
21 - dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, 0 );
22 + dvdcss->p_read_file = fopen( psz_device, "r" );
23 + if ( dvdcss->p_read_file )
25 + dvdcss->p_read_buf = malloc( 128*1024 );
26 + if ( !dvdcss->p_read_buf )
28 + print_debug( dvdcss, "allocate buffer failed!" );
29 + fclose( dvdcss->p_read_file );
30 + dvdcss->p_read_file = NULL;
32 + else if ( setvbuf( dvdcss->p_read_file, dvdcss->p_read_buf, _IOFBF, 128*1024 ) )
34 + print_debug( dvdcss, "setvbuf failed (%s)", strerror(errno) );
35 + free( dvdcss->p_read_buf );
36 + fclose( dvdcss->p_read_file );
37 + dvdcss->p_read_file = NULL;
40 + if (dvdcss->p_read_file)
41 + dvdcss->i_fd = dvdcss->i_read_fd = fileno( dvdcss->p_read_file );
43 + dvdcss->i_fd = dvdcss->i_read_fd = -1;
45 dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, O_BINARY );
50 i_seek = (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE;
51 - i_seek = lseek( dvdcss->i_read_fd, i_seek, SEEK_SET );
53 + if ( dvdcss->i_raw_fd >= 0 )
54 + i_seek = lseek( dvdcss->i_read_fd, i_seek, SEEK_SET );
57 + i_seek = fseeko( dvdcss->p_read_file, i_seek, SEEK_SET );
60 + dvdcss->i_pos = i_blocks;
68 *****************************************************************************/
69 static int libc_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks )
71 - off_t i_size, i_ret;
73 - i_size = (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE;
74 - i_ret = read( dvdcss->i_read_fd, p_buffer, i_size );
77 + if ( dvdcss->i_raw_fd >= 0 )
79 - print_error( dvdcss, "read error" );
83 + off_t i_size, i_ret;
85 - /* Handle partial reads */
86 - if( i_ret != i_size )
89 + i_size = (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE;
90 + i_ret = read( dvdcss->i_read_fd, p_buffer, i_size );
93 - i_seek = libc_seek( dvdcss, i_ret / DVDCSS_BLOCK_SIZE );
98 + print_error( dvdcss, "read error" );
103 - /* We have to return now so that i_pos isn't clobbered */
104 + /* Handle partial reads */
105 + if( i_ret != i_size )
109 + dvdcss->i_pos = -1;
110 + i_seek = libc_seek( dvdcss, i_ret / DVDCSS_BLOCK_SIZE );
116 + /* We have to return now so that i_pos isn't clobbered */
117 + return i_ret / DVDCSS_BLOCK_SIZE;
120 + dvdcss->i_pos += i_ret / DVDCSS_BLOCK_SIZE;
121 return i_ret / DVDCSS_BLOCK_SIZE;
125 + size_t i_ret = fread( p_buffer, DVDCSS_BLOCK_SIZE, i_blocks, dvdcss->p_read_file );
129 + print_error( dvdcss, "read error" );
130 + dvdcss->i_pos = -1;
134 - dvdcss->i_pos += i_ret / DVDCSS_BLOCK_SIZE;
135 - return i_ret / DVDCSS_BLOCK_SIZE;
136 + dvdcss->i_pos += i_ret;
142 @@ -794,16 +848,72 @@
143 dvdcss->i_pos += i_total / DVDCSS_BLOCK_SIZE;
144 return i_total / DVDCSS_BLOCK_SIZE;
146 - int i_read = readv( dvdcss->i_read_fd, p_iovec, i_blocks );
149 + if ( dvdcss->i_raw_fd >= 0 )
151 - dvdcss->i_pos = -1;
153 + int i_read = readv( dvdcss->i_read_fd, p_iovec, i_blocks );
157 + dvdcss->i_pos = -1;
161 + dvdcss->i_pos += i_read / DVDCSS_BLOCK_SIZE;
162 + return i_read / DVDCSS_BLOCK_SIZE;
166 + int i_index, i_len, i_total = 0;
167 + unsigned char *p_base;
169 + for( i_index = i_blocks;
171 + i_index--, p_iovec++ )
174 + i_len = p_iovec->iov_len;
175 + p_base = p_iovec->iov_base;
177 - dvdcss->i_pos += i_read / DVDCSS_BLOCK_SIZE;
178 - return i_read / DVDCSS_BLOCK_SIZE;
184 + i_num_read = fread( p_base, i_len, 1, dvdcss->p_read_file );
186 + if( i_num_read != 1 )
188 + /* We reached the end of the file or a signal interrupted
189 + * the read. Return a partial read. */
194 + /* One of the reads failed, too bad.
195 + * We won't even bother returning the reads that went ok,
196 + * and as in the posix spec the file postition is left
197 + * unspecified after a failure */
198 + dvdcss->i_pos = -1;
202 + dvdcss->i_pos = -1;
203 + i_seek = libc_seek( dvdcss, i_total / DVDCSS_BLOCK_SIZE );
209 + /* We have to return now so that i_pos isn't clobbered */
210 + return i_total / DVDCSS_BLOCK_SIZE;
216 + dvdcss->i_pos += i_total / DVDCSS_BLOCK_SIZE;
217 + return i_total / DVDCSS_BLOCK_SIZE;
222 --- libdvdcss-1.2.10.org/src/libdvdcss.c 2008-08-29 20:41:51.000000000 +0200
223 +++ libdvdcss-1.2.10/src/libdvdcss.c 2013-11-17 13:15:03.000000000 +0100
226 * Initialize structure with default values
228 + dvdcss->p_read_file = NULL;
230 dvdcss->i_raw_fd = -1;
232 --- libdvdcss-1.2.10.org/src/libdvdcss.h 2008-08-29 20:39:56.000000000 +0200
233 +++ libdvdcss-1.2.10/src/libdvdcss.h 2013-11-17 13:15:03.000000000 +0100
238 + FILE * p_read_file;
242 int ( * pf_seek ) ( dvdcss_t, int );
243 int ( * pf_read ) ( dvdcss_t, void *, int );