Mercurial > mplayer.hg
annotate libmpdemux/vcd_read.h @ 18001:a2683ee7cb5a
fix descrambling of asf file,
where signed buffer could cause erroneous values to be filled in descrable variables,
add misssing check for one of these variables
and restore sign of these variables as insurance that these checks will work even in such case.
author | iive |
---|---|
date | Thu, 30 Mar 2006 23:06:18 +0000 |
parents | aa15d627a00b |
children | 4231482179b6 |
rev | line source |
---|---|
1 | 1 //=================== VideoCD ========================== |
2089 | 2 #if defined(linux) || defined(sun) || defined(__bsdi__) |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
3 |
9887 | 4 typedef struct mp_vcd_priv_st mp_vcd_priv_t; |
5 | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
6 #if defined(linux) |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
7 #include <linux/cdrom.h> |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
8 #elif defined(sun) |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
9 #include <sys/cdio.h> |
9887 | 10 static int sun_vcd_read(mp_vcd_priv_t*, int*); |
2089 | 11 #elif defined(__bsdi__) |
12 #include <dvd.h> | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
13 #endif |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
14 |
9887 | 15 struct mp_vcd_priv_st { |
16 int fd; | |
17 struct cdrom_tocentry entry; | |
18 char buf[VCD_SECTOR_SIZE]; | |
19 }; | |
1 | 20 |
9887 | 21 static inline void vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect){ |
22 vcd->entry.cdte_addr.msf.frame=sect%75; | |
1 | 23 sect=sect/75; |
9887 | 24 vcd->entry.cdte_addr.msf.second=sect%60; |
1 | 25 sect=sect/60; |
9887 | 26 vcd->entry.cdte_addr.msf.minute=sect; |
1 | 27 } |
28 | |
9887 | 29 static inline unsigned int vcd_get_msf(mp_vcd_priv_t* vcd){ |
30 return vcd->entry.cdte_addr.msf.frame + | |
31 (vcd->entry.cdte_addr.msf.second+ | |
32 vcd->entry.cdte_addr.msf.minute*60)*75; | |
1 | 33 } |
34 | |
9887 | 35 int vcd_seek_to_track(mp_vcd_priv_t* vcd,int track){ |
36 vcd->entry.cdte_format = CDROM_MSF; | |
37 vcd->entry.cdte_track = track; | |
38 if (ioctl(vcd->fd, CDROMREADTOCENTRY, &vcd->entry)) { | |
39 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif1: %s\n",strerror(errno)); | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
40 return -1; |
1 | 41 } |
9887 | 42 return VCD_SECTOR_DATA*vcd_get_msf(vcd); |
1 | 43 } |
44 | |
9887 | 45 int vcd_get_track_end(mp_vcd_priv_t* vcd,int track){ |
598 | 46 struct cdrom_tochdr tochdr; |
9887 | 47 if (ioctl(vcd->fd,CDROMREADTOCHDR,&tochdr)==-1) { |
48 mp_msg(MSGT_STREAM,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); | |
49 return -1; | |
50 } | |
51 vcd->entry.cdte_format = CDROM_MSF; | |
52 vcd->entry.cdte_track = track<tochdr.cdth_trk1?(track+1):CDROM_LEADOUT; | |
53 if (ioctl(vcd->fd, CDROMREADTOCENTRY, &vcd->entry)) { | |
54 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif2: %s\n",strerror(errno)); | |
598 | 55 return -1; |
56 } | |
9887 | 57 return VCD_SECTOR_DATA*vcd_get_msf(vcd); |
598 | 58 } |
59 | |
9887 | 60 mp_vcd_priv_t* vcd_read_toc(int fd){ |
1 | 61 struct cdrom_tochdr tochdr; |
9887 | 62 mp_vcd_priv_t* vcd; |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
63 int i, min = 0, sec = 0, frame = 0; |
9887 | 64 if (ioctl(fd,CDROMREADTOCHDR,&tochdr)==-1) { |
65 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); | |
66 return NULL; | |
67 } | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
68 if (identify) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
69 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
70 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VCD_START_TRACK=%d\n", tochdr.cdth_trk0); |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
71 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VCD_END_TRACK=%d\n", tochdr.cdth_trk1); |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
72 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
73 for (i=tochdr.cdth_trk0 ; i<=tochdr.cdth_trk1 + 1; i++){ |
1 | 74 struct cdrom_tocentry tocentry; |
75 | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
76 tocentry.cdte_track = i<=tochdr.cdth_trk1 ? i : CDROM_LEADOUT; |
1 | 77 tocentry.cdte_format = CDROM_MSF; |
78 | |
9887 | 79 if (ioctl(fd,CDROMREADTOCENTRY,&tocentry)==-1) { |
80 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc entry: %s\n",strerror(errno)); | |
81 return NULL; | |
82 } | |
1 | 83 |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
84 if (i<=tochdr.cdth_trk1) |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1105
diff
changeset
|
85 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d mode: %d\n", |
1 | 86 (int)tocentry.cdte_track, |
87 (int)tocentry.cdte_adr, | |
88 (int)tocentry.cdte_ctrl, | |
89 (int)tocentry.cdte_format, | |
90 (int)tocentry.cdte_addr.msf.minute, | |
91 (int)tocentry.cdte_addr.msf.second, | |
92 (int)tocentry.cdte_addr.msf.frame, | |
93 (int)tocentry.cdte_datamode | |
94 ); | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
95 |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
96 if (identify) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
97 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
98 if (i > tochdr.cdth_trk0) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
99 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
100 min = tocentry.cdte_addr.msf.minute - min; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
101 sec = tocentry.cdte_addr.msf.second - sec; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
102 frame = tocentry.cdte_addr.msf.frame - frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
103 if ( frame < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
104 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
105 frame += 75; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
106 sec --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
107 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
108 if ( sec < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
109 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
110 sec += 60; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
111 min --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
112 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
113 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i - 1, min, sec, frame); |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
114 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
115 min = tocentry.cdte_addr.msf.minute; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
116 sec = tocentry.cdte_addr.msf.second; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
117 frame = tocentry.cdte_addr.msf.frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
10300
diff
changeset
|
118 } |
1 | 119 } |
9887 | 120 vcd = malloc(sizeof(mp_vcd_priv_t)); |
121 vcd->fd = fd; | |
122 return vcd; | |
1 | 123 } |
124 | |
9887 | 125 static int vcd_read(mp_vcd_priv_t* vcd,char *mem){ |
2089 | 126 #if defined(linux) || defined(__bsdi__) |
9887 | 127 memcpy(vcd->buf,&vcd->entry.cdte_addr.msf,sizeof(struct cdrom_msf)); |
128 if(ioctl(vcd->fd,CDROMREADRAW,vcd->buf)==-1) return 0; // EOF? | |
129 memcpy(mem,&vcd->buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA); | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
130 #elif defined(sun) |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
131 { |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
132 int offset; |
9887 | 133 if (sun_vcd_read(vcd->fd, &offset) <= 0) return 0; |
134 memcpy(mem,&vcd->buf[offset],VCD_SECTOR_DATA); | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
135 } |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
136 #endif |
1 | 137 |
9887 | 138 vcd->entry.cdte_addr.msf.frame++; |
139 if (vcd->entry.cdte_addr.msf.frame==75){ | |
140 vcd->entry.cdte_addr.msf.frame=0; | |
141 vcd->entry.cdte_addr.msf.second++; | |
142 if (vcd->entry.cdte_addr.msf.second==60){ | |
143 vcd->entry.cdte_addr.msf.second=0; | |
144 vcd->entry.cdte_addr.msf.minute++; | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
145 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
146 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
147 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
148 return VCD_SECTOR_DATA; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
149 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
150 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
151 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
152 #ifdef sun |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
153 #include <sys/scsi/generic/commands.h> |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
154 #include <sys/scsi/impl/uscsi.h> |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
155 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
156 #define SUN_XAREAD 1 /*fails on atapi drives*/ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
157 #define SUN_MODE2READ 2 /*fails on atapi drives*/ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
158 #define SUN_SCSIREAD 3 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
159 #define SUN_VCDREAD SUN_SCSIREAD |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
160 |
9887 | 161 static int sun_vcd_read(mp_vcd_priv_t* vcd, int *offset) |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
162 { |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
163 #if SUN_VCDREAD == SUN_XAREAD |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
164 struct cdrom_cdxa cdxa; |
9887 | 165 cdxa.cdxa_addr = vcd_get_msf(vcd); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
166 cdxa.cdxa_length = 1; |
9887 | 167 cdxa.cdxa_data = vcd->buf; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
168 cdxa.cdxa_format = CDROM_XA_SECTOR_DATA; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
169 |
10300
134e4332f550
solaris fix by Gtz Waschk <waschk@informatik.uni-rostock.de>
alex
parents:
9887
diff
changeset
|
170 if(ioctl(vcd->fd,CDROMCDXA,&cdxa)==-1) { |
9887 | 171 mp_msg(MSGT_STREAM,MSGL_ERR,"CDROMCDXA: %s\n",strerror(errno)); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
172 return 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
173 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
174 *offset = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
175 #elif SUN_VCDREAD == SUN_MODE2READ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
176 struct cdrom_read cdread; |
9887 | 177 cdread.cdread_lba = 4*vcd_get_msf(vcd); |
178 cdread.cdread_bufaddr = vcd->buf; | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
179 cdread.cdread_buflen = 2336; |
1 | 180 |
10300
134e4332f550
solaris fix by Gtz Waschk <waschk@informatik.uni-rostock.de>
alex
parents:
9887
diff
changeset
|
181 if(ioctl(vcd->fd,CDROMREADMODE2,&cdread)==-1) { |
9887 | 182 mp_msg(MSGT_STREAM,MSGL_ERR,"CDROMREADMODE2: %s\n",strerror(errno)); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
183 return 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
184 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
185 *offset = 8; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
186 #elif SUN_VCDREAD == SUN_SCSIREAD |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
187 struct uscsi_cmd sc; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
188 union scsi_cdb cdb; |
9887 | 189 int lba = vcd_get_msf(vcd); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
190 int blocks = 1; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
191 int sector_type; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
192 int sync, header_code, user_data, edc_ecc, error_field; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
193 int sub_channel; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
194 |
1105 | 195 /* sector_type = 3; *//* mode2 */ |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
196 sector_type = 5; /* mode2/form2 */ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
197 sync = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
198 header_code = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
199 user_data = 1; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
200 edc_ecc = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
201 error_field = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
202 sub_channel = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
203 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
204 memset(&cdb, 0, sizeof(cdb)); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
205 memset(&sc, 0, sizeof(sc)); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
206 cdb.scc_cmd = 0xBE; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
207 cdb.cdb_opaque[1] = (sector_type) << 2; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
208 cdb.cdb_opaque[2] = (lba >> 24) & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
209 cdb.cdb_opaque[3] = (lba >> 16) & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
210 cdb.cdb_opaque[4] = (lba >> 8) & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
211 cdb.cdb_opaque[5] = lba & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
212 cdb.cdb_opaque[6] = (blocks >> 16) & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
213 cdb.cdb_opaque[7] = (blocks >> 8) & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
214 cdb.cdb_opaque[8] = blocks & 0xff; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
215 cdb.cdb_opaque[9] = (sync << 7) | |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
216 (header_code << 5) | |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
217 (user_data << 4) | |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
218 (edc_ecc << 3) | |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
219 (error_field << 1); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
220 cdb.cdb_opaque[10] = sub_channel; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
221 |
1061 | 222 sc.uscsi_cdb = (caddr_t)&cdb; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
223 sc.uscsi_cdblen = 12; |
9887 | 224 sc.uscsi_bufaddr = vcd->buf; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
225 sc.uscsi_buflen = 2336; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
226 sc.uscsi_flags = USCSI_ISOLATE | USCSI_READ; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
227 sc.uscsi_timeout = 20; |
10300
134e4332f550
solaris fix by Gtz Waschk <waschk@informatik.uni-rostock.de>
alex
parents:
9887
diff
changeset
|
228 if (ioctl(vcd->fd, USCSICMD, &sc)) { |
9887 | 229 mp_msg(MSGT_STREAM,MSGL_ERR,"USCSICMD: READ CD: %s\n",strerror(errno)); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
230 return -1; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
231 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
232 if (sc.uscsi_status) { |
9887 | 233 mp_msg(MSGT_STREAM,MSGL_ERR,"scsi command failed with status %d\n", sc.uscsi_status); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
234 return -1; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
235 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
236 *offset = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
237 return 1; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
238 #else |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
239 #error SUN_VCDREAD |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
240 #endif |
1 | 241 } |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
242 #endif /*sun*/ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
243 |
3261 | 244 #else /* linux || sun || __bsdi__ */ |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
245 |
3261 | 246 #error vcd is not yet supported on this arch... |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
247 |
3261 | 248 #endif |