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

📄 namei.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 5 页
字号:
<a name=L242 href="source/fs/namei.c#L242">242</a>                 inode = <a href="ident?i=current">current</a>-&gt;root;<a name=L243 href="source/fs/namei.c#L243">243</a>                 pathname++;<a name=L244 href="source/fs/namei.c#L244">244</a>         } else if (c)<a name=L245 href="source/fs/namei.c#L245">245</a>                 inode = <a href="ident?i=current">current</a>-&gt;pwd;<a name=L246 href="source/fs/namei.c#L246">246</a>         else<a name=L247 href="source/fs/namei.c#L247">247</a>                 return <a href="ident?i=NULL">NULL</a>;    <b><i>/* empty name is bad */</i></b><a name=L248 href="source/fs/namei.c#L248">248</a>         inode-&gt;i_count++;<a name=L249 href="source/fs/namei.c#L249">249</a>         while (1) {<a name=L250 href="source/fs/namei.c#L250">250</a>                 thisname = pathname;<a name=L251 href="source/fs/namei.c#L251">251</a>                 if (!<a href="ident?i=S_ISDIR">S_ISDIR</a>(inode-&gt;i_mode) || !<a href="ident?i=permission">permission</a>(inode,<a href="ident?i=MAY_EXEC">MAY_EXEC</a>)) {<a name=L252 href="source/fs/namei.c#L252">252</a>                         <a href="ident?i=iput">iput</a>(inode);<a name=L253 href="source/fs/namei.c#L253">253</a>                         return <a href="ident?i=NULL">NULL</a>;<a name=L254 href="source/fs/namei.c#L254">254</a>                 }<a name=L255 href="source/fs/namei.c#L255">255</a>                 for(namelen=0;(c=<a href="ident?i=get_fs_byte">get_fs_byte</a>(pathname++))&amp;&amp;(c!=<i>'/'</i>);namelen++)<a name=L256 href="source/fs/namei.c#L256">256</a>                         <b><i>/* nothing */</i></b> ;<a name=L257 href="source/fs/namei.c#L257">257</a>                 if (!c)<a name=L258 href="source/fs/namei.c#L258">258</a>                         return inode;<a name=L259 href="source/fs/namei.c#L259">259</a>                 if (!(bh = <a href="ident?i=find_entry">find_entry</a>(&amp;inode,thisname,namelen,&amp;de))) {<a name=L260 href="source/fs/namei.c#L260">260</a>                         <a href="ident?i=iput">iput</a>(inode);<a name=L261 href="source/fs/namei.c#L261">261</a>                         return <a href="ident?i=NULL">NULL</a>;<a name=L262 href="source/fs/namei.c#L262">262</a>                 }<a name=L263 href="source/fs/namei.c#L263">263</a>                 inr = de-&gt;inode;<a name=L264 href="source/fs/namei.c#L264">264</a>                 idev = inode-&gt;i_dev;<a name=L265 href="source/fs/namei.c#L265">265</a>                 <a href="ident?i=brelse">brelse</a>(bh);<a name=L266 href="source/fs/namei.c#L266">266</a>                 <a href="ident?i=iput">iput</a>(inode);<a name=L267 href="source/fs/namei.c#L267">267</a>                 if (!(inode = <a href="ident?i=iget">iget</a>(idev,inr)))<a name=L268 href="source/fs/namei.c#L268">268</a>                         return <a href="ident?i=NULL">NULL</a>;<a name=L269 href="source/fs/namei.c#L269">269</a>         }<a name=L270 href="source/fs/namei.c#L270">270</a> }<a name=L271 href="source/fs/namei.c#L271">271</a> <a name=L272 href="source/fs/namei.c#L272">272</a> <b><i>/*</i></b><a name=L273 href="source/fs/namei.c#L273">273</a> <b><i> *      dir_namei()</i></b><a name=L274 href="source/fs/namei.c#L274">274</a> <b><i> *</i></b><a name=L275 href="source/fs/namei.c#L275">275</a> <b><i> * dir_namei() returns the inode of the directory of the</i></b><a name=L276 href="source/fs/namei.c#L276">276</a> <b><i> * specified name, and the name within that directory.</i></b><a name=L277 href="source/fs/namei.c#L277">277</a> <b><i> */</i></b><a name=L278 href="source/fs/namei.c#L278">278</a> static struct <a href="ident?i=m_inode">m_inode</a> * <a href="ident?i=dir_namei">dir_namei</a>(const char * pathname,<a name=L279 href="source/fs/namei.c#L279">279</a>         int * namelen, const char ** name)<a name=L280 href="source/fs/namei.c#L280">280</a> {<a name=L281 href="source/fs/namei.c#L281">281</a>         char c;<a name=L282 href="source/fs/namei.c#L282">282</a>         const char * basename;<a name=L283 href="source/fs/namei.c#L283">283</a>         struct <a href="ident?i=m_inode">m_inode</a> * dir;<a name=L284 href="source/fs/namei.c#L284">284</a> <a name=L285 href="source/fs/namei.c#L285">285</a>         if (!(dir = <a href="ident?i=get_dir">get_dir</a>(pathname)))<a name=L286 href="source/fs/namei.c#L286">286</a>                 return <a href="ident?i=NULL">NULL</a>;<a name=L287 href="source/fs/namei.c#L287">287</a>         basename = pathname;<a name=L288 href="source/fs/namei.c#L288">288</a>         while (c=<a href="ident?i=get_fs_byte">get_fs_byte</a>(pathname++))<a name=L289 href="source/fs/namei.c#L289">289</a>                 if (c==<i>'/'</i>)<a name=L290 href="source/fs/namei.c#L290">290</a>                         basename=pathname;<a name=L291 href="source/fs/namei.c#L291">291</a>         *namelen = pathname-basename-1;<a name=L292 href="source/fs/namei.c#L292">292</a>         *name = basename;<a name=L293 href="source/fs/namei.c#L293">293</a>         return dir;<a name=L294 href="source/fs/namei.c#L294">294</a> }<a name=L295 href="source/fs/namei.c#L295">295</a> <a name=L296 href="source/fs/namei.c#L296">296</a> <b><i>/*</i></b><a name=L297 href="source/fs/namei.c#L297">297</a> <b><i> *      namei()</i></b><a name=L298 href="source/fs/namei.c#L298">298</a> <b><i> *</i></b><a name=L299 href="source/fs/namei.c#L299">299</a> <b><i> * is used by most simple commands to get the inode of a specified name.</i></b><a name=L300 href="source/fs/namei.c#L300">300</a> <b><i> * Open, link etc use their own routines, but this is enough for things</i></b><a name=L301 href="source/fs/namei.c#L301">301</a> <b><i> * like 'chmod' etc.</i></b><a name=L302 href="source/fs/namei.c#L302">302</a> <b><i> */</i></b><a name=L303 href="source/fs/namei.c#L303">303</a> struct <a href="ident?i=m_inode">m_inode</a> * <a href="ident?i=namei">namei</a>(const char * pathname)<a name=L304 href="source/fs/namei.c#L304">304</a> {<a name=L305 href="source/fs/namei.c#L305">305</a>         const char * basename;<a name=L306 href="source/fs/namei.c#L306">306</a>         int inr,dev,namelen;<a name=L307 href="source/fs/namei.c#L307">307</a>         struct <a href="ident?i=m_inode">m_inode</a> * dir;<a name=L308 href="source/fs/namei.c#L308">308</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L309 href="source/fs/namei.c#L309">309</a>         struct <a href="ident?i=dir_entry">dir_entry</a> * de;<a name=L310 href="source/fs/namei.c#L310">310</a> <a name=L311 href="source/fs/namei.c#L311">311</a>         if (!(dir = <a href="ident?i=dir_namei">dir_namei</a>(pathname,&amp;namelen,&amp;basename)))<a name=L312 href="source/fs/namei.c#L312">312</a>                 return <a href="ident?i=NULL">NULL</a>;<a name=L313 href="source/fs/namei.c#L313">313</a>         if (!namelen)                   <b><i>/* special case: '/usr/' etc */</i></b><a name=L314 href="source/fs/namei.c#L314">314</a>                 return dir;<a name=L315 href="source/fs/namei.c#L315">315</a>         bh = <a href="ident?i=find_entry">find_entry</a>(&amp;dir,basename,namelen,&amp;de);<a name=L316 href="source/fs/namei.c#L316">316</a>         if (!bh) {<a name=L317 href="source/fs/namei.c#L317">317</a>                 <a href="ident?i=iput">iput</a>(dir);<a name=L318 href="source/fs/namei.c#L318">318</a>                 return <a href="ident?i=NULL">NULL</a>;<a name=L319 href="source/fs/namei.c#L319">319</a>         }<a name=L320 href="source/fs/namei.c#L320">320</a>         inr = de-&gt;inode;<a name=L321 href="source/fs/namei.c#L321">321</a>         dev = dir-&gt;i_dev;<a name=L322 href="source/fs/namei.c#L322">322</a>         <a href="ident?i=brelse">brelse</a>(bh);<a name=L323 href="source/fs/namei.c#L323">323</a>         <a href="ident?i=iput">iput</a>(dir);<a name=L324 href="source/fs/namei.c#L324">324</a>         dir=<a href="ident?i=iget">iget</a>(dev,inr);<a name=L325 href="source/fs/namei.c#L325">325</a>         if (dir) {<a name=L326 href="source/fs/namei.c#L326">326</a>                 dir-&gt;i_atime=<a href="ident?i=CURRENT_TIME">CURRENT_TIME</a>;<a name=L327 href="source/fs/namei.c#L327">327</a>                 dir-&gt;i_dirt=1;<a name=L328 href="source/fs/namei.c#L328">328</a>         }<a name=L329 href="source/fs/namei.c#L329">329</a>         return dir;<a name=L330 href="source/fs/namei.c#L330">330</a> }<a name=L331 href="source/fs/namei.c#L331">331</a> <a name=L332 href="source/fs/namei.c#L332">332</a> <b><i>/*</i></b><a name=L333 href="source/fs/namei.c#L333">333</a> <b><i> *      open_namei()</i></b><a name=L334 href="source/fs/namei.c#L334">334</a> <b><i> *</i></b><a name=L335 href="source/fs/namei.c#L335">335</a> <b><i> * namei for open - this is in fact almost the whole open-routine.</i></b><a name=L336 href="source/fs/namei.c#L336">336</a> <b><i> */</i></b><a name=L337 href="source/fs/namei.c#L337">337</a> int <a href="ident?i=open_namei">open_namei</a>(const char * pathname, int flag, int mode,<a name=L338 href="source/fs/namei.c#L338">338</a>         struct <a href="ident?i=m_inode">m_inode</a> ** res_inode)<a name=L339 href="source/fs/namei.c#L339">339</a> {<a name=L340 href="source/fs/namei.c#L340">340</a>         const char * basename;<a name=L341 href="source/fs/namei.c#L341">341</a>         int inr,dev,namelen;<a name=L342 href="source/fs/namei.c#L342">342</a>         struct <a href="ident?i=m_inode">m_inode</a> * dir, *inode;<a name=L343 href="source/fs/namei.c#L343">343</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L344 href="source/fs/namei.c#L344">344</a>         struct <a href="ident?i=dir_entry">dir_entry</a> * de;<a name=L345 href="source/fs/namei.c#L345">345</a> <a name=L346 href="source/fs/namei.c#L346">346</a>         if ((flag &amp; <a href="ident?i=O_TRUNC">O_TRUNC</a>) &amp;&amp; !(flag &amp; <a href="ident?i=O_ACCMODE">O_ACCMODE</a>))<a name=L347 href="source/fs/namei.c#L347">347</a>                 flag |= <a href="ident?i=O_WRONLY">O_WRONLY</a>;<a name=L348 href="source/fs/namei.c#L348">348</a>         mode &amp;= 0777 &amp; ~current-&gt;<a href="ident?i=umask">umask</a>;<a name=L349 href="source/fs/namei.c#L349">349</a>         mode |= <a href="ident?i=I_REGULAR">I_REGULAR</a>;<a name=L350 href="source/fs/namei.c#L350">350</a>         if (!(dir = <a href="ident?i=dir_namei">dir_namei</a>(pathname,&amp;namelen,&amp;basename)))<a name=L351 href="source/fs/namei.c#L351">351</a>                 return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L352 href="source/fs/namei.c#L352">352</a>         if (!namelen) {                 <b><i>/* special case: '/usr/' etc */</i></b><a name=L353 href="source/fs/namei.c#L353">353</a>                 if (!(flag &amp; (<a href="ident?i=O_ACCMODE">O_ACCMODE</a>|<a href="ident?i=O_CREAT">O_CREAT</a>|<a href="ident?i=O_TRUNC">O_TRUNC</a>))) {<a name=L354 href="source/fs/namei.c#L354">354</a>                         *res_inode=dir;<a name=L355 href="source/fs/namei.c#L355">355</a>                         return 0;<a name=L356 href="source/fs/namei.c#L356">356</a>                 }<a name=L357 href="source/fs/namei.c#L357">357</a>                 <a href="ident?i=iput">iput</a>(dir);<a name=L358 href="source/fs/namei.c#L358">358</a>                 return -<a href="ident?i=EISDIR">EISDIR</a>;<a name=L359 href="source/fs/namei.c#L359">359</a>         }<a name=L360 href="source/fs/namei.c#L360">360</a>         bh = <a href="ident?i=find_entry">find_entry</a>(&amp;dir,basename,namelen,&amp;de);<a name=L361 href="source/fs/namei.c#L361">361</a>         if (!bh) {<a name=L362 href="source/fs/namei.c#L362">362</a>                 if (!(flag &amp; <a href="ident?i=O_CREAT">O_CREAT</a>)) {<a name=L363 href="source/fs/namei.c#L363">363</a>                         <a href="ident?i=iput">iput</a>(dir);<a name=L364 href="source/fs/namei.c#L364">364</a>                         return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L365 href="source/fs/namei.c#L365">365</a>                 }<a name=L366 href="source/fs/namei.c#L366">366</a>                 if (!<a href="ident?i=permission">permission</a>(dir,<a href="ident?i=MAY_WRITE">MAY_WRITE</a>)) {<a name=L367 href="source/fs/namei.c#L367">367</a>                         <a href="ident?i=iput">iput</a>(dir);<a name=L368 href="source/fs/namei.c#L368">368</a>                         return -<a href="ident?i=EACCES">EACCES</a>;<a name=L369 href="source/fs/namei.c#L369">369</a>                 }<a name=L370 href="source/fs/namei.c#L370">370</a>                 inode = <a href="ident?i=new_inode">new_inode</a>(dir-&gt;i_dev);<a name=L371 href="source/fs/namei.c#L371">371</a>                 if (!inode) {<a name=L372 href="source/fs/namei.c#L372">372</a>                         <a href="ident?i=iput">iput</a>(dir);<a name=L373 href="source/fs/namei.c#L373">373</a>                         return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L374 href="source/fs/namei.c#L374">374</a>                 }<a name=L375 href="source/fs/namei.c#L375">375</a>                 inode-&gt;i_uid = <a href="ident?i=current">current</a>-&gt;euid;<a name=L376 href="source/fs/namei.c#L376">376</a>                 inode-&gt;i_mode = mode;<a name=L377 href="source/fs/namei.c#L377">377</a>                 inode-&gt;i_dirt = 1;

⌨️ 快捷键说明

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