📄 bstream.c.htm
字号:
<a class="l" name="305"> 305 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="306"> 306 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"ISO 9660 header size not sane.\n"</span>);<a class="l" name="307"> 307 </a> h-><a href="/source/s?defs=bstr_close">bstr_close</a>(h);<a class="l" name="308"> 308 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_ISO_BAD_HEADER">STR_ERR_ISO_BAD_HEADER</a>;<a class="l" name="309"> 309 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="hl" name="310"> 310 </a> }<a class="l" name="311"> 311 </a><a class="l" name="312"> 312 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="313"> 313 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"ISO 9660 header size is sane.\n"</span>);<a class="l" name="314"> 314 </a><a class="l" name="315"> 315 </a> <span class="c">/* Skip over the boot block sector of the ISO. */</span><a class="l" name="316"> 316 </a> (<b>void</b>) <a href="/source/s?defs=lseek">lseek</a>(h-><a href="/source/s?defs=bstr_fd">bstr_fd</a>, <a href="/source/s?defs=ISO9660_BOOT_BLOCK_SIZE">ISO9660_BOOT_BLOCK_SIZE</a>, <a href="/source/s?defs=SEEK_SET">SEEK_SET</a>);<a class="l" name="317"> 317 </a><a class="l" name="318"> 318 </a> <span class="c">/*<a class="l" name="319"> 319 </a> * Try to read in the ISO Descriptor and validate this<a class="hl" name="320"> 320 </a> * is in fact an ISO 9660 image.<a class="l" name="321"> 321 </a> */</span><a class="l" name="322"> 322 </a> <b>if</b> (<a href="/source/s?defs=read">read</a>(h-><a href="/source/s?defs=bstr_fd">bstr_fd</a>, <a href="/source/s?defs=iso_desc">iso_desc</a>, <a href="/source/s?defs=ISO9660_PRIMARY_DESC_SIZE">ISO9660_PRIMARY_DESC_SIZE</a>) ==<a class="l" name="323"> 323 </a> <a href="/source/s?defs=ISO9660_PRIMARY_DESC_SIZE">ISO9660_PRIMARY_DESC_SIZE</a>) {<a class="l" name="324"> 324 </a> <span class="c">/*<a class="l" name="325"> 325 </a> * Bytes one through five of a valid ISO 9660 cd image<a class="l" name="326"> 326 </a> * should contain the string CD001. High Sierra format,<a class="l" name="327"> 327 </a> * the ISO 9660 predecessor, fills this field with the<a class="l" name="328"> 328 </a> * string CDROM. If neither is the case then we should<a class="l" name="329"> 329 </a> * close the stream, set str_errno, and return NULL.<a class="hl" name="330"> 330 </a> */</span><a class="l" name="331"> 331 </a> <b>if</b> (<a href="/source/s?defs=strncmp">strncmp</a>(<a href="/source/s?defs=iso_desc">iso_desc</a> + <a href="/source/s?defs=ISO9660_STD_IDENT_OFFSET">ISO9660_STD_IDENT_OFFSET</a>, <span class="s">"CD001"</span>,<a class="l" name="332"> 332 </a> <span class="n">5</span>) != <span class="n">0</span> && <a href="/source/s?defs=strncmp">strncmp</a>(<a href="/source/s?defs=iso_desc">iso_desc</a> + <a href="/source/s?defs=ISO9660_STD_IDENT_OFFSET">ISO9660_STD_IDENT_OFFSET</a>,<a class="l" name="333"> 333 </a> <span class="s">"CDROM"</span>, <span class="n">5</span>) != <span class="n">0</span>) {<a class="l" name="334"> 334 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="335"> 335 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"Invalid ISO 9660 identifier.\n"</span>);<a class="l" name="336"> 336 </a> h-><a href="/source/s?defs=bstr_close">bstr_close</a>(h);<a class="l" name="337"> 337 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_ISO_BAD_HEADER">STR_ERR_ISO_BAD_HEADER</a>;<a class="l" name="338"> 338 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="339"> 339 </a> }<a class="hl" name="340"> 340 </a> } <b>else</b> {<a class="l" name="341"> 341 </a> h-><a href="/source/s?defs=bstr_close">bstr_close</a>(h);<a class="l" name="342"> 342 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_ISO_READ_ERR">STR_ERR_ISO_READ_ERR</a>;<a class="l" name="343"> 343 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="344"> 344 </a> }<a class="l" name="345"> 345 </a><a class="l" name="346"> 346 </a> <span class="c">/*<a class="l" name="347"> 347 </a> * Our ISO image is valid rewind the stream<a class="l" name="348"> 348 </a> * and return the handle.<a class="l" name="349"> 349 </a> */</span><a class="hl" name="350"> 350 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="351"> 351 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"ISO 9660 header is sane.\n"</span>);<a class="l" name="352"> 352 </a> h-><a href="/source/s?defs=bstr_rewind">bstr_rewind</a>(h);<a class="l" name="353"> 353 </a> <b>return</b> (h);<a class="l" name="354"> 354 </a>}<a class="l" name="355"> 355 </a><a class="l" name="356"> 356 </a><a href="/source/s?defs=bstreamhandle">bstreamhandle</a><a class="l" name="357"> 357 </a><a href="/source/s?defs=open_stdin_read_stream">open_stdin_read_stream</a>(<b>void</b>)<a class="l" name="358"> 358 </a>{<a class="l" name="359"> 359 </a> <a href="/source/s?defs=bstreamhandle">bstreamhandle</a> h;<a class="hl" name="360"> 360 </a> <b>int</b> <a href="/source/s?defs=mode">mode</a>;<a class="l" name="361"> 361 </a><a class="l" name="362"> 362 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <span class="n">0</span>;<a class="l" name="363"> 363 </a> <b>if</b> ((<a href="/source/s?defs=mode">mode</a> = <a href="/source/s?defs=fcntl">fcntl</a>(<span class="n">0</span>, <a href="/source/s?defs=F_GETFD">F_GETFD</a>, <a href="/source/s?defs=NULL">NULL</a>)) < <span class="n">0</span>) {<a class="l" name="364"> 364 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_NO_READ_STDIN">STR_ERR_NO_READ_STDIN</a>;<a class="l" name="365"> 365 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="366"> 366 </a> }<a class="l" name="367"> 367 </a> <a href="/source/s?defs=mode">mode</a> &= <span class="n">3</span>;<a class="l" name="368"> 368 </a> <b>if</b> ((<a href="/source/s?defs=mode">mode</a> != <a href="/source/s?defs=O_RDONLY">O_RDONLY</a>) && (<a href="/source/s?defs=mode">mode</a> != <a href="/source/s?defs=O_RDWR">O_RDWR</a>)) {<a class="l" name="369"> 369 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_NO_READ_STDIN">STR_ERR_NO_READ_STDIN</a>;<a class="hl" name="370"> 370 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="371"> 371 </a> }<a class="l" name="372"> 372 </a> h = (<a href="/source/s?defs=bstreamhandle">bstreamhandle</a>)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<b>sizeof</b> (*h));<a class="l" name="373"> 373 </a> h-><a href="/source/s?defs=bstr_fd">bstr_fd</a> = <span class="n">0</span>;<a class="l" name="374"> 374 </a> h-><a href="/source/s?defs=bstr_read">bstr_read</a> = <a href="/source/s?defs=file_stream_read">file_stream_read</a>;<a class="l" name="375"> 375 </a> h-><a href="/source/s?defs=bstr_close">bstr_close</a> = <a href="/source/s?defs=stdin_stream_close">stdin_stream_close</a>;<a class="l" name="376"> 376 </a> h-><a href="/source/s?defs=bstr_size">bstr_size</a> = <a href="/source/s?defs=file_stream_size">file_stream_size</a>;<a class="l" name="377"> 377 </a> h-><a href="/source/s?defs=bstr_rewind">bstr_rewind</a> = <a href="/source/s?defs=stdin_stream_rewind">stdin_stream_rewind</a>;<a class="l" name="378"> 378 </a><a class="l" name="379"> 379 </a> <b>return</b> (h);<a class="hl" name="380"> 380 </a>}<a class="l" name="381"> 381 </a><a class="l" name="382"> 382 </a><a href="/source/s?defs=bstreamhandle">bstreamhandle</a><a class="l" name="383"> 383 </a><a href="/source/s?defs=open_au_read_stream">open_au_read_stream</a>(<b>char</b> *<a href="/source/s?defs=fname">fname</a>)<a class="l" name="384"> 384 </a>{<a class="l" name="385"> 385 </a> <a href="/source/s?defs=bstreamhandle">bstreamhandle</a> h;<a class="l" name="386"> 386 </a> <b>int</b> <a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=sav">sav</a>;<a class="l" name="387"> 387 </a> <a href="/source/s?defs=au_filehdr_t">au_filehdr_t</a> *<a href="/source/s?defs=au">au</a>;<a class="l" name="388"> 388 </a> <b>struct</b> <a href="/source/s?defs=stat">stat</a> <a href="/source/s?defs=st">st</a>;<a class="l" name="389"> 389 </a> <a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=data_size">data_size</a>;<a class="hl" name="390"> 390 </a><a class="l" name="391"> 391 </a> <a href="/source/s?defs=au">au</a> = <a href="/source/s?defs=NULL">NULL</a>;<a class="l" name="392"> 392 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <span class="n">0</span>;<a class="l" name="393"> 393 </a> <a href="/source/s?defs=fd">fd</a> = <a href="/source/s?defs=open">open</a>(<a href="/source/s?defs=fname">fname</a>, <a href="/source/s?defs=O_RDONLY">O_RDONLY</a>);<a class="l" name="394"> 394 </a> <b>if</b> (<a href="/source/s?defs=fd">fd</a> < <span class="n">0</span>)<a class="l" name="395"> 395 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="396"> 396 </a><a class="l" name="397"> 397 </a> <b>if</b> (<a href="/source/s?defs=fstat">fstat</a>(<a href="/source/s?defs=fd">fd</a>, &<a href="/source/s?defs=st">st</a>) < <span class="n">0</span>) {<a class="l" name="398"> 398 </a> <b>goto</b> <a href="/source/s?defs=au_open_failed">au_open_failed</a>;<a class="l" name="399"> 399 </a> }<a class="hl" name="400"> 400 </a> <b>if</b> ((<a href="/source/s?defs=st">st</a>.<a href="/source/s?defs=st_mode">st_mode</a> & <a href="/source/s?defs=S_IFMT">S_IFMT</a>) != <a href="/source/s?defs=S_IFREG">S_IFREG</a>) {<a class="l" name="401"> 401 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_NO_REG_FILE">STR_ERR_NO_REG_FILE</a>;<a class="l" name="402"> 402 </a> <b>goto</b> <a href="/source/s?defs=au_open_failed">au_open_failed</a>;<a class="l" name="403"> 403 </a> }<a class="l" name="404"> 404 </a> <a href="/source/s?defs=au">au</a> = (<a href="/source/s?defs=au_filehdr_t">au_filehdr_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<b>sizeof</b> (*<a href="/source/s?defs=au">au</a>));<a class="l" name="405"> 405 </a> <b>if</b> (<a href="/source/s?defs=read">read</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=au">au</a>, <b>sizeof</b> (*<a href="/source/s?defs=au">au</a>)) != <b>sizeof</b> (*<a href="/source/s?defs=au">au</a>)) {<a class="l" name="406"> 406 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_AU_READ_ERR">STR_ERR_AU_READ_ERR</a>;<a class="l" name="407"> 407 </a> <b>goto</b> <a href="/source/s?defs=au_open_failed">au_open_failed</a>;<a class="l" name="408"> 408 </a> }<a class="l" name="409"> 409 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_magic">au_magic</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_magic">au_magic</a>);<a class="hl" name="410"> 410 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_offset">au_offset</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_offset">au_offset</a>);<a class="l" name="411"> 411 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_data_size">au_data_size</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_data_size">au_data_size</a>);<a class="l" name="412"> 412 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_encoding">au_encoding</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_encoding">au_encoding</a>);<a class="l" name="413"> 413 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_sample_rate">au_sample_rate</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_sample_rate">au_sample_rate</a>);<a class="l" name="414"> 414 </a> <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_channels">au_channels</a> = <a href="/source/s?defs=BE32_TO_CPU">BE32_TO_CPU</a>(<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_channels">au_channels</a>);<a class="l" name="415"> 415 </a><a class="l" name="416"> 416 </a> <b>if</b> (<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_magic">au_magic</a> != <a href="/source/s?defs=AUDIO_AU_FILE_MAGIC">AUDIO_AU_FILE_MAGIC</a>) {<a class="l" name="417"> 417 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_AU_BAD_HEADER">STR_ERR_AU_BAD_HEADER</a>;<a class="l" name="418"> 418 </a> <b>goto</b> <a href="/source/s?defs=au_open_failed">au_open_failed</a>;<a class="l" name="419"> 419 </a> }<a class="hl" name="420"> 420 </a> <b>if</b> ((<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_encoding">au_encoding</a> != <a href="/source/s?defs=AUDIO_AU_ENCODING_LINEAR_16">AUDIO_AU_ENCODING_LINEAR_16</a>) ||<a class="l" name="421"> 421 </a> (<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_sample_rate">au_sample_rate</a> != <span class="n">44100</span>) || (<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_channels">au_channels</a> != <span class="n">2</span>)) {<a class="l" name="422"> 422 </a><a class="l" name="423"> 423 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_AU_UNSUPPORTED_FORMAT">STR_ERR_AU_UNSUPPORTED_FORMAT</a>;<a class="l" name="424"> 424 </a> <b>goto</b> <a href="/source/s?defs=au_open_failed">au_open_failed</a>;<a class="l" name="425"> 425 </a> }<a class="l" name="426"> 426 </a> <b>if</b> (<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_data_size">au_data_size</a> != <a href="/source/s?defs=AUDIO_AU_UNKNOWN_SIZE">AUDIO_AU_UNKNOWN_SIZE</a>) {<a class="l" name="427"> 427 </a> <b>if</b> ((<a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_offset">au_offset</a> + <a href="/source/s?defs=au">au</a>-><a href="/source/s?defs=au_data_size">au_data_size</a>) != <a href="/source/s?defs=st">st</a>.<a href="/source/s?defs=st_size">st_size</a>) {<a class="l" name="428"> 428 </a> <a href="/source/s?defs=str_errno">str_errno</a> = <a href="/source/s?defs=STR_ERR_AU_BAD_HEADER">STR_ERR_AU_BAD_HEADER</a>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -