📄 copycd.c.htm
字号:
<a class="l" name="75"> 75 </a> * they cannot be read.<a class="l" name="76"> 76 </a> */</span><a class="l" name="77"> 77 </a><a class="l" name="78"> 78 </a> <b>if</b> (<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> == <span class="n">512</span>) {<a class="l" name="79"> 79 </a> <a href="/source/s?defs=blksize">blksize</a> = <span class="n">512</span>;<a class="hl" name="80"> 80 </a> <a href="/source/s?defs=link_blks_count">link_blks_count</a> = <span class="n">8</span>;<a class="l" name="81"> 81 </a> } <b>else</b> {<a class="l" name="82"> 82 </a> <a href="/source/s?defs=blksize">blksize</a> = <span class="n">2048</span>;<a class="l" name="83"> 83 </a> <a href="/source/s?defs=link_blks_count">link_blks_count</a> = <span class="n">2</span>;<a class="l" name="84"> 84 </a> }<a class="l" name="85"> 85 </a><a class="l" name="86"> 86 </a> <a href="/source/s?defs=buf">buf</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=READ_BURST">READ_BURST</a> * <a href="/source/s?defs=blksize">blksize</a>);<a class="l" name="87"> 87 </a><a class="l" name="88"> 88 </a> <a href="/source/s?defs=print_n_flush">print_n_flush</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Reading track %d..."</span>), <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_no">ti_track_no</a>);<a class="l" name="89"> 89 </a><a class="hl" name="90"> 90 </a> <b>if</b> (<a href="/source/s?defs=verbose">verbose</a>)<a class="l" name="91"> 91 </a> <a href="/source/s?defs=print_n_flush">print_n_flush</a>(<span class="s">"Track size is %u..."</span>, <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a>);<a class="l" name="92"> 92 </a><a class="l" name="93"> 93 </a> <a href="/source/s?defs=init_progress">init_progress</a>();<a class="l" name="94"> 94 </a> <a href="/source/s?defs=cblk">cblk</a> = <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a>;<a class="l" name="95"> 95 </a> <a href="/source/s?defs=blks_read">blks_read</a> = <span class="n">0</span>;<a class="l" name="96"> 96 </a> <b>while</b> (<a href="/source/s?defs=blks_read">blks_read</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="97"> 97 </a> <span class="c">/* Last few are special */</span><a class="l" name="98"> 98 </a> <a href="/source/s?defs=read_chunk">read_chunk</a> = <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> - <a href="/source/s?defs=blks_read">blks_read</a> - <a href="/source/s?defs=link_blks_count">link_blks_count</a>;<a class="l" name="99"> 99 </a> <a href="/source/s?defs=read_chunk">read_chunk</a> = (<a href="/source/s?defs=read_chunk">read_chunk</a> > <a href="/source/s?defs=READ_BURST">READ_BURST</a>) ? <a href="/source/s?defs=READ_BURST">READ_BURST</a> :<a class="hl" name="100"> 100 </a> <a href="/source/s?defs=read_chunk">read_chunk</a>;<a class="l" name="101"> 101 </a> <b>if</b> (<a href="/source/s?defs=read_chunk">read_chunk</a> == <span class="n">0</span>) {<a class="l" name="102"> 102 </a> <span class="c">/* Time for last link blocks */</span><a class="l" name="103"> 103 </a> <a href="/source/s?defs=read_chunk">read_chunk</a> = <a href="/source/s?defs=link_blks_count">link_blks_count</a>;<a class="l" name="104"> 104 </a> }<a class="l" name="105"> 105 </a> <a href="/source/s?defs=read_size">read_size</a> = <a href="/source/s?defs=read_chunk">read_chunk</a> * <a href="/source/s?defs=blksize">blksize</a>;<a class="l" name="106"> 106 </a> <b>if</b> (<a href="/source/s?defs=read10">read10</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=cblk">cblk</a>, <a href="/source/s?defs=read_chunk">read_chunk</a>, <a href="/source/s?defs=buf">buf</a>, <a href="/source/s?defs=read_size">read_size</a>)) {<a class="l" name="107"> 107 </a> <b>if</b> (h-><a href="/source/s?defs=bstr_write">bstr_write</a>(h, <a href="/source/s?defs=buf">buf</a>, <a href="/source/s?defs=read_size">read_size</a>) != <a href="/source/s?defs=read_size">read_size</a>) {<a class="l" name="108"> 108 </a> <b>goto</b> <a href="/source/s?defs=read_data_track_failed">read_data_track_failed</a>;<a class="l" name="109"> 109 </a> }<a class="hl" name="110"> 110 </a> } <b>else</b> {<a class="l" name="111"> 111 </a> <b>if</b> (<a href="/source/s?defs=blks_read">blks_read</a> !=<a class="l" name="112"> 112 </a> (<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> - <a href="/source/s?defs=link_blks_count">link_blks_count</a>)) {<a class="l" name="113"> 113 </a> <b>goto</b> <a href="/source/s?defs=read_data_track_failed">read_data_track_failed</a>;<a class="l" name="114"> 114 </a> } <b>else</b> {<a class="l" name="115"> 115 </a> <span class="c">/* Read can fail for last link sectors */</span><a class="l" name="116"> 116 </a> <a href="/source/s?defs=errno">errno</a> = <span class="n">0</span>;<a class="l" name="117"> 117 </a> }<a class="l" name="118"> 118 </a> }<a class="l" name="119"> 119 </a> <a href="/source/s?defs=blks_read">blks_read</a> += <a href="/source/s?defs=read_chunk">read_chunk</a>;<a class="hl" name="120"> 120 </a> <a href="/source/s?defs=cblk">cblk</a> += <a href="/source/s?defs=read_chunk">read_chunk</a>;<a class="l" name="121"> 121 </a> (<b>void</b>) <a href="/source/s?defs=progress">progress</a>((<a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a>), <a href="/source/s?defs=blks_read">blks_read</a>);<a class="l" name="122"> 122 </a> }<a class="l" name="123"> 123 </a> <span class="c">/* l10n_NOTE : 'done' as in "Reading track 1...done" */</span><a class="l" name="124"> 124 </a> (<b>void</b>) <a href="/source/s?defs=str_print">str_print</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"done.\n"</span>), <a href="/source/s?defs=progress_pos">progress_pos</a>);<a class="l" name="125"> 125 </a> <a href="/source/s?defs=ret">ret</a> = <span class="n">1</span>;<a class="l" name="126"> 126 </a><a href="/source/s?defs=read_data_track_failed">read_data_track_failed</a>:<a class="l" name="127"> 127 </a> <a href="/source/s?defs=sav">sav</a> = <a href="/source/s?defs=errno">errno</a>;<a class="l" name="128"> 128 </a><a class="l" name="129"> 129 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=buf">buf</a>);<a class="hl" name="130"> 130 </a> <a href="/source/s?defs=errno">errno</a> = <a href="/source/s?defs=sav">sav</a>;<a class="l" name="131"> 131 </a> <b>return</b> (<a href="/source/s?defs=ret">ret</a>);<a class="l" name="132"> 132 </a>}<a class="l" name="133"> 133 </a><a class="l" name="134"> 134 </a><b>static</b> <b>void</b><a class="l" name="135"> 135 </a><a href="/source/s?defs=ensure_media_space">ensure_media_space</a>(<a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=total_nblks">total_nblks</a>, <a href="/source/s?defs=uchar_t">uchar_t</a> <a href="/source/s?defs=end_tno">end_tno</a>)<a class="l" name="136"> 136 </a>{<a class="l" name="137"> 137 </a> <a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=nblks_avail">nblks_avail</a>;<a class="l" name="138"> 138 </a> <a href="/source/s?defs=uint_t">uint_t</a> <a href="/source/s?defs=bsize">bsize</a>;<a class="l" name="139"> 139 </a> <a href="/source/s?defs=uint_t">uint_t</a> <a href="/source/s?defs=leadin_size">leadin_size</a> = <span class="n">0</span>;<a class="hl" name="140"> 140 </a><a class="l" name="141"> 141 </a> <a href="/source/s?defs=get_media_type">get_media_type</a>(<a href="/source/s?defs=target">target</a>-><a href="/source/s?defs=d_fd">d_fd</a>);<a class="l" name="142"> 142 </a><a class="l" name="143"> 143 </a> <b>if</b> (<a href="/source/s?defs=device_type">device_type</a> == <a href="/source/s?defs=CD_RW">CD_RW</a>) {<a class="l" name="144"> 144 </a> <a href="/source/s?defs=nblks_avail">nblks_avail</a> = <a href="/source/s?defs=get_last_possible_lba">get_last_possible_lba</a>(<a href="/source/s?defs=target">target</a>);<a class="l" name="145"> 145 </a><a class="l" name="146"> 146 </a> <b>if</b> (<a href="/source/s?defs=nblks_avail">nblks_avail</a> == <span class="n">0</span>) {<a class="l" name="147"> 147 </a><a class="l" name="148"> 148 </a> <span class="c">/* most newer drives use READ FORMAT CAPACITY */</span><a class="l" name="149"> 149 </a> <a href="/source/s?defs=nblks_avail">nblks_avail</a> = <a href="/source/s?defs=read_format_capacity">read_format_capacity</a>(<a href="/source/s?defs=target">target</a>-><a href="/source/s?defs=d_fd">d_fd</a>,<a class="hl" name="150"> 150 </a> &<a href="/source/s?defs=bsize">bsize</a>);<a class="l" name="151"> 151 </a><a class="l" name="152"> 152 </a> <span class="c">/* if both methods fail, fall back on defaults */</span><a class="l" name="153"> 153 </a> <b>if</b> (<a href="/source/s?defs=nblks_avail">nblks_avail</a> == <span class="n">0</span>) {<a class="l" name="154"> 154 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Unable to determine media "</span><a class="l" name="155"> 155 </a> <span class="s">"capacity. Defaulting to 650 MB (74 minute)"</span><a class="l" name="156"> 156 </a> <span class="s">" disc.\n"</span>));<a class="l" name="157"> 157 </a> <a href="/source/s?defs=nblks_avail">nblks_avail</a> = <a href="/source/s?defs=MAX_CD_BLKS">MAX_CD_BLKS</a>;<a class="l" name="158"> 158 </a> }<a class="l" name="159"> 159 </a> <a href="/source/s?defs=leadin_size">leadin_size</a> = <a href="/source/s?defs=end_tno">end_tno</a>*<span class="n">300</span>;<a class="hl" name="160"> 160 </a> }<a class="l" name="161"> 161 </a> } <b>else</b> {<a class="l" name="162"> 162 </a> <span class="c">/*<a class="l" name="163"> 163 </a> * For DVD drives use read_format_capacity as default<a class="l" name="164"> 164 </a> * retrieve the media size, it can be 3.6, 3.9, 4.2,<a class="l" name="165"> 165 </a> * 4.7, or 9.2 GB<a class="l" name="166"> 166 </a> */</span><a class="l" name="167"> 167 </a> <a href="/source/s?defs=nblks_avail">nblks_avail</a> = <a href="/source/s?defs=read_format_capacity">read_format_capacity</a>(<a href="/source/s?defs=target">target</a>-><a href="/source/s?defs=d_fd">d_fd</a>, &<a href="/source/s?defs=bsize">bsize</a>);<a class="l" name="168"> 168 </a><a class="l" name="169"> 169 </a> <span class="c">/* sanity check. if not reasonable default to 4.7 GB */</span><a class="hl" name="170"> 170 </a> <b>if</b> (<a href="/source/s?defs=nblks_avail">nblks_avail</a> < <a href="/source/s?defs=MAX_CD_BLKS">MAX_CD_BLKS</a>) {<a class="l" name="171"> 171 </a> <a href="/source/s?defs=nblks_avail">nblks_avail</a> = <a href="/source/s?defs=MAX_DVD_BLKS">MAX_DVD_BLKS</a>;<a class="l" name="172"> 172 </a> }<a class="l" name="173"> 173 </a> }<a class="l" name="174"> 174 </a><a class="l" name="175"> 175 </a> <b>if</b> ((<a href="/source/s?defs=total_nblks">total_nblks</a> + <a href="/source/s?defs=leadin_size">leadin_size</a>) > <a href="/source/s?defs=nblks_avail">nblks_avail</a>) {<a class="l" name="176"> 176 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Not enough space on the media.\n"</span>));<a class="l" name="177"> 177 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>) {<a class="l" name="178"> 178 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"Need %u only found %u \n"</span>,<a class="l" name="179"> 179 </a> (<a href="/source/s?defs=total_nblks">total_nblks</a> + <a href="/source/s?defs=leadin_size">leadin_size</a>),<a class="hl" name="180"> 180 </a> (<a href="/source/s?defs=uint32_t">uint32_t</a>)<a href="/source/s?defs=nblks_avail">nblks_avail</a>);<a class="l" name="181"> 181 </a> }<a class="l" name="182"> 182 </a><a class="l" name="183"> 183 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="184"> 184 </a> }<a class="l" name="185"> 185 </a>}<a class="l" name="186"> 186 </a><a class="l" name="187"> 187 </a><span class="c">/*<a class="l" name="188"> 188 </a> * This copies both audio and data CDs. It first reads the TOC of the source CD<a class="l" name="189"> 189 </a> * and creates a temp file with the CD image. After this is completed it creates<a class="hl" name="190"> 190 </a> * the target CD using TAO mode.<a class="l" name="191"> 191 </a> */</span><a class="l" name="192"> 192 </a><b>void</b><a class="l" name="193"> 193 </a><a href="/source/s?defs=copy_cd">copy_cd</a>(<b>void</b>)<a class="l" name="194"> 194 </a>{<a class="l" name="195"> 195 </a> <a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=src">src</a>;<a class="l" name="196"> 196 </a> <b>char</b> *p;<a class="l" name="197"> 197 </a> <a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=toc">toc</a>, <a href="/source/s?defs=end_tno">end_tno</a>;<a class="l" name="198"> 198 </a> <b>int</b> <a href="/source/s?defs=blksize">blksize</a>, i;<a class="l" name="199"> 199 </a> <b>int</b> <a href="/source/s?defs=audio_cd">audio_cd</a>, <a href="/source/s?defs=data_cd">data_cd</a>;<a class="hl" name="200"> 200 </a> <a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=total_nblks">total_nblks</a>;<a class="l" name="201"> 201 </a> <b>int</b> <a href="/source/s?defs=ret">ret</a>;<a class="l" name="202"> 202 </a> <b>struct</b> <a href="/source/s?defs=t_data">t_data</a> *<a href="/source/s?defs=tlist">tlist</a>;<a class="l" name="203"> 203 </a><a class="l" name="204"> 204 </a> <a href="/source/s?defs=print_n_flush">print_n_flush</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Analyzing source CD..."</span>));<a class="l" name="205"> 205 </a> (<b>void</b>) <a href="/source/s?defs=check_device">check_device</a>(<a href="/source/s?defs=target">target</a>,<a class="l" name="206"> 206 </a> <a href="/source/s?defs=CHECK_DEVICE_NOT_WRITABLE">CHECK_DEVICE_NOT_WRITABLE</a>|<a href="/source/s?defs=EXIT_IF_CHECK_FAILED">EXIT_IF_CHECK_FAILED</a>);<a class="l" name="207"> 207 </a><a class="l" name="208"> 208 </a> <span class="c">/* if source drive is specified on the command line */</span><a class="l" name="209"> 209 </a><a class="hl" name="210"> 210 </a> <b>if</b> (<a href="/source/s?defs=copy_src">copy_src</a>) {<a class="l" name="211"> 211 </a> p = <a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=PATH_MAX">PATH_MAX</a>);<a class="l" name="212"> 212 </a> <b>if</b> (<a href="/source/s?defs=lookup_device">lookup_device</a>(<a href="/source/s?defs=copy_src">copy_src</a>, p) == <span class="n">0</span>) {<a class="l" name="213"> 213 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">"Cannot find device %s"</span>), <a href="/source/s?defs=copy_src">copy_src</a>);<a class="l" name="214"> 214 </a> <a href="/source/s?defs=err_msg">err_msg</a>(<a href="/source/s?defs=gettext">gettext</a>(<span class="s">" or no media in the drive\n"</span>));<a class="l" name="215"> 215 </a> <a href="/source/s?defs=exit">exit</a>(<span class="n">1</span>);<a class="l" name="216"> 216 </a> }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -