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

📄 tty_io.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
<a name=L363 href="source/kernel/chr_drv/tty_io.c?v=0.97#L363">363</a>                 <a href="ident?v=0.97;i=wake_up">wake_up</a>(&amp;tty-&gt;read_q-&gt;proc_list);<a name=L364 href="source/kernel/chr_drv/tty_io.c?v=0.97#L364">364</a>                 if (b-<a href="ident?v=0.97;i=buf">buf</a> &gt;= minimum || !<a href="ident?v=0.97;i=current">current</a>-&gt;timeout)<a name=L365 href="source/kernel/chr_drv/tty_io.c?v=0.97#L365">365</a>                         break;<a name=L366 href="source/kernel/chr_drv/tty_io.c?v=0.97#L366">366</a>                 if (<a href="ident?v=0.97;i=current">current</a>-&gt;signal &amp; ~current-&gt;blocked) <a name=L367 href="source/kernel/chr_drv/tty_io.c?v=0.97#L367">367</a>                         break;<a name=L368 href="source/kernel/chr_drv/tty_io.c?v=0.97#L368">368</a>                 if (tty-&gt;link &amp;&amp; !tty-&gt;link-&gt;<a href="ident?v=0.97;i=count">count</a>)<a name=L369 href="source/kernel/chr_drv/tty_io.c?v=0.97#L369">369</a>                         break;<a name=L370 href="source/kernel/chr_drv/tty_io.c?v=0.97#L370">370</a>                 <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(tty);<a name=L371 href="source/kernel/chr_drv/tty_io.c?v=0.97#L371">371</a>                 if (tty-&gt;link)<a name=L372 href="source/kernel/chr_drv/tty_io.c?v=0.97#L372">372</a>                         <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty-&gt;link);<a name=L373 href="source/kernel/chr_drv/tty_io.c?v=0.97#L373">373</a>                 <a href="ident?v=0.97;i=cli">cli</a>();<a name=L374 href="source/kernel/chr_drv/tty_io.c?v=0.97#L374">374</a>                 if (<a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty-&gt;secondary))<a name=L375 href="source/kernel/chr_drv/tty_io.c?v=0.97#L375">375</a>                         <a href="ident?v=0.97;i=interruptible_sleep_on">interruptible_sleep_on</a>(&amp;tty-&gt;secondary-&gt;proc_list);<a name=L376 href="source/kernel/chr_drv/tty_io.c?v=0.97#L376">376</a>                 <a href="ident?v=0.97;i=sti">sti</a>();<a name=L377 href="source/kernel/chr_drv/tty_io.c?v=0.97#L377">377</a>         }<a name=L378 href="source/kernel/chr_drv/tty_io.c?v=0.97#L378">378</a>         <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(tty);<a name=L379 href="source/kernel/chr_drv/tty_io.c?v=0.97#L379">379</a>         if (tty-&gt;link &amp;&amp; tty-&gt;link-&gt;write)<a name=L380 href="source/kernel/chr_drv/tty_io.c?v=0.97#L380">380</a>                 <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty-&gt;link);<a name=L381 href="source/kernel/chr_drv/tty_io.c?v=0.97#L381">381</a>         <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = 0;<a name=L382 href="source/kernel/chr_drv/tty_io.c?v=0.97#L382">382</a>         if (b-<a href="ident?v=0.97;i=buf">buf</a>)<a name=L383 href="source/kernel/chr_drv/tty_io.c?v=0.97#L383">383</a>                 return b-<a href="ident?v=0.97;i=buf">buf</a>;<a name=L384 href="source/kernel/chr_drv/tty_io.c?v=0.97#L384">384</a>         if (<a href="ident?v=0.97;i=current">current</a>-&gt;signal &amp; ~current-&gt;blocked)<a name=L385 href="source/kernel/chr_drv/tty_io.c?v=0.97#L385">385</a>                 return -<a href="ident?v=0.97;i=ERESTARTSYS">ERESTARTSYS</a>;<a name=L386 href="source/kernel/chr_drv/tty_io.c?v=0.97#L386">386</a>         if (<a href="ident?v=0.97;i=file">file</a>-&gt;f_flags &amp; <a href="ident?v=0.97;i=O_NONBLOCK">O_NONBLOCK</a>)<a name=L387 href="source/kernel/chr_drv/tty_io.c?v=0.97#L387">387</a>                 return -<a href="ident?v=0.97;i=EAGAIN">EAGAIN</a>;<a name=L388 href="source/kernel/chr_drv/tty_io.c?v=0.97#L388">388</a>         return 0;<a name=L389 href="source/kernel/chr_drv/tty_io.c?v=0.97#L389">389</a> }<a name=L390 href="source/kernel/chr_drv/tty_io.c?v=0.97#L390">390</a> <a name=L391 href="source/kernel/chr_drv/tty_io.c?v=0.97#L391">391</a> static int <a href="ident?v=0.97;i=write_chan">write_chan</a>(unsigned int channel, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>, char * <a href="ident?v=0.97;i=buf">buf</a>, int nr)<a name=L392 href="source/kernel/chr_drv/tty_io.c?v=0.97#L392">392</a> {<a name=L393 href="source/kernel/chr_drv/tty_io.c?v=0.97#L393">393</a>         struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty;<a name=L394 href="source/kernel/chr_drv/tty_io.c?v=0.97#L394">394</a>         char c, *b=<a href="ident?v=0.97;i=buf">buf</a>;<a name=L395 href="source/kernel/chr_drv/tty_io.c?v=0.97#L395">395</a> <a name=L396 href="source/kernel/chr_drv/tty_io.c?v=0.97#L396">396</a>         if (channel &gt; 255)<a name=L397 href="source/kernel/chr_drv/tty_io.c?v=0.97#L397">397</a>                 return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L398 href="source/kernel/chr_drv/tty_io.c?v=0.97#L398">398</a>         tty = <a href="ident?v=0.97;i=TTY_TABLE">TTY_TABLE</a>(channel);<a name=L399 href="source/kernel/chr_drv/tty_io.c?v=0.97#L399">399</a>         if (<a href="ident?v=0.97;i=L_TOSTOP">L_TOSTOP</a>(tty) &amp;&amp; (tty-&gt;pgrp &gt; 0) &amp;&amp;<a name=L400 href="source/kernel/chr_drv/tty_io.c?v=0.97#L400">400</a>             (<a href="ident?v=0.97;i=current">current</a>-&gt;tty == channel) &amp;&amp; (tty-&gt;pgrp != <a href="ident?v=0.97;i=current">current</a>-&gt;pgrp)) {<a name=L401 href="source/kernel/chr_drv/tty_io.c?v=0.97#L401">401</a>                 if (<a href="ident?v=0.97;i=is_orphaned_pgrp">is_orphaned_pgrp</a>(tty-&gt;pgrp))<a name=L402 href="source/kernel/chr_drv/tty_io.c?v=0.97#L402">402</a>                         return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L403 href="source/kernel/chr_drv/tty_io.c?v=0.97#L403">403</a>                 if (!<a href="ident?v=0.97;i=is_ignored">is_ignored</a>(<a href="ident?v=0.97;i=SIGTTOU">SIGTTOU</a>))<a name=L404 href="source/kernel/chr_drv/tty_io.c?v=0.97#L404">404</a>                         return <a href="ident?v=0.97;i=tty_signal">tty_signal</a>(<a href="ident?v=0.97;i=SIGTTOU">SIGTTOU</a>, tty);<a name=L405 href="source/kernel/chr_drv/tty_io.c?v=0.97#L405">405</a>         }<a name=L406 href="source/kernel/chr_drv/tty_io.c?v=0.97#L406">406</a>         if (nr &lt; 0)<a name=L407 href="source/kernel/chr_drv/tty_io.c?v=0.97#L407">407</a>                 return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L408 href="source/kernel/chr_drv/tty_io.c?v=0.97#L408">408</a>         if (!nr)<a name=L409 href="source/kernel/chr_drv/tty_io.c?v=0.97#L409">409</a>                 return 0;<a name=L410 href="source/kernel/chr_drv/tty_io.c?v=0.97#L410">410</a>         if (<a href="ident?v=0.97;i=redirect">redirect</a> &amp;&amp; tty == <a href="ident?v=0.97;i=TTY_TABLE">TTY_TABLE</a>(0))<a name=L411 href="source/kernel/chr_drv/tty_io.c?v=0.97#L411">411</a>                 tty = <a href="ident?v=0.97;i=redirect">redirect</a>;<a name=L412 href="source/kernel/chr_drv/tty_io.c?v=0.97#L412">412</a>         if (!(tty-&gt;write_q &amp;&amp; tty-&gt;write))<a name=L413 href="source/kernel/chr_drv/tty_io.c?v=0.97#L413">413</a>                 return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L414 href="source/kernel/chr_drv/tty_io.c?v=0.97#L414">414</a>         while (nr&gt;0) {<a name=L415 href="source/kernel/chr_drv/tty_io.c?v=0.97#L415">415</a>                 if (<a href="ident?v=0.97;i=current">current</a>-&gt;signal &amp; ~current-&gt;blocked)<a name=L416 href="source/kernel/chr_drv/tty_io.c?v=0.97#L416">416</a>                         break;<a name=L417 href="source/kernel/chr_drv/tty_io.c?v=0.97#L417">417</a>                 if (tty-&gt;link &amp;&amp; !tty-&gt;link-&gt;<a href="ident?v=0.97;i=count">count</a>) {<a name=L418 href="source/kernel/chr_drv/tty_io.c?v=0.97#L418">418</a>                         <a href="ident?v=0.97;i=send_sig">send_sig</a>(<a href="ident?v=0.97;i=SIGPIPE">SIGPIPE</a>,<a href="ident?v=0.97;i=current">current</a>,0);<a name=L419 href="source/kernel/chr_drv/tty_io.c?v=0.97#L419">419</a>                         break;<a name=L420 href="source/kernel/chr_drv/tty_io.c?v=0.97#L420">420</a>                 }<a name=L421 href="source/kernel/chr_drv/tty_io.c?v=0.97#L421">421</a>                 if (<a href="ident?v=0.97;i=FULL">FULL</a>(tty-&gt;write_q)) {<a name=L422 href="source/kernel/chr_drv/tty_io.c?v=0.97#L422">422</a>                         <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty);<a name=L423 href="source/kernel/chr_drv/tty_io.c?v=0.97#L423">423</a>                         <a href="ident?v=0.97;i=cli">cli</a>();<a name=L424 href="source/kernel/chr_drv/tty_io.c?v=0.97#L424">424</a>                         if (<a href="ident?v=0.97;i=FULL">FULL</a>(tty-&gt;write_q))<a name=L425 href="source/kernel/chr_drv/tty_io.c?v=0.97#L425">425</a>                                 <a href="ident?v=0.97;i=interruptible_sleep_on">interruptible_sleep_on</a>(&amp;tty-&gt;write_q-&gt;proc_list);<a name=L426 href="source/kernel/chr_drv/tty_io.c?v=0.97#L426">426</a>                         <a href="ident?v=0.97;i=sti">sti</a>();<a name=L427 href="source/kernel/chr_drv/tty_io.c?v=0.97#L427">427</a>                         continue;<a name=L428 href="source/kernel/chr_drv/tty_io.c?v=0.97#L428">428</a>                 }<a name=L429 href="source/kernel/chr_drv/tty_io.c?v=0.97#L429">429</a>                 while (nr&gt;0 &amp;&amp; !<a href="ident?v=0.97;i=FULL">FULL</a>(tty-&gt;write_q)) {<a name=L430 href="source/kernel/chr_drv/tty_io.c?v=0.97#L430">430</a>                         c=<a href="ident?v=0.97;i=get_fs_byte">get_fs_byte</a>(b);<a name=L431 href="source/kernel/chr_drv/tty_io.c?v=0.97#L431">431</a>                         if (<a href="ident?v=0.97;i=O_POST">O_POST</a>(tty)) {<a name=L432 href="source/kernel/chr_drv/tty_io.c?v=0.97#L432">432</a>                                 if (c==<i>'\r'</i> &amp;&amp; <a href="ident?v=0.97;i=O_CRNL">O_CRNL</a>(tty))<a name=L433 href="source/kernel/chr_drv/tty_io.c?v=0.97#L433">433</a>                                         c=<i>'\n'</i>;<a name=L434 href="source/kernel/chr_drv/tty_io.c?v=0.97#L434">434</a>                                 else if (c==<i>'\n'</i> &amp;&amp; <a href="ident?v=0.97;i=O_NLRET">O_NLRET</a>(tty))<a name=L435 href="source/kernel/chr_drv/tty_io.c?v=0.97#L435">435</a>                                         c=<i>'\r'</i>;<a name=L436 href="source/kernel/chr_drv/tty_io.c?v=0.97#L436">436</a>                                 if (c==<i>'\n'</i> &amp;&amp; <a href="ident?v=0.97;i=O_NLCR">O_NLCR</a>(tty) &amp;&amp;<a name=L437 href="source/kernel/chr_drv/tty_io.c?v=0.97#L437">437</a>                                     !<a href="ident?v=0.97;i=set_bit">set_bit</a>(<a href="ident?v=0.97;i=TTY_CR_PENDING">TTY_CR_PENDING</a>,&amp;tty-&gt;flags)) {<a name=L438 href="source/kernel/chr_drv/tty_io.c?v=0.97#L438">438</a>                                         <a href="ident?v=0.97;i=put_tty_queue">put_tty_queue</a>(13,tty-&gt;write_q);<a name=L439 href="source/kernel/chr_drv/tty_io.c?v=0.97#L439">439</a>                                         continue;<a name=L440 href="source/kernel/chr_drv/tty_io.c?v=0.97#L440">440</a>                                 }<a name=L441 href="source/kernel/chr_drv/tty_io.c?v=0.97#L441">441</a>                                 if (<a href="ident?v=0.97;i=O_LCUC">O_LCUC</a>(tty))<a name=L442 href="source/kernel/chr_drv/tty_io.c?v=0.97#L442">442</a>                                         c=<a href="ident?v=0.97;i=toupper">toupper</a>(c);<a name=L443 href="source/kernel/chr_drv/tty_io.c?v=0.97#L443">443</a>                         }<a name=L444 href="source/kernel/chr_drv/tty_io.c?v=0.97#L444">444</a>                         b++; nr--;<a name=L445 href="source/kernel/chr_drv/tty_io.c?v=0.97#L445">445</a>                         <a href="ident?v=0.97;i=clear_bit">clear_bit</a>(<a href="ident?v=0.97;i=TTY_CR_PENDING">TTY_CR_PENDING</a>,&amp;tty-&gt;flags);<a name=L446 href="source/kernel/chr_drv/tty_io.c?v=0.97#L446">446</a>                         <a href="ident?v=0.97;i=put_tty_queue">put_tty_queue</a>(c,tty-&gt;write_q);<a name=L447 href="source/kernel/chr_drv/tty_io.c?v=0.97#L447">447</a>                 }<a name=L448 href="source/kernel/chr_drv/tty_io.c?v=0.97#L448">448</a>                 if (nr&gt;0)<a name=L449 href="source/kernel/chr_drv/tty_io.c?v=0.97#L449">449</a>                         <a href="ident?v=0.97;i=schedule">schedule</a>();<a name=L450 href="source/kernel/chr_drv/tty_io.c?v=0.97#L450">450</a>         }<a name=L451 href="source/kernel/chr_drv/tty_io.c?v=0.97#L451">451</a>         <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty);<a name=L452 href="source/kernel/chr_drv/tty_io.c?v=0.97#L452">452</a>         if (b-<a href="ident?v=0.97;i=buf">buf</a>)<a name=L453 href="source/kernel/chr_drv/tty_io.c?v=0.97#L453">453</a>                 return b-<a href="ident?v=0.97;i=buf">buf</a>;<a name=L454 href="source/kernel/chr_drv/tty_io.c?v=0.97#L454">454</a>         if (tty-&gt;link &amp;&amp; !tty-&gt;link-&gt;<a href="ident?v=0.97;i=count">count</a>)<a name=L455 href="source/kernel/chr_drv/tty_io.c?v=0.97#L455">455</a>                 return -<a href="ident?v=0.97;i=EPIPE">EPIPE</a>;<a name=L456 href="source/kernel/chr_drv/tty_io

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -