📄 tty_ioctl.c
字号:
<a name=L201 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L201">201</a> tmp = (char *) &tty-><a href="ident?v=0.97;i=winsize">winsize</a>;<a name=L202 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L202">202</a> changed = 0;<a name=L203 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L203">203</a> for (i = 0; i < sizeof (*ws) ; i++,tmp++) {<a name=L204 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L204">204</a> c = <a href="ident?v=0.97;i=get_fs_byte">get_fs_byte</a>(i + (char *) ws);<a name=L205 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L205">205</a> if (c == *tmp)<a name=L206 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L206">206</a> continue;<a name=L207 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L207">207</a> changed = 1;<a name=L208 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L208">208</a> *tmp = c;<a name=L209 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L209">209</a> }<a name=L210 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L210">210</a> if (changed)<a name=L211 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L211">211</a> <a href="ident?v=0.97;i=kill_pg">kill_pg</a>(tty->pgrp, <a href="ident?v=0.97;i=SIGWINCH">SIGWINCH</a>, 1);<a name=L212 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L212">212</a> return 0;<a name=L213 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L213">213</a> }<a name=L214 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L214">214</a> <a name=L215 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L215">215</a> static int <a href="ident?v=0.97;i=get_window_size">get_window_size</a>(struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty, struct <a href="ident?v=0.97;i=winsize">winsize</a> * ws)<a name=L216 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L216">216</a> {<a name=L217 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L217">217</a> int i;<a name=L218 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L218">218</a> char * tmp;<a name=L219 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L219">219</a> <a name=L220 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L220">220</a> if (!ws)<a name=L221 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L221">221</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L222 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L222">222</a> <a href="ident?v=0.97;i=verify_area">verify_area</a>(ws, sizeof (*ws));<a name=L223 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L223">223</a> tmp = (char *) ws;<a name=L224 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L224">224</a> for (i = 0; i < sizeof (struct <a href="ident?v=0.97;i=winsize">winsize</a>) ; i++,tmp++)<a name=L225 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L225">225</a> <a href="ident?v=0.97;i=put_fs_byte">put_fs_byte</a>(((char *) &tty-><a href="ident?v=0.97;i=winsize">winsize</a>)[i], tmp);<a name=L226 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L226">226</a> return 0;<a name=L227 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L227">227</a> }<a name=L228 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L228">228</a> <a name=L229 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L229">229</a> int <a href="ident?v=0.97;i=tty_ioctl">tty_ioctl</a>(struct <a href="ident?v=0.97;i=inode">inode</a> * <a href="ident?v=0.97;i=inode">inode</a>, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>,<a name=L230 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L230">230</a> unsigned int cmd, unsigned int arg)<a name=L231 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L231">231</a> {<a name=L232 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L232">232</a> struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty;<a name=L233 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L233">233</a> struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * other_tty;<a name=L234 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L234">234</a> int pgrp;<a name=L235 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L235">235</a> int dev;<a name=L236 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L236">236</a> <a name=L237 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L237">237</a> if (<a href="ident?v=0.97;i=MAJOR">MAJOR</a>(<a href="ident?v=0.97;i=file">file</a>->f_rdev) != 4) {<a name=L238 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L238">238</a> <a href="ident?v=0.97;i=printk">printk</a>(<i>"tty_ioctl: tty pseudo-major != 4\n"</i>);<a name=L239 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L239">239</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L240 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L240">240</a> }<a name=L241 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L241">241</a> dev = <a href="ident?v=0.97;i=MINOR">MINOR</a>(<a href="ident?v=0.97;i=file">file</a>->f_rdev);<a name=L242 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L242">242</a> tty = <a href="ident?v=0.97;i=tty_table">tty_table</a> + (dev ? ((dev < 64)? dev-1:dev) : <a href="ident?v=0.97;i=fg_console">fg_console</a>);<a name=L243 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L243">243</a> <a name=L244 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L244">244</a> if (<a href="ident?v=0.97;i=IS_A_PTY">IS_A_PTY</a>(dev))<a name=L245 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L245">245</a> other_tty = <a href="ident?v=0.97;i=tty_table">tty_table</a> + <a href="ident?v=0.97;i=PTY_OTHER">PTY_OTHER</a>(dev);<a name=L246 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L246">246</a> else<a name=L247 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L247">247</a> other_tty = <a href="ident?v=0.97;i=NULL">NULL</a>;<a name=L248 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L248">248</a> <a name=L249 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L249">249</a> if (!(tty->write_q && tty->read_q && tty->secondary && tty->write))<a name=L250 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L250">250</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L251 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L251">251</a> switch (cmd) {<a name=L252 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L252">252</a> case <a href="ident?v=0.97;i=TCGETS">TCGETS</a>:<a name=L253 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L253">253</a> return <a href="ident?v=0.97;i=get_termios">get_termios</a>(tty,(struct <a href="ident?v=0.97;i=termios">termios</a> *) arg);<a name=L254 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L254">254</a> case <a href="ident?v=0.97;i=TCSETSF">TCSETSF</a>:<a name=L255 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L255">255</a> <a href="ident?v=0.97;i=flush_input">flush_input</a>(tty);<a name=L256 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L256">256</a> <b><i>/* fallthrough */</i></b><a name=L257 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L257">257</a> case <a href="ident?v=0.97;i=TCSETSW">TCSETSW</a>:<a name=L258 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L258">258</a> <a href="ident?v=0.97;i=wait_until_sent">wait_until_sent</a>(tty);<a name=L259 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L259">259</a> <b><i>/* fallthrough */</i></b><a name=L260 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L260">260</a> case <a href="ident?v=0.97;i=TCSETS">TCSETS</a>:<a name=L261 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L261">261</a> return <a href="ident?v=0.97;i=set_termios">set_termios</a>(tty,(struct <a href="ident?v=0.97;i=termios">termios</a> *) arg, dev);<a name=L262 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L262">262</a> case <a href="ident?v=0.97;i=TCGETA">TCGETA</a>:<a name=L263 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L263">263</a> return <a href="ident?v=0.97;i=get_termio">get_termio</a>(tty,(struct <a href="ident?v=0.97;i=termio">termio</a> *) arg);<a name=L264 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L264">264</a> case <a href="ident?v=0.97;i=TCSETAF">TCSETAF</a>:<a name=L265 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L265">265</a> <a href="ident?v=0.97;i=flush_input">flush_input</a>(tty);<a name=L266 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L266">266</a> <b><i>/* fallthrough */</i></b><a name=L267 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L267">267</a> case <a href="ident?v=0.97;i=TCSETAW">TCSETAW</a>:<a name=L268 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L268">268</a> <a href="ident?v=0.97;i=wait_until_sent">wait_until_sent</a>(tty); <b><i>/* fallthrough */</i></b><a name=L269 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L269">269</a> case <a href="ident?v=0.97;i=TCSETA">TCSETA</a>:<a name=L270 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L270">270</a> return <a href="ident?v=0.97;i=set_termio">set_termio</a>(tty,(struct <a href="ident?v=0.97;i=termio">termio</a> *) arg, dev);<a name=L271 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L271">271</a> case <a href="ident?v=0.97;i=TCSBRK">TCSBRK</a>:<a name=L272 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L272">272</a> if (!<a href="ident?v=0.97;i=IS_A_SERIAL">IS_A_SERIAL</a>(dev))<a name=L273 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L273">273</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L274 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L274">274</a> <a href="ident?v=0.97;i=wait_until_sent">wait_until_sent</a>(tty);<a name=L275 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L275">275</a> if (!arg)<a name=L276 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L276">276</a> <a href="ident?v=0.97;i=send_break">send_break</a>(dev-64);<a name=L277 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L277">277</a> return 0;<a name=L278 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L278">278</a> case <a href="ident?v=0.97;i=TCXONC">TCXONC</a>:<a name=L279 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L279">279</a> switch (arg) {<a name=L280 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L280">280</a> case <a href="ident?v=0.97;i=TCOOFF">TCOOFF</a>:<a name=L281 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L281">281</a> tty->stopped = 1;<a name=L282 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L282">282</a> <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty);<a name=L283 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L283">283</a> return 0;<a name=L284 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L284">284</a> case <a href="ident?v=0.97;i=TCOON">TCOON</a>:<a name=L285 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L285">285</a> tty->stopped = 0;<a name=L286 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L286">286</a> <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty);<a name=L287 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L287">287</a> return 0;<a name=L288 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L288">288</a> case <a href="ident?v=0.97;i=TCIOFF">TCIOFF</a>:<a name=L289 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L289">289</a> if (<a href="ident?v=0.97;i=STOP_CHAR">STOP_CHAR</a>(tty))<a name=L290 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L290">290</a> <a href="ident?v=0.97;i=put_tty_queue">put_tty_queue</a>(<a href="ident?v=0.97;i=STOP_CHAR">STOP_CHAR</a>(tty),tty->write_q);<a name=L291 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L291">291</a> return 0;<a name=L292 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L292">292</a> case <a href="ident?v=0.97;i=TCION">TCION</a>:<a name=L293 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L293">293</a> if (<a href="ident?v=0.97;i=START_CHAR">START_CHAR</a>(tty))<a name=L294 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L294">294</a> <a href="ident?v=0.97;i=put_tty_queue">put_tty_queue</a>(<a href="ident?v=0.97;i=START_CHAR">START_CHAR</a>(tty),tty->write_q);<a name=L295 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L295">295</a> return 0;<a name=L296 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L296">296</a> }<a name=L297 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L297">297</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>; <b><i>/* not implemented */</i></b><a name=L298 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L298">298</a> case <a href="ident?v=0.97;i=TCFLSH">TCFLSH</a>:<a name=L299 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L299">299</a> if (arg==0)<a name=L300 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L300">300</a> <a href="ident?v=0.97;i=flush_input">flush_input</a>(tty);<a name=L301 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L301">301</a> else if (arg==1)<a name=L302 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L302">302</a> <a href="ident?v=0.97;i=flush_output">flush_output</a>(tty);<a name=L303 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L303">303</a> else if (arg==2) {<a name=L304 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L304">304</a> <a href="ident?v=0.97;i=flush_input">flush_input</a>(tty);<a name=L305 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L305">305</a> <a href="ident?v=0.97;i=flush_output">flush_output</a>(tty);<a name=L306 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L306">306</a> } else<a name=L307 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L307">307</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L308 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L308">308</a> return 0;<a name=L309 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L309">309</a> case <a href="ident?v=0.97;i=TIOCEXCL">TIOCEXCL</a>:<a name=L310 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L310">310</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>; <b><i>/* not implemented */</i></b><a name=L311 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L311">311</a> case <a href="ident?v=0.97;i=TIOCNXCL">TIOCNXCL</a>:<a name=L312 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L312">312</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>; <b><i>/* not implemented */</i></b><a name=L313 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L313">313</a> case <a href="ident?v=0.97;i=TIOCSCTTY">TIOCSCTTY</a>:<a name=L314 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L314">314</a> return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>; <b><i>/* set controlling term NI */</i></b><a name=L315 href="source/kernel/chr_drv/tty_ioctl.c?v=0.97#L315">315</a> case <a href="ident?v=0.97;i=TIOCGPGRP">TIOCGPGRP</a>:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -