📄 trackio.c.htm
字号:
<a class="l" name="314"> 314 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_total_size">iob_total_size</a>) {<a class="l" name="315"> 315 </a><a class="l" name="316"> 316 </a> <span class="c">/*<a class="l" name="317"> 317 </a> * This should not occur, but we are trying to<a class="l" name="318"> 318 </a> * write past the end of the buffer. return<a class="l" name="319"> 319 </a> * with an error.<a class="hl" name="320"> 320 </a> */</span><a class="l" name="321"> 321 </a> <a href="/source/s?defs=sz_read">sz_read</a> = -<span class="n">1</span>;<a class="l" name="322"> 322 </a> <b>break</b>;<a class="l" name="323"> 323 </a> }<a class="l" name="324"> 324 </a><a class="l" name="325"> 325 </a> <span class="c">/*<a class="l" name="326"> 326 </a> * Try to continue reading in case the data is being<a class="l" name="327"> 327 </a> * piped in.<a class="l" name="328"> 328 </a> */</span><a class="l" name="329"> 329 </a> <a href="/source/s?defs=ret">ret</a> = h-><a href="/source/s?defs=bstr_read">bstr_read</a>(h, &<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a>[<a href="/source/s?defs=sz_read">sz_read</a>],<a class="hl" name="330"> 330 </a> (<a href="/source/s?defs=blksize">blksize</a> - <a href="/source/s?defs=rem">rem</a>));<a class="l" name="331"> 331 </a><a class="l" name="332"> 332 </a> <b>if</b> (<a href="/source/s?defs=ret">ret</a> < <span class="n">0</span>) {<a class="l" name="333"> 333 </a> <a href="/source/s?defs=sz_read">sz_read</a> = <a href="/source/s?defs=ret">ret</a>;<a class="l" name="334"> 334 </a> <b>break</b>;<a class="l" name="335"> 335 </a> }<a class="l" name="336"> 336 </a><a class="l" name="337"> 337 </a> <span class="c">/*<a class="l" name="338"> 338 </a> * No more data. We need to make sure that we are<a class="l" name="339"> 339 </a> * aligned with the blocksize. so pad the rest of<a class="hl" name="340"> 340 </a> * the buffer with 0s<a class="l" name="341"> 341 </a> */</span><a class="l" name="342"> 342 </a><a class="l" name="343"> 343 </a> <b>if</b> (<a href="/source/s?defs=ret">ret</a> == <span class="n">0</span>) {<a class="l" name="344"> 344 </a> <a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=blksize">blksize</a> - <a href="/source/s?defs=rem">rem</a>;<a class="l" name="345"> 345 </a> (<b>void</b>) <a href="/source/s?defs=memset">memset</a>(&<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a>[<a href="/source/s?defs=sz_read">sz_read</a>],<a class="l" name="346"> 346 </a> <span class="n">0</span>, <a href="/source/s?defs=ret">ret</a>);<a class="l" name="347"> 347 </a> }<a class="l" name="348"> 348 </a> <a href="/source/s?defs=sz_read">sz_read</a> += <a href="/source/s?defs=ret">ret</a>;<a class="l" name="349"> 349 </a> }<a class="hl" name="350"> 350 </a><a class="l" name="351"> 351 </a> <b>if</b> (<a href="/source/s?defs=sz_read">sz_read</a> < <span class="n">0</span>) {<a class="l" name="352"> 352 </a><a class="l" name="353"> 353 </a> <span class="c">/* reading the source failed, clean up and return */</span><a class="l" name="354"> 354 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=err_type">err_type</a> = <a href="/source/s?defs=TRACKIO_ERR_SYSTEM">TRACKIO_ERR_SYSTEM</a>;<a class="l" name="355"> 355 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=te_errno">te_errno</a> = <a href="/source/s?defs=errno">errno</a>;<a class="l" name="356"> 356 </a> <b>goto</b> <a href="/source/s?defs=write_track_failed">write_track_failed</a>;<a class="l" name="357"> 357 </a> }<a class="l" name="358"> 358 </a><a class="l" name="359"> 359 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_start_blk">iob_start_blk</a> = <a href="/source/s?defs=start_b">start_b</a>;<a class="hl" name="360"> 360 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_nblks">iob_nblks</a> = (<a href="/source/s?defs=sz_read">sz_read</a>/<a href="/source/s?defs=blksize">blksize</a>);<a class="l" name="361"> 361 </a> <a href="/source/s?defs=start_b">start_b</a> += <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_nblks">iob_nblks</a>;<a class="l" name="362"> 362 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_data_size">iob_data_size</a> = <a href="/source/s?defs=sz_read">sz_read</a>;<a class="l" name="363"> 363 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_state">iob_state</a> = <a href="/source/s?defs=IOBS_READY">IOBS_READY</a>;<a class="l" name="364"> 364 </a> <b>if</b> (<a href="/source/s?defs=sz_read">sz_read</a> == <span class="n">0</span>)<a class="l" name="365"> 365 </a> <b>break</b>;<a class="l" name="366"> 366 </a> }<a class="l" name="367"> 367 </a><a class="l" name="368"> 368 </a> <a href="/source/s?defs=tio_fd">tio_fd</a> = <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>;<a class="l" name="369"> 369 </a> <a href="/source/s?defs=tio_trackno">tio_trackno</a> = <a href="/source/s?defs=ti">ti</a>-><a href="/source/s?defs=ti_track_no">ti_track_no</a>;<a class="hl" name="370"> 370 </a><a class="l" name="371"> 371 </a> <span class="c">/* Install signal handler for CTRL-C */</span><a class="l" name="372"> 372 </a> <a href="/source/s?defs=ohandler">ohandler</a> = <a href="/source/s?defs=signal">signal</a>(<a href="/source/s?defs=SIGINT">SIGINT</a>, <a href="/source/s?defs=trackio_sig_handler">trackio_sig_handler</a>);<a class="l" name="373"> 373 </a> <b>if</b> (<a href="/source/s?defs=ohandler">ohandler</a>) {<a class="l" name="374"> 374 </a> <a href="/source/s?defs=signal_handler_installed">signal_handler_installed</a> = <span class="n">1</span>;<a class="l" name="375"> 375 </a> }<a class="l" name="376"> 376 </a><a class="l" name="377"> 377 </a> <span class="c">/* Create thread which will issue commands to write to device */</span><a class="l" name="378"> 378 </a> <b>if</b> (<a href="/source/s?defs=thr_create">thr_create</a>(<span class="n">0</span>, <span class="n">0</span>, <a href="/source/s?defs=write_to_cd">write_to_cd</a>, <a href="/source/s?defs=NULL">NULL</a>,<a class="l" name="379"> 379 </a> <a href="/source/s?defs=THR_BOUND">THR_BOUND</a> | <a href="/source/s?defs=THR_NEW_LWP">THR_NEW_LWP</a>, &<a href="/source/s?defs=tio_thread">tio_thread</a>) != <span class="n">0</span>) {<a class="hl" name="380"> 380 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=err_type">err_type</a> = <a href="/source/s?defs=TRACKIO_ERR_SYSTEM">TRACKIO_ERR_SYSTEM</a>;<a class="l" name="381"> 381 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=te_errno">te_errno</a> = <a href="/source/s?defs=errno">errno</a>;<a class="l" name="382"> 382 </a> <b>goto</b> <a href="/source/s?defs=write_track_failed">write_track_failed</a>;<a class="l" name="383"> 383 </a> }<a class="l" name="384"> 384 </a> <a href="/source/s?defs=write_cd_thr_created">write_cd_thr_created</a> = <span class="n">1</span>;<a class="l" name="385"> 385 </a><a class="l" name="386"> 386 </a> <span class="c">/* If caller specified a callback, create a thread to do callbacks */</span><a class="l" name="387"> 387 </a> <b>if</b> (<a href="/source/s?defs=cb">cb</a> != <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="388"> 388 </a> <a href="/source/s?defs=init_pcb_data">init_pcb_data</a>();<a class="l" name="389"> 389 </a> <a href="/source/s?defs=pcb_cb">pcb_cb</a> = <a href="/source/s?defs=cb">cb</a>;<a class="hl" name="390"> 390 </a> <a href="/source/s?defs=pcb_arg">pcb_arg</a> = <a href="/source/s?defs=arg">arg</a>;<a class="l" name="391"> 391 </a> <b>if</b> (<a href="/source/s?defs=thr_create">thr_create</a>(<span class="n">0</span>, <span class="n">0</span>, <a href="/source/s?defs=progress_callback">progress_callback</a>, <a href="/source/s?defs=NULL">NULL</a>,<a class="l" name="392"> 392 </a> <a href="/source/s?defs=THR_BOUND">THR_BOUND</a> | <a href="/source/s?defs=THR_NEW_LWP">THR_NEW_LWP</a>, &<a href="/source/s?defs=pc_thread">pc_thread</a>) != <span class="n">0</span>) {<a class="l" name="393"> 393 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=err_type">err_type</a> = <a href="/source/s?defs=TRACKIO_ERR_SYSTEM">TRACKIO_ERR_SYSTEM</a>;<a class="l" name="394"> 394 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=te_errno">te_errno</a> = <a href="/source/s?defs=errno">errno</a>;<a class="l" name="395"> 395 </a> <b>goto</b> <a href="/source/s?defs=write_track_failed">write_track_failed</a>;<a class="l" name="396"> 396 </a> }<a class="l" name="397"> 397 </a> <a href="/source/s?defs=progress_callback_thr_created">progress_callback_thr_created</a> = <span class="n">1</span>;<a class="l" name="398"> 398 </a> }<a class="l" name="399"> 399 </a><a class="hl" name="400"> 400 </a> i = <span class="n">0</span>;<a class="l" name="401"> 401 </a> <b>while</b> (<a href="/source/s?defs=sz_read">sz_read</a> != <span class="n">0</span>) {<a class="l" name="402"> 402 </a> (<b>void</b>) <a href="/source/s?defs=mutex_lock">mutex_lock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="403"> 403 </a> <b>while</b> ((<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_state">iob_state</a> != <a href="/source/s?defs=IOBS_EMPTY">IOBS_EMPTY</a>) &&<a class="l" name="404"> 404 </a> (<a href="/source/s?defs=tio_errno">tio_errno</a> == <span class="n">0</span>) && (<a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a> == <span class="n">0</span>)) {<a class="l" name="405"> 405 </a><a class="l" name="406"> 406 </a> <span class="c">/* Do callbacks only if there is nothing else to do */</span><a class="l" name="407"> 407 </a> <b>if</b> (<a href="/source/s?defs=cb">cb</a> != <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="408"> 408 </a> (<b>void</b>) <a href="/source/s?defs=mutex_lock">mutex_lock</a>(&<a href="/source/s?defs=pcb_mutex">pcb_mutex</a>);<a class="l" name="409"> 409 </a> (<b>void</b>) <a href="/source/s?defs=cond_broadcast">cond_broadcast</a>(&<a href="/source/s?defs=pcb_cond">pcb_cond</a>);<a class="hl" name="410"> 410 </a> (<b>void</b>) <a href="/source/s?defs=mutex_unlock">mutex_unlock</a>(&<a href="/source/s?defs=pcb_mutex">pcb_mutex</a>);<a class="l" name="411"> 411 </a> }<a class="l" name="412"> 412 </a><a class="l" name="413"> 413 </a> <span class="c">/* If user requested abort, bail out */</span><a class="l" name="414"> 414 </a> <b>if</b> (<a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a> || <a href="/source/s?defs=tio_got_ctrl_c">tio_got_ctrl_c</a>) {<a class="l" name="415"> 415 </a> <b>break</b>;<a class="l" name="416"> 416 </a> }<a class="l" name="417"> 417 </a> (<b>void</b>) <a href="/source/s?defs=cond_wait">cond_wait</a>(&<a href="/source/s?defs=tio_cond">tio_cond</a>, &<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="418"> 418 </a> }<a class="l" name="419"> 419 </a> <b>if</b> (<a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a> || <a href="/source/s?defs=tio_got_ctrl_c">tio_got_ctrl_c</a>) {<a class="hl" name="420"> 420 </a> (<b>void</b>) <a href="/source/s?defs=mutex_unlock">mutex_unlock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="421"> 421 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=err_type">err_type</a> = <a href="/source/s?defs=TRACKIO_ERR_USER_ABORT">TRACKIO_ERR_USER_ABORT</a>;<a class="l" name="422"> 422 </a> <b>goto</b> <a href="/source/s?defs=write_track_failed">write_track_failed</a>;<a class="l" name="423"> 423 </a> }<a class="l" name="424"> 424 </a> <span class="c">/*<a class="l" name="425"> 425 </a> * We've got a transport error, stop writing, save all<a class="l" name="426"> 426 </a> * of the error information and clean up the threads.<a class="l" name="427"> 427 </a> */</span><a class="l" name="428"> 428 </a> <b>if</b> (<a href="/source/s?defs=tio_errno">tio_errno</a> != <span class="n">0</span>) {<a class="l" name="429"> 429 </a> (<b>void</b>) <a href="/source/s?defs=mutex_unlock">mutex_unlock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="hl" name="430"> 430 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=err_type">err_type</a> = <a href="/source/s?defs=TRACKIO_ERR_TRANSPORT">TRACKIO_ERR_TRANSPORT</a>;<a class="l" name="431"> 431 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=te_errno">te_errno</a> = <a href="/source/s?defs=tio_errno">tio_errno</a>;<a class="l" name="432"> 432 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=status">status</a> = <a href="/source/s?defs=uscsi_status">uscsi_status</a>;<a class="l" name="433"> 433 </a> <b>if</b> (<a href="/source/s?defs=uscsi_status">uscsi_status</a> == <span class="n">2</span>) {<a class="l" name="434"> 434 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=key">key</a> = <a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) & <span class="n">0xf</span>;<a class="l" name="435"> 435 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=asc">asc</a> = <a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>);<a class="l" name="436"> 436 </a> <a href="/source/s?defs=te">te</a>-><a href="/source/s?defs=ascq">ascq</a> = <a href="/source/s?defs=ASCQ">ASCQ</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>);<a class="l" name="437"> 437 </a> }<a class="l" name="438"> 438 </a> <b>goto</b> <a href="/source/s?defs=write_track_failed">write_track_failed</a>;<a class="l" name="439"> 439 </a> }<a class="hl" name="440"> 440 </a> <a href="/source/s?defs=pcb_completed_io_size">pcb_completed_io_size</a> += <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_data_size">iob_data_size</a>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -