📄 copycd.c.htm
字号:
<a class="l" name="217"> 217 </a> <a href="/source/s?defs=src">src</a> = <a href="/source/s?defs=get_device">get_device</a>(<a href="/source/s?defs=copy_src">copy_src</a>, p);<a class="l" name="218"> 218 </a> <b>if</b> (<a href="/source/s?defs=src">src</a> == <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="219"> 219 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Unable to open %s\n"</span>), <a href="/source/s?defs=copy_src">copy_src</a>);<a class="hl" name="220"> 220 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="221"> 221 </a> }<a class="l" name="222"> 222 </a> <a href="/source/s?defs=free">free</a>(p);<a class="l" name="223"> 223 </a> } <b>else</b> {<a class="l" name="224"> 224 </a> <span class="c">/* source is same as target drive */</span><a class="l" name="225"> 225 </a> <a href="/source/s?defs=src">src</a> = <a href="/source/s?defs=target">target</a>;<a class="l" name="226"> 226 </a> }<a class="l" name="227"> 227 </a><a class="l" name="228"> 228 </a> (<b>void</b>) <a href="/source/s?defs=check_device">check_device</a>(<a href="/source/s?defs=src">src</a>, <a href="/source/s?defs=CHECK_TYPE_NOT_CDROM">CHECK_TYPE_NOT_CDROM</a> | <a href="/source/s?defs=CHECK_NO_MEDIA">CHECK_NO_MEDIA</a> |<a class="l" name="229"> 229 </a> <a href="/source/s?defs=CHECK_DEVICE_NOT_READY">CHECK_DEVICE_NOT_READY</a> | <a href="/source/s?defs=EXIT_IF_CHECK_FAILED">EXIT_IF_CHECK_FAILED</a>);<a class="hl" name="230"> 230 </a><a class="l" name="231"> 231 </a> <span class="c">/* What type of media are we working with? */</span><a class="l" name="232"> 232 </a> <a href="/source/s?defs=get_media_type">get_media_type</a>(<a href="/source/s?defs=src">src</a>-><a href="/source/s?defs=d_fd">d_fd</a>);<a class="l" name="233"> 233 </a><a class="l" name="234"> 234 </a> <a href="/source/s?defs=toc">toc</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<span class="n">4</span>);<a class="l" name="235"> 235 </a> <b>if</b> (!<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=src">src</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">4</span>, <a href="/source/s?defs=toc">toc</a>)) {<a class="l" name="236"> 236 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Cannot read table of contents\n"</span>));<a class="l" name="237"> 237 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="238"> 238 </a> }<a class="l" name="239"> 239 </a> <a href="/source/s?defs=end_tno">end_tno</a> = <a href="/source/s?defs=toc">toc</a>[<span class="n">3</span>];<a class="hl" name="240"> 240 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=toc">toc</a>);<a class="l" name="241"> 241 </a> <a href="/source/s?defs=tlist">tlist</a> = (<b>struct</b> <a href="/source/s?defs=t_data">t_data</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=end_tno">end_tno</a> * <b>sizeof</b> (<b>struct</b> <a href="/source/s?defs=t_data">t_data</a>));<a class="l" name="242"> 242 </a><a class="l" name="243"> 243 </a> <a href="/source/s?defs=audio_cd">audio_cd</a> = <a href="/source/s?defs=data_cd">data_cd</a> = <span class="n">0</span>;<a class="l" name="244"> 244 </a> <a href="/source/s?defs=total_nblks">total_nblks</a> = <span class="n">0</span>;<a class="l" name="245"> 245 </a><a class="l" name="246"> 246 </a> <span class="c">/* build track information so we can copy it over */</span><a class="l" name="247"> 247 </a> <b>for</b> (i = <span class="n">1</span>; i <= <a href="/source/s?defs=end_tno">end_tno</a>; i++) {<a class="l" name="248"> 248 </a> <b>struct</b> <a href="/source/s?defs=track_info">track_info</a> *<a href="/source/s?defs=ti">ti</a>;<a class="l" name="249"> 249 </a><a class="hl" name="250"> 250 </a> <a href="/source/s?defs=ti">ti</a> = &<a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].<a href="/source/s?defs=ti">ti</a>;<a class="l" name="251"> 251 </a> <b>if</b> (!<a href="/source/s?defs=build_track_info">build_track_info</a>(<a href="/source/s?defs=src">src</a>, i, <a href="/source/s?defs=ti">ti</a>)) {<a class="l" name="252"> 252 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<a class="l" name="253"> 253 </a> <span class="s">"Cannot get information for track %d\n"</span>), i);<a class="l" name="254"> 254 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="255"> 255 </a> }<a class="l" name="256"> 256 </a> <a href="/source/s?defs=total_nblks">total_nblks</a> += <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a>;<a class="l" name="257"> 257 </a> <b>if</b> (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_mode">ti_track_mode</a> & <span class="n">4</span>)<a class="l" name="258"> 258 </a> <a href="/source/s?defs=data_cd">data_cd</a> = <span class="n">1</span>;<a class="l" name="259"> 259 </a> <b>else</b><a class="hl" name="260"> 260 </a> <a href="/source/s?defs=audio_cd">audio_cd</a> = <span class="n">1</span>;<a class="l" name="261"> 261 </a><a class="l" name="262"> 262 </a> <span class="c">/* Now some sanity checks on the track information */</span><a class="l" name="263"> 263 </a> <b>if</b> ((<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> & <a href="/source/s?defs=TI_SESSION_NO_VALID">TI_SESSION_NO_VALID</a>) &&<a class="l" name="264"> 264 </a> (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_session_no">ti_session_no</a> != <span class="n">1</span>)) {<a class="l" name="265"> 265 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a class="l" name="266"> 266 </a> <a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Copying multisession CD is not supported\n"</span>));<a class="l" name="267"> 267 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="268"> 268 </a> }<a class="l" name="269"> 269 </a> <b>if</b> ((<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> & <a href="/source/s?defs=TI_BLANK_TRACK">TI_BLANK_TRACK</a>) ||<a class="hl" name="270"> 270 </a> (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> & <a href="/source/s?defs=TI_DAMAGED_TRACK">TI_DAMAGED_TRACK</a>) ||<a class="l" name="271"> 271 </a> (<a href="/source/s?defs=data_cd">data_cd</a> && <a href="/source/s?defs=audio_cd">audio_cd</a>) || (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_data_mode">ti_data_mode</a> == <span class="n">2</span>)) {<a class="l" name="272"> 272 </a><a class="l" name="273"> 273 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"CD format is not supported\n"</span>));<a class="l" name="274"> 274 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="275"> 275 </a> }<a class="l" name="276"> 276 </a> <b>if</b> ((<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> & <a href="/source/s?defs=TI_NWA_VALID">TI_NWA_VALID</a>) &&<a class="l" name="277"> 277 </a> (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_nwa">ti_nwa</a> != <span class="n">0xffffffff</span>)) {<a class="l" name="278"> 278 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Cannot copy incomplete discs\n"</span>));<a class="l" name="279"> 279 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="hl" name="280"> 280 </a> }<a class="l" name="281"> 281 </a> }<a class="l" name="282"> 282 </a> <span class="c">/* l10n_NOTE : 'done' as in "Analyzing source CD...done" */</span><a class="l" name="283"> 283 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"done.\n"</span>));<a class="l" name="284"> 284 </a><a class="l" name="285"> 285 </a> <b>if</b> (<a href="/source/s?defs=data_cd">data_cd</a>) {<a class="l" name="286"> 286 </a> <a href="/source/s?defs=blksize">blksize</a> = <span class="n">2048</span>;<a class="l" name="287"> 287 </a> } <b>else</b> {<a class="l" name="288"> 288 </a> <span class="c">/* audio cd */</span><a class="l" name="289"> 289 </a> <a href="/source/s?defs=blksize">blksize</a> = <span class="n">2352</span>;<a class="hl" name="290"> 290 </a> }<a class="l" name="291"> 291 </a><a class="l" name="292"> 292 </a> <span class="c">/* In case of audio CDs, build_track_info() returns 2352 sized nblks */</span><a class="l" name="293"> 293 </a> <b>if</b> (<a href="/source/s?defs=src">src</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> == <span class="n">512</span> && <a href="/source/s?defs=data_cd">data_cd</a>) {<a class="l" name="294"> 294 </a> <a href="/source/s?defs=total_nblks">total_nblks</a> /= <span class="n">4</span>;<a class="l" name="295"> 295 </a> }<a class="l" name="296"> 296 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"\nCopying %d %s track%s : %ld kbytes\n\n"</span>),<a class="l" name="297"> 297 </a> <a href="/source/s?defs=end_tno">end_tno</a>, (<a href="/source/s?defs=audio_cd">audio_cd</a> == <span class="n">1</span>) ? <a href="/source/s?defs=gettext">gettext</a>(<span class="s">"audio"</span>) : <a href="/source/s?defs=gettext">gettext</a>(<span class="s">"data"</span>),<a class="l" name="298"> 298 </a> (<a href="/source/s?defs=end_tno">end_tno</a> > <span class="n">1</span>) ? <span class="s">"s"</span> : <span class="s">""</span>, (<b>long</b>)((<a href="/source/s?defs=total_nblks">total_nblks</a>*<a href="/source/s?defs=blksize">blksize</a>)/<span class="n">1024</span>));<a class="l" name="299"> 299 </a><a class="hl" name="300"> 300 </a> <b>if</b> ((<a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=check_avail_temp_space">check_avail_temp_space</a>(<a href="/source/s?defs=total_nblks">total_nblks</a>*<a href="/source/s?defs=blksize">blksize</a>)) != <span class="n">0</span>) {<a class="l" name="301"> 301 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Cannot use temporary directory : %s\n"</span>),<a class="l" name="302"> 302 </a> <a href="/source/s?defs=strerror">strerror</a>(<a href="/source/s?defs=ret">ret</a>));<a class="l" name="303"> 303 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Use -m to specify alternate"</span><a class="l" name="304"> 304 </a> <span class="s">" temporary directory\n"</span>));<a class="l" name="305"> 305 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="306"> 306 </a> }<a class="l" name="307"> 307 </a><a class="l" name="308"> 308 </a> <span class="c">/*<a class="l" name="309"> 309 </a> * If we can check available space on the target media at this<a class="hl" name="310"> 310 </a> * Stage, then it is always better. We cannot check DVD+R(W)<a class="l" name="311"> 311 </a> * as this media may be formatted and not blank.<a class="l" name="312"> 312 </a> */</span><a class="l" name="313"> 313 </a> <b>if</b> (<a href="/source/s?defs=target">target</a> && (<a href="/source/s?defs=src">src</a> != <a href="/source/s?defs=target">target</a>) && (<a href="/source/s?defs=device_type">device_type</a> != <a href="/source/s?defs=DVD_PLUS">DVD_PLUS</a>) &&<a class="l" name="314"> 314 </a> (<a href="/source/s?defs=device_type">device_type</a> != <a href="/source/s?defs=DVD_PLUS_W">DVD_PLUS_W</a>) && (!<a href="/source/s?defs=check_device">check_device</a>(<a href="/source/s?defs=target">target</a>,<a class="l" name="315"> 315 </a> <a href="/source/s?defs=CHECK_NO_MEDIA">CHECK_NO_MEDIA</a>|<a href="/source/s?defs=CHECK_MEDIA_IS_NOT_BLANK">CHECK_MEDIA_IS_NOT_BLANK</a>))) {<a class="l" name="316"> 316 </a> <a href="/source/s?defs=ensure_media_space">ensure_media_space</a>(<a href="/source/s?defs=total_nblks">total_nblks</a>, <a href="/source/s?defs=end_tno">end_tno</a>);<a class="l" name="317"> 317 </a> }<a class="l" name="318"> 318 </a><a class="l" name="319"> 319 </a> <span class="c">/* for each track */</span><a class="hl" name="320"> 320 </a> <b>for</b> (i = <span class="n">1</span>; i <= <a href="/source/s?defs=end_tno">end_tno</a>; i++) {<a class="l" name="321"> 321 </a> <a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].h = <a href="/source/s?defs=open_temp_file_stream">open_temp_file_stream</a>();<a class="l" name="322"> 322 </a> <b>if</b> (<a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].h == <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="323"> 323 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Cannot create temporary file : %s\n"</span>),<a class="l" name="324"> 324 </a> <a href="/source/s?defs=get_err_str">get_err_str</a>());<a class="l" name="325"> 325 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="326"> 326 </a> }<a class="l" name="327"> 327 </a><a class="l" name="328"> 328 </a> <b>if</b> (<a href="/source/s?defs=audio_cd">audio_cd</a>)<a class="l" name="329"> 329 </a> <a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=read_audio_track">read_audio_track</a>(<a href="/source/s?defs=src">src</a>, &<a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].<a href="/source/s?defs=ti">ti</a>,<a class="hl" name="330"> 330 </a> <a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].h);<a class="l" name="331"> 331 </a> <b>else</b><a class="l" name="332"> 332 </a> <a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=read_data_track">read_data_track</a>(<a href="/source/s?defs=src">src</a>, &<a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].<a href="/source/s?defs=ti">ti</a>,<a class="l" name="333"> 333 </a> <a href="/source/s?defs=tlist">tlist</a>[i - <span class="n">1</span>].h);<a class="l" name="334"> 334 </a> <b>if</b> (<a href="/source/s?defs=ret">ret</a> == <span class="n">0</span>) {<a class="l" name="335"> 335 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Error reading track %d : %s\n"</span>), i,<a class="l" name="336"> 336 </a> <a href="/source/s?defs=get_err_str">get_err_str</a>());<a class="l" name="337"> 337 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="338"> 338 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"%x %x %x %x\n"</span>, <a href="/source/s?defs=uscsi_status">uscsi_status</a>,<a class="l" name="339"> 339 </a> <a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>), <a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>), <a href="/source/s?defs=ASCQ">ASCQ</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>));<a class="hl" name="340"> 340 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="341"> 341 </a> }<a class="l" name="342"> 342 </a> }<a class="l" name="343"> 343 </a><a class="l" name="344"> 344 </a> <span class="c">/*<a class="l" name="345"> 345 </a> * We've finished copying the CD. If source and destination are the same<a class="l" name="346"> 346 </a> * or they where not specified then eject the disk and wait for a new<a class="l" name="347"> 347 </a> * disk to be inserted.<a class="l" name="348"> 348 </a> *<a class="l" name="349"> 349 </a> * Since, DVD+RWs are not blanked just reformated, allow the insertion<a class="hl" name="350"> 350 </a> * of a DVD+RW to be the only condition necessary to complete copying.<a class="l" name="351"> 351 </a> */</span><a class="l" name="352"> 352 </a><a class="l" name="353"> 353 </a> <b>do</b> {<a class="l" name="354"> 354 </a> <b>if</b> (<a href="/source/s?defs=target">target</a> != <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="355"> 355 </a> (<b>void</b>) <a href="/source/s?defs=eject_media">eject_media</a>(<a href="/source/s?defs=target">target</a>);<a class="l" name="356"> 356 </a> }<a class="l" name="357"> 357 </a><a class="l" name="358"> 358 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"\n"</span>);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -