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

📄 tty_io.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L232 href="source/kernel/chr_drv/tty_io.c#L232">232</a>         struct <a href="ident?i=tty_struct">tty_struct</a> * tty;<a name=L233 href="source/kernel/chr_drv/tty_io.c#L233">233</a>         char c, * b=<a href="ident?i=buf">buf</a>;<a name=L234 href="source/kernel/chr_drv/tty_io.c#L234">234</a>         int minimum,<a href="ident?i=time">time</a>,flag=0;<a name=L235 href="source/kernel/chr_drv/tty_io.c#L235">235</a>         long oldalarm;<a name=L236 href="source/kernel/chr_drv/tty_io.c#L236">236</a> <a name=L237 href="source/kernel/chr_drv/tty_io.c#L237">237</a>         if (channel&gt;2 || nr&lt;0) return -1;<a name=L238 href="source/kernel/chr_drv/tty_io.c#L238">238</a>         tty = &amp;<a href="ident?i=tty_table">tty_table</a>[channel];<a name=L239 href="source/kernel/chr_drv/tty_io.c#L239">239</a>         oldalarm = <a href="ident?i=current">current</a>-&gt;<a href="ident?i=alarm">alarm</a>;<a name=L240 href="source/kernel/chr_drv/tty_io.c#L240">240</a>         <a href="ident?i=time">time</a> = 10L*tty-&gt;<a href="ident?i=termios">termios</a>.c_cc[<a href="ident?i=VTIME">VTIME</a>];<a name=L241 href="source/kernel/chr_drv/tty_io.c#L241">241</a>         minimum = tty-&gt;<a href="ident?i=termios">termios</a>.c_cc[<a href="ident?i=VMIN">VMIN</a>];<a name=L242 href="source/kernel/chr_drv/tty_io.c#L242">242</a>         if (<a href="ident?i=time">time</a> &amp;&amp; !minimum) {<a name=L243 href="source/kernel/chr_drv/tty_io.c#L243">243</a>                 minimum=1;<a name=L244 href="source/kernel/chr_drv/tty_io.c#L244">244</a>                 if (flag=(!oldalarm || <a href="ident?i=time">time</a>+<a href="ident?i=jiffies">jiffies</a>&lt;oldalarm))<a name=L245 href="source/kernel/chr_drv/tty_io.c#L245">245</a>                         <a href="ident?i=current">current</a>-&gt;<a href="ident?i=alarm">alarm</a> = <a href="ident?i=time">time</a>+<a href="ident?i=jiffies">jiffies</a>;<a name=L246 href="source/kernel/chr_drv/tty_io.c#L246">246</a>         }<a name=L247 href="source/kernel/chr_drv/tty_io.c#L247">247</a>         if (minimum&gt;nr)<a name=L248 href="source/kernel/chr_drv/tty_io.c#L248">248</a>                 minimum=nr;<a name=L249 href="source/kernel/chr_drv/tty_io.c#L249">249</a>         while (nr&gt;0) {<a name=L250 href="source/kernel/chr_drv/tty_io.c#L250">250</a>                 if (flag &amp;&amp; (<a href="ident?i=current">current</a>-&gt;signal &amp; <a href="ident?i=ALRMMASK">ALRMMASK</a>)) {<a name=L251 href="source/kernel/chr_drv/tty_io.c#L251">251</a>                         <a href="ident?i=current">current</a>-&gt;signal &amp;= ~ALRMMASK;<a name=L252 href="source/kernel/chr_drv/tty_io.c#L252">252</a>                         break;<a name=L253 href="source/kernel/chr_drv/tty_io.c#L253">253</a>                 }<a name=L254 href="source/kernel/chr_drv/tty_io.c#L254">254</a>                 if (<a href="ident?i=current">current</a>-&gt;signal)<a name=L255 href="source/kernel/chr_drv/tty_io.c#L255">255</a>                         break;<a name=L256 href="source/kernel/chr_drv/tty_io.c#L256">256</a>                 if (<a href="ident?i=EMPTY">EMPTY</a>(tty-&gt;secondary) || (<a href="ident?i=L_CANON">L_CANON</a>(tty) &amp;&amp;<a name=L257 href="source/kernel/chr_drv/tty_io.c#L257">257</a>                 !tty-&gt;secondary.data &amp;&amp; <a href="ident?i=LEFT">LEFT</a>(tty-&gt;secondary)&gt;20)) {<a name=L258 href="source/kernel/chr_drv/tty_io.c#L258">258</a>                         <a href="ident?i=sleep_if_empty">sleep_if_empty</a>(&amp;tty-&gt;secondary);<a name=L259 href="source/kernel/chr_drv/tty_io.c#L259">259</a>                         continue;<a name=L260 href="source/kernel/chr_drv/tty_io.c#L260">260</a>                 }<a name=L261 href="source/kernel/chr_drv/tty_io.c#L261">261</a>                 do {<a name=L262 href="source/kernel/chr_drv/tty_io.c#L262">262</a>                         <a href="ident?i=GETCH">GETCH</a>(tty-&gt;secondary,c);<a name=L263 href="source/kernel/chr_drv/tty_io.c#L263">263</a>                         if (c==<a href="ident?i=EOF_CHAR">EOF_CHAR</a>(tty) || c==10)<a name=L264 href="source/kernel/chr_drv/tty_io.c#L264">264</a>                                 tty-&gt;secondary.data--;<a name=L265 href="source/kernel/chr_drv/tty_io.c#L265">265</a>                         if (c==<a href="ident?i=EOF_CHAR">EOF_CHAR</a>(tty) &amp;&amp; <a href="ident?i=L_CANON">L_CANON</a>(tty))<a name=L266 href="source/kernel/chr_drv/tty_io.c#L266">266</a>                                 return (b-<a href="ident?i=buf">buf</a>);<a name=L267 href="source/kernel/chr_drv/tty_io.c#L267">267</a>                         else {<a name=L268 href="source/kernel/chr_drv/tty_io.c#L268">268</a>                                 <a href="ident?i=put_fs_byte">put_fs_byte</a>(c,b++);<a name=L269 href="source/kernel/chr_drv/tty_io.c#L269">269</a>                                 if (!--nr)<a name=L270 href="source/kernel/chr_drv/tty_io.c#L270">270</a>                                         break;<a name=L271 href="source/kernel/chr_drv/tty_io.c#L271">271</a>                         }<a name=L272 href="source/kernel/chr_drv/tty_io.c#L272">272</a>                 } while (nr&gt;0 &amp;&amp; !<a href="ident?i=EMPTY">EMPTY</a>(tty-&gt;secondary));<a name=L273 href="source/kernel/chr_drv/tty_io.c#L273">273</a>                 if (<a href="ident?i=time">time</a> &amp;&amp; !<a href="ident?i=L_CANON">L_CANON</a>(tty))<a name=L274 href="source/kernel/chr_drv/tty_io.c#L274">274</a>                         if (flag=(!oldalarm || <a href="ident?i=time">time</a>+<a href="ident?i=jiffies">jiffies</a>&lt;oldalarm))<a name=L275 href="source/kernel/chr_drv/tty_io.c#L275">275</a>                                 <a href="ident?i=current">current</a>-&gt;<a href="ident?i=alarm">alarm</a> = <a href="ident?i=time">time</a>+<a href="ident?i=jiffies">jiffies</a>;<a name=L276 href="source/kernel/chr_drv/tty_io.c#L276">276</a>                         else<a name=L277 href="source/kernel/chr_drv/tty_io.c#L277">277</a>                                 <a href="ident?i=current">current</a>-&gt;<a href="ident?i=alarm">alarm</a> = oldalarm;<a name=L278 href="source/kernel/chr_drv/tty_io.c#L278">278</a>                 if (<a href="ident?i=L_CANON">L_CANON</a>(tty)) {<a name=L279 href="source/kernel/chr_drv/tty_io.c#L279">279</a>                         if (b-<a href="ident?i=buf">buf</a>)<a name=L280 href="source/kernel/chr_drv/tty_io.c#L280">280</a>                                 break;<a name=L281 href="source/kernel/chr_drv/tty_io.c#L281">281</a>                 } else if (b-<a href="ident?i=buf">buf</a> &gt;= minimum)<a name=L282 href="source/kernel/chr_drv/tty_io.c#L282">282</a>                         break;<a name=L283 href="source/kernel/chr_drv/tty_io.c#L283">283</a>         }<a name=L284 href="source/kernel/chr_drv/tty_io.c#L284">284</a>         <a href="ident?i=current">current</a>-&gt;<a href="ident?i=alarm">alarm</a> = oldalarm;<a name=L285 href="source/kernel/chr_drv/tty_io.c#L285">285</a>         if (<a href="ident?i=current">current</a>-&gt;signal &amp;&amp; !(b-<a href="ident?i=buf">buf</a>))<a name=L286 href="source/kernel/chr_drv/tty_io.c#L286">286</a>                 return -<a href="ident?i=EINTR">EINTR</a>;<a name=L287 href="source/kernel/chr_drv/tty_io.c#L287">287</a>         return (b-<a href="ident?i=buf">buf</a>);<a name=L288 href="source/kernel/chr_drv/tty_io.c#L288">288</a> }<a name=L289 href="source/kernel/chr_drv/tty_io.c#L289">289</a> <a name=L290 href="source/kernel/chr_drv/tty_io.c#L290">290</a> int <a href="ident?i=tty_write">tty_write</a>(unsigned channel, char * <a href="ident?i=buf">buf</a>, int nr)<a name=L291 href="source/kernel/chr_drv/tty_io.c#L291">291</a> {<a name=L292 href="source/kernel/chr_drv/tty_io.c#L292">292</a>         static cr_flag=0;<a name=L293 href="source/kernel/chr_drv/tty_io.c#L293">293</a>         struct <a href="ident?i=tty_struct">tty_struct</a> * tty;<a name=L294 href="source/kernel/chr_drv/tty_io.c#L294">294</a>         char c, *b=<a href="ident?i=buf">buf</a>;<a name=L295 href="source/kernel/chr_drv/tty_io.c#L295">295</a> <a name=L296 href="source/kernel/chr_drv/tty_io.c#L296">296</a>         if (channel&gt;2 || nr&lt;0) return -1;<a name=L297 href="source/kernel/chr_drv/tty_io.c#L297">297</a>         tty = channel + <a href="ident?i=tty_table">tty_table</a>;<a name=L298 href="source/kernel/chr_drv/tty_io.c#L298">298</a>         while (nr&gt;0) {<a name=L299 href="source/kernel/chr_drv/tty_io.c#L299">299</a>                 <a href="ident?i=sleep_if_full">sleep_if_full</a>(&amp;tty-&gt;write_q);<a name=L300 href="source/kernel/chr_drv/tty_io.c#L300">300</a>                 if (<a href="ident?i=current">current</a>-&gt;signal)<a name=L301 href="source/kernel/chr_drv/tty_io.c#L301">301</a>                         break;<a name=L302 href="source/kernel/chr_drv/tty_io.c#L302">302</a>                 while (nr&gt;0 &amp;&amp; !<a href="ident?i=FULL">FULL</a>(tty-&gt;write_q)) {<a name=L303 href="source/kernel/chr_drv/tty_io.c#L303">303</a>                         c=<a href="ident?i=get_fs_byte">get_fs_byte</a>(b);<a name=L304 href="source/kernel/chr_drv/tty_io.c#L304">304</a>                         if (<a href="ident?i=O_POST">O_POST</a>(tty)) {<a name=L305 href="source/kernel/chr_drv/tty_io.c#L305">305</a>                                 if (c==<i>'\r'</i> &amp;&amp; <a href="ident?i=O_CRNL">O_CRNL</a>(tty))<a name=L306 href="source/kernel/chr_drv/tty_io.c#L306">306</a>                                         c=<i>'\n'</i>;<a name=L307 href="source/kernel/chr_drv/tty_io.c#L307">307</a>                                 else if (c==<i>'\n'</i> &amp;&amp; <a href="ident?i=O_NLRET">O_NLRET</a>(tty))<a name=L308 href="source/kernel/chr_drv/tty_io.c#L308">308</a>                                         c=<i>'\r'</i>;<a name=L309 href="source/kernel/chr_drv/tty_io.c#L309">309</a>                                 if (c==<i>'\n'</i> &amp;&amp; !cr_flag &amp;&amp; <a href="ident?i=O_NLCR">O_NLCR</a>(tty)) {<a name=L310 href="source/kernel/chr_drv/tty_io.c#L310">310</a>                                         cr_flag = 1;<a name=L311 href="source/kernel/chr_drv/tty_io.c#L311">311</a>                                         <a href="ident?i=PUTCH">PUTCH</a>(13,tty-&gt;write_q);<a name=L312 href="source/kernel/chr_drv/tty_io.c#L312">312</a>                                         continue;<a name=L313 href="source/kernel/chr_drv/tty_io.c#L313">313</a>                                 }<a name=L314 href="source/kernel/chr_drv/tty_io.c#L314">314</a>                                 if (<a href="ident?i=O_LCUC">O_LCUC</a>(tty))<a name=L315 href="source/kernel/chr_drv/tty_io.c#L315">315</a>                                         c=<a href="ident?i=toupper">toupper</a>(c);<a name=L316 href="source/kernel/chr_drv/tty_io.c#L316">316</a>                         }<a name=L317 href="source/kernel/chr_drv/tty_io.c#L317">317</a>                         b++; nr--;<a name=L318 href="source/kernel/chr_drv/tty_io.c#L318">318</a>                         cr_flag = 0;<a name=L319 href="source/kernel/chr_drv/tty_io.c#L319">319</a>                         <a href="ident?i=PUTCH">PUTCH</a>(c,tty-&gt;write_q);<a name=L320 href="source/kernel/chr_drv/tty_io.c#L320">320</a>                 }<a name=L321 href="source/kernel/chr_drv/tty_io.c#L321">321</a>                 tty-&gt;<a href="ident?i=write">write</a>(tty);<a name=L322 href="source/kernel/chr_drv/tty_io.c#L322">322</a>                 if (nr&gt;0)<a name=L323 href="source/kernel/chr_drv/tty_io.c#L323">323</a>                         <a href="ident?i=schedule">schedule</a>();<a name=L324 href="source/kernel/chr_drv/tty_io.c#L324">324</a>         }<a name=L325 href="source/kernel/chr_drv/tty_io.c#L325">325</a>         return (b-<a href="ident?i=buf">buf</a>);<a name=L326 href="source/kernel/chr_drv/tty_io.c#L326">326</a> }<a name=L327 href="source/kernel/chr_drv/tty_io.c#L327">327</a> <a name=L328 href="source/kernel/chr_drv/tty_io.c#L328">328</a> <b><i>/*</i></b><a name=L329 href="source/kernel/chr_drv/tty_io.c#L329">329</a> <b><i> * Jeh, sometimes I really like the 386.</i></b><a name=L330 href="source/kernel/chr_drv/tty_io.c#L330">330</a> <b><i> * This routine is called from an interrupt,</i></b><a name=L331 href="source/kernel/chr_drv/tty_io.c#L331">331</a> <b><i> * and there should be absolutely no problem</i></b><a name=L332 href="source/kernel/chr_drv/tty_io.c#L332">332</a> <b><i> * with sleeping even in an interrupt (I hope).</i></b><a name=L333 href="source/kernel/chr_drv/tty_io.c#L333">333</a> <b><i> * Of course, if somebody proves me wrong, I'll</i></b><a name=L334 href="source/kernel/chr_drv/tty_io.c#L334">334</a> <b><i> * hate intel for all time :-). We'll have to</i></b><a name=L335 href="source/kernel/chr_drv/tty_io.c#L335">335</a> <b><i> * be careful and see to reinstating the interrupt</i></b><a name=L336 href="source/kernel/chr_drv/tty_io.c#L336">336</a> <b><i> * chips before calling this, though.</i></b><a name=L337 href="source/kernel/chr_drv/tty_io.c#L337">337</a> <b><i> *</i></b><a name=L338 href="source/kernel/chr_drv/tty_io.c#L338">338</a> <b><i> * I don't think we sleep here under normal circumstances</i></b><a name=L339 href="source/kernel/chr_drv/tty_io.c#L339">339</a> <b><i> * anyway, which is good, as the task sleeping might be</i></b><a name=L340 href="source/kernel/chr_drv/tty_io.c#L340">340</a> <b><i> * totally innocent.</i></b><a name=L341 href="source/kernel/chr_drv/tty_io.c#L341">341</a> <b><i> */</i></b><a name=L342 href="source/kernel/chr_drv/tty_io.c#L342">342</a> void <a href="ident?i=do_tty_interrupt">do_tty_interrupt</a>(int tty)<a name=L343 href="source/kernel/chr_drv/tty_io.c#L343">343</a> {<a name=L344 href="source/kernel/chr_drv/tty_io.c#L344">344</a>         <a href="ident?i=copy_to_cooked">copy_to_cooked</a>(<a href="ident?i=tty_table">tty_table</a>+tty);<a name=L345 href="source/kernel/chr_drv/tty_io.c#L345">345</a> }<a name=L346 href="source/kernel/chr_drv/tty_io.c#L346">346</a> <a name=L347 href="source/kernel/chr_drv/tty_io.c#L347">347</a> void <a href="ident?i=chr_dev_init">chr_dev_init</a>(void)<a name=L348 href="source/kernel/chr_drv/tty_io.c#L348">348</a> {<a name=L349 href="source/kernel/chr_drv/tty_io.c#L349">349</a> }<a name=L350 href="source/kernel/chr_drv/tty_io.c#L350">350</a> </pre><hr><div align=center>   [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/chr_drv/tty_io.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>

⌨️ 快捷键说明

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