⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 copycd.c.htm

📁 光驱cdrom读写源代码,scsi命令解析
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<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>-&gt;<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>-&gt;<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 &lt;= <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> = &amp;<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>-&gt;<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>-&gt;<a href="/source/s?defs=ti_track_mode">ti_track_mode</a> &amp; <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>-&gt;<a href="/source/s?defs=ti_flags">ti_flags</a> &amp; <a href="/source/s?defs=TI_SESSION_NO_VALID">TI_SESSION_NO_VALID</a>) &amp;&amp;<a class="l" name="264">    264 </a>		    (<a href="/source/s?defs=ti">ti</a>-&gt;<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>-&gt;<a href="/source/s?defs=ti_flags">ti_flags</a> &amp; <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>-&gt;<a href="/source/s?defs=ti_flags">ti_flags</a> &amp; <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> &amp;&amp; <a href="/source/s?defs=audio_cd">audio_cd</a>) || (<a href="/source/s?defs=ti">ti</a>-&gt;<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>-&gt;<a href="/source/s?defs=ti_flags">ti_flags</a> &amp; <a href="/source/s?defs=TI_NWA_VALID">TI_NWA_VALID</a>) &amp;&amp;<a class="l" name="277">    277 </a>		    (<a href="/source/s?defs=ti">ti</a>-&gt;<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>-&gt;<a href="/source/s?defs=d_blksize">d_blksize</a> == <span class="n">512</span> &amp;&amp; <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> &gt; <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> &amp;&amp; (<a href="/source/s?defs=src">src</a> != <a href="/source/s?defs=target">target</a>) &amp;&amp; (<a href="/source/s?defs=device_type">device_type</a> != <a href="/source/s?defs=DVD_PLUS">DVD_PLUS</a>) &amp;&amp;<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>) &amp;&amp; (!<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 &lt;= <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>, &amp;<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>, &amp;<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 + -