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

📄 exec.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L234 href="source/fs/exec.c#L234">234</a> <a name=L235 href="source/fs/exec.c#L235">235</a>                 <a href="ident?i=strncpy">strncpy</a>(<a href="ident?i=buf">buf</a>, bh-&gt;b_data+2, 1022);<a name=L236 href="source/fs/exec.c#L236">236</a>                 <a href="ident?i=brelse">brelse</a>(bh);<a name=L237 href="source/fs/exec.c#L237">237</a>                 <a href="ident?i=iput">iput</a>(inode);<a name=L238 href="source/fs/exec.c#L238">238</a>                 <a href="ident?i=buf">buf</a>[1022] = <i>'\0'</i>;<a name=L239 href="source/fs/exec.c#L239">239</a>                 if (cp = <a href="ident?i=strchr">strchr</a>(<a href="ident?i=buf">buf</a>, <i>'\n'</i>)) {<a name=L240 href="source/fs/exec.c#L240">240</a>                         *cp = <i>'\0'</i>;<a name=L241 href="source/fs/exec.c#L241">241</a>                         for (cp = <a href="ident?i=buf">buf</a>; (*cp == <i>' '</i>) || (*cp == <i>'\t'</i>); cp++);<a name=L242 href="source/fs/exec.c#L242">242</a>                 }<a name=L243 href="source/fs/exec.c#L243">243</a>                 if (!cp || *cp == <i>'\0'</i>) {<a name=L244 href="source/fs/exec.c#L244">244</a>                         retval = -<a href="ident?i=ENOEXEC">ENOEXEC</a>; <b><i>/* No interpreter name found */</i></b><a name=L245 href="source/fs/exec.c#L245">245</a>                         goto exec_error1;<a name=L246 href="source/fs/exec.c#L246">246</a>                 }<a name=L247 href="source/fs/exec.c#L247">247</a>                 interp = i_name = cp;<a name=L248 href="source/fs/exec.c#L248">248</a>                 i_arg = 0;<a name=L249 href="source/fs/exec.c#L249">249</a>                 for ( ; *cp &amp;&amp; (*cp != <i>' '</i>) &amp;&amp; (*cp != <i>'\t'</i>); cp++) {<a name=L250 href="source/fs/exec.c#L250">250</a>                         if (*cp == <i>'/'</i>)<a name=L251 href="source/fs/exec.c#L251">251</a>                                 i_name = cp+1;<a name=L252 href="source/fs/exec.c#L252">252</a>                 }<a name=L253 href="source/fs/exec.c#L253">253</a>                 if (*cp) {<a name=L254 href="source/fs/exec.c#L254">254</a>                         *cp++ = <i>'\0'</i>;<a name=L255 href="source/fs/exec.c#L255">255</a>                         i_arg = cp;<a name=L256 href="source/fs/exec.c#L256">256</a>                 }<a name=L257 href="source/fs/exec.c#L257">257</a>                 <b><i>/*</i></b><a name=L258 href="source/fs/exec.c#L258">258</a> <b><i>                 * OK, we've parsed out the interpreter name and</i></b><a name=L259 href="source/fs/exec.c#L259">259</a> <b><i>                 * (optional) argument.</i></b><a name=L260 href="source/fs/exec.c#L260">260</a> <b><i>                 */</i></b><a name=L261 href="source/fs/exec.c#L261">261</a>                 if (sh_bang++ == 0) {<a name=L262 href="source/fs/exec.c#L262">262</a>                         p = <a href="ident?i=copy_strings">copy_strings</a>(envc, <a href="ident?i=envp">envp</a>, page, p, 0);<a name=L263 href="source/fs/exec.c#L263">263</a>                         p = <a href="ident?i=copy_strings">copy_strings</a>(--argc, <a href="ident?i=argv">argv</a>+1, page, p, 0);<a name=L264 href="source/fs/exec.c#L264">264</a>                 }<a name=L265 href="source/fs/exec.c#L265">265</a>                 <b><i>/*</i></b><a name=L266 href="source/fs/exec.c#L266">266</a> <b><i>                 * Splice in (1) the interpreter's name for argv[0]</i></b><a name=L267 href="source/fs/exec.c#L267">267</a> <b><i>                 *           (2) (optional) argument to interpreter</i></b><a name=L268 href="source/fs/exec.c#L268">268</a> <b><i>                 *           (3) filename of shell script</i></b><a name=L269 href="source/fs/exec.c#L269">269</a> <b><i>                 *</i></b><a name=L270 href="source/fs/exec.c#L270">270</a> <b><i>                 * This is done in reverse order, because of how the</i></b><a name=L271 href="source/fs/exec.c#L271">271</a> <b><i>                 * user environment and arguments are stored.</i></b><a name=L272 href="source/fs/exec.c#L272">272</a> <b><i>                 */</i></b><a name=L273 href="source/fs/exec.c#L273">273</a>                 p = <a href="ident?i=copy_strings">copy_strings</a>(1, &amp;filename, page, p, 1);<a name=L274 href="source/fs/exec.c#L274">274</a>                 argc++;<a name=L275 href="source/fs/exec.c#L275">275</a>                 if (i_arg) {<a name=L276 href="source/fs/exec.c#L276">276</a>                         p = <a href="ident?i=copy_strings">copy_strings</a>(1, &amp;i_arg, page, p, 2);<a name=L277 href="source/fs/exec.c#L277">277</a>                         argc++;<a name=L278 href="source/fs/exec.c#L278">278</a>                 }<a name=L279 href="source/fs/exec.c#L279">279</a>                 p = <a href="ident?i=copy_strings">copy_strings</a>(1, &amp;i_name, page, p, 2);<a name=L280 href="source/fs/exec.c#L280">280</a>                 argc++;<a name=L281 href="source/fs/exec.c#L281">281</a>                 if (!p) {<a name=L282 href="source/fs/exec.c#L282">282</a>                         retval = -<a href="ident?i=ENOMEM">ENOMEM</a>;<a name=L283 href="source/fs/exec.c#L283">283</a>                         goto exec_error1;<a name=L284 href="source/fs/exec.c#L284">284</a>                 }<a name=L285 href="source/fs/exec.c#L285">285</a>                 <b><i>/*</i></b><a name=L286 href="source/fs/exec.c#L286">286</a> <b><i>                 * OK, now restart the process with the interpreter's inode.</i></b><a name=L287 href="source/fs/exec.c#L287">287</a> <b><i>                 */</i></b><a name=L288 href="source/fs/exec.c#L288">288</a>                 old_fs = <a href="ident?i=get_fs">get_fs</a>();<a name=L289 href="source/fs/exec.c#L289">289</a>                 <a href="ident?i=set_fs">set_fs</a>(<a href="ident?i=get_ds">get_ds</a>());<a name=L290 href="source/fs/exec.c#L290">290</a>                 if (!(inode=<a href="ident?i=namei">namei</a>(interp))) { <b><i>/* get executables inode */</i></b><a name=L291 href="source/fs/exec.c#L291">291</a>                         <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L292 href="source/fs/exec.c#L292">292</a>                         retval = -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L293 href="source/fs/exec.c#L293">293</a>                         goto exec_error1;<a name=L294 href="source/fs/exec.c#L294">294</a>                 }<a name=L295 href="source/fs/exec.c#L295">295</a>                 <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L296 href="source/fs/exec.c#L296">296</a>                 goto restart_interp;<a name=L297 href="source/fs/exec.c#L297">297</a>         }<a name=L298 href="source/fs/exec.c#L298">298</a>         <a href="ident?i=brelse">brelse</a>(bh);<a name=L299 href="source/fs/exec.c#L299">299</a>         if (<a href="ident?i=N_MAGIC">N_MAGIC</a>(ex) != <a href="ident?i=ZMAGIC">ZMAGIC</a> || ex.a_trsize || ex.a_drsize ||<a name=L300 href="source/fs/exec.c#L300">300</a>                 ex.a_text+ex.a_data+ex.a_bss&gt;0x3000000 ||<a name=L301 href="source/fs/exec.c#L301">301</a>                 inode-&gt;i_size &lt; ex.a_text+ex.a_data+ex.a_syms+<a href="ident?i=N_TXTOFF">N_TXTOFF</a>(ex)) {<a name=L302 href="source/fs/exec.c#L302">302</a>                 retval = -<a href="ident?i=ENOEXEC">ENOEXEC</a>;<a name=L303 href="source/fs/exec.c#L303">303</a>                 goto exec_error2;<a name=L304 href="source/fs/exec.c#L304">304</a>         }<a name=L305 href="source/fs/exec.c#L305">305</a>         if (<a href="ident?i=N_TXTOFF">N_TXTOFF</a>(ex) != <a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>) {<a name=L306 href="source/fs/exec.c#L306">306</a>                 <a href="ident?i=printk">printk</a>(<i>"%s: N_TXTOFF != BLOCK_SIZE. See a.out.h."</i>, filename);<a name=L307 href="source/fs/exec.c#L307">307</a>                 retval = -<a href="ident?i=ENOEXEC">ENOEXEC</a>;<a name=L308 href="source/fs/exec.c#L308">308</a>                 goto exec_error2;<a name=L309 href="source/fs/exec.c#L309">309</a>         }<a name=L310 href="source/fs/exec.c#L310">310</a>         if (!sh_bang) {<a name=L311 href="source/fs/exec.c#L311">311</a>                 p = <a href="ident?i=copy_strings">copy_strings</a>(envc,<a href="ident?i=envp">envp</a>,page,p,0);<a name=L312 href="source/fs/exec.c#L312">312</a>                 p = <a href="ident?i=copy_strings">copy_strings</a>(argc,<a href="ident?i=argv">argv</a>,page,p,0);<a name=L313 href="source/fs/exec.c#L313">313</a>                 if (!p) {<a name=L314 href="source/fs/exec.c#L314">314</a>                         retval = -<a href="ident?i=ENOMEM">ENOMEM</a>;<a name=L315 href="source/fs/exec.c#L315">315</a>                         goto exec_error2;<a name=L316 href="source/fs/exec.c#L316">316</a>                 }<a name=L317 href="source/fs/exec.c#L317">317</a>         }<a name=L318 href="source/fs/exec.c#L318">318</a> <b><i>/* OK, This is the point of no return */</i></b><a name=L319 href="source/fs/exec.c#L319">319</a>         if (<a href="ident?i=current">current</a>-&gt;executable)<a name=L320 href="source/fs/exec.c#L320">320</a>                 <a href="ident?i=iput">iput</a>(<a href="ident?i=current">current</a>-&gt;executable);<a name=L321 href="source/fs/exec.c#L321">321</a>         <a href="ident?i=current">current</a>-&gt;executable = inode;<a name=L322 href="source/fs/exec.c#L322">322</a>         for (i=0 ; i&lt;32 ; i++)<a name=L323 href="source/fs/exec.c#L323">323</a>                 <a href="ident?i=current">current</a>-&gt;<a href="ident?i=sigaction">sigaction</a>[i].sa_handler = <a href="ident?i=NULL">NULL</a>;<a name=L324 href="source/fs/exec.c#L324">324</a>         for (i=0 ; i&lt;<a href="ident?i=NR_OPEN">NR_OPEN</a> ; i++)<a name=L325 href="source/fs/exec.c#L325">325</a>                 if ((<a href="ident?i=current">current</a>-&gt;close_on_exec&gt;&gt;i)&amp;1)<a name=L326 href="source/fs/exec.c#L326">326</a>                         <a href="ident?i=sys_close">sys_close</a>(i);<a name=L327 href="source/fs/exec.c#L327">327</a>         <a href="ident?i=current">current</a>-&gt;close_on_exec = 0;<a name=L328 href="source/fs/exec.c#L328">328</a>         <a href="ident?i=free_page_tables">free_page_tables</a>(<a href="ident?i=get_base">get_base</a>(<a href="ident?i=current">current</a>-&gt;ldt[1]),<a href="ident?i=get_limit">get_limit</a>(0x0f));<a name=L329 href="source/fs/exec.c#L329">329</a>         <a href="ident?i=free_page_tables">free_page_tables</a>(<a href="ident?i=get_base">get_base</a>(<a href="ident?i=current">current</a>-&gt;ldt[2]),<a href="ident?i=get_limit">get_limit</a>(0x17));<a name=L330 href="source/fs/exec.c#L330">330</a>         if (<a href="ident?i=last_task_used_math">last_task_used_math</a> == <a href="ident?i=current">current</a>)<a name=L331 href="source/fs/exec.c#L331">331</a>                 <a href="ident?i=last_task_used_math">last_task_used_math</a> = <a href="ident?i=NULL">NULL</a>;<a name=L332 href="source/fs/exec.c#L332">332</a>         <a href="ident?i=current">current</a>-&gt;used_math = 0;<a name=L333 href="source/fs/exec.c#L333">333</a>         p += <a href="ident?i=change_ldt">change_ldt</a>(ex.a_text,page)-<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a>*<a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>;<a name=L334 href="source/fs/exec.c#L334">334</a>         p = (unsigned long) <a href="ident?i=create_tables">create_tables</a>((char *)p,argc,envc);<a name=L335 href="source/fs/exec.c#L335">335</a>         <a href="ident?i=current">current</a>-&gt;<a href="ident?i=brk">brk</a> = ex.a_bss +<a name=L336 href="source/fs/exec.c#L336">336</a>                 (<a href="ident?i=current">current</a>-&gt;end_data = ex.a_data +<a name=L337 href="source/fs/exec.c#L337">337</a>                 (<a href="ident?i=current">current</a>-&gt;end_code = ex.a_text));<a name=L338 href="source/fs/exec.c#L338">338</a>         <a href="ident?i=current">current</a>-&gt;start_stack = p &amp; 0xfffff000;<a name=L339 href="source/fs/exec.c#L339">339</a>         <a href="ident?i=current">current</a>-&gt;euid = e_uid;<a name=L340 href="source/fs/exec.c#L340">340</a>         <a href="ident?i=current">current</a>-&gt;egid = e_gid;<a name=L341 href="source/fs/exec.c#L341">341</a>         i = ex.a_text+ex.a_data;<a name=L342 href="source/fs/exec.c#L342">342</a>         while (i&amp;0xfff)<a name=L343 href="source/fs/exec.c#L343">343</a>                 <a href="ident?i=put_fs_byte">put_fs_byte</a>(0,(char *) (i++));<a name=L344 href="source/fs/exec.c#L344">344</a>         eip[0] = ex.a_entry;            <b><i>/* eip, magic happens :-) */</i></b><a name=L345 href="source/fs/exec.c#L345">345</a>         eip[3] = p;                     <b><i>/* stack pointer */</i></b><a name=L346 href="source/fs/exec.c#L346">346</a>         return 0;<a name=L347 href="source/fs/exec.c#L347">347</a> exec_error2:<a name=L348 href="source/fs/exec.c#L348">348</a>         <a href="ident?i=iput">iput</a>(inode);<a name=L349 href="source/fs/exec.c#L349">349</a> exec_error1:<a name=L350 href="source/fs/exec.c#L350">350</a>         for (i=0 ; i&lt;<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a> ; i++)<a name=L351 href="source/fs/exec.c#L351">351</a>                 <a href="ident?i=free_page">free_page</a>(page[i]);<a name=L352 href="source/fs/exec.c#L352">352</a>         return(retval);<a name=L353 href="source/fs/exec.c#L353">353</a> }<a name=L354 href="source/fs/exec.c#L354">354</a> </pre><hr><div align=center>   [<b><i>源代码浏览</i></b>] [<a href="diff/fs/exec.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 + -