14.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 693 行 · 第 1/5 页

HTML
693
字号
<a name='L388'>      thisname = pathname;
<a name='L389'>      <b>if</b> (!<a href='../S/43.html#L35' title='Defined at 35 in include/sys/stat.h.'>S_ISDIR</a> (inode-&gt;i_mode) || !<a href='../S/14.html#L58' title='Defined at 58 in fs/namei.c.'>permission</a> (inode, <a href='../S/14.html#L38' title='Defined at 38 in fs/namei.c.'>MAY_EXEC</a>))
<a name='L390'>        <font color='red'>{</font>
<a name='L391'>          <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L392'>          <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L393'>        <font color='red'>}</font>
<a name='L394'><i><font color='green'>// 从路径名开始起搜索检测字符,直到字符已是结尾符(NULL)或者是'/',此时namelen 正好是当前处理</font></i>
<a name='L395'><i><font color='green'>// 目录名的长度。如果最后也是一个目录名,但其后没有加'/',则不会返回该最后目录的i 节点!</font></i>
<a name='L396'><i><font color='green'>// 比如:/var/log/httpd,将只返回log/目录的i 节点。</font></i>
<a name='L397'>      <b>for</b> (namelen = 0; (c = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (pathname++)) &amp;&amp; (c != '/');
<a name='L398'>           namelen++)
<a name='L399'><i><font color='green'>/* nothing */</font></i> ;
<a name='L400'><i><font color='green'>// 若字符是结尾符NULL,则表明已经到达指定目录,则返回该i 节点指针,退出。</font></i>
<a name='L401'>      <b>if</b> (!c)
<a name='L402'>        <b>return</b> inode;
<a name='L403'><i><font color='green'>// 调用查找指定目录和文件名的目录项函数,在当前处理目录中寻找子目录项。如果没有找到,则释放</font></i>
<a name='L404'><i><font color='green'>// 该i 节点,并返回NULL,退出。</font></i>
<a name='L405'>      <b>if</b> (!(bh = <a href='../S/14.html#L141' title='Defined at 141 in fs/namei.c.'>find_entry</a> (&amp;inode, thisname, namelen, &amp;de)))
<a name='L406'>        <font color='red'>{</font>
<a name='L407'>          <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L408'>          <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L409'>        <font color='red'>}</font>
<a name='L410'><i><font color='green'>// 取该子目录项的i 节点号inr 和设备号idev,释放包含该目录项的高速缓冲块和该i 节点。</font></i>
<a name='L411'>      inr = de-&gt;inode;
<a name='L412'>      idev = inode-&gt;i_dev;
<a name='L413'>      <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L414'>      <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L415'><i><font color='green'>// 取节点号inr 的i 节点信息,若失败,则返回NULL,退出。否则继续以该子目录的i 节点进行操作。</font></i>
<a name='L416'>      <b>if</b> (!(inode = <a href='../S/12.html#L355' title='Defined at 355 in fs/inode.c.'>iget</a> (idev, inr)))
<a name='L417'>        <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L418'>    <font color='red'>}</font>
<a name='L419'><font color='red'>}</font>
<a name='L420'>
<a name='L421'><i><font color='green'>/*</font></i>
<a name='L422'><i><font color='green'>* dir_namei()</font></i>
<a name='L423'><i><font color='green'>*</font></i>
<a name='L424'><i><font color='green'>* dir_namei() returns the inode of the directory of the</font></i>
<a name='L425'><i><font color='green'>* specified name, and the name within that directory.</font></i>
<a name='L426'><i><font color='green'>*/</font></i>
<a name='L427'><i><font color='green'>/*</font></i>
<a name='L428'><i><font color='green'>* dir_namei()</font></i>
<a name='L429'><i><font color='green'>* dir_namei()函数返回指定目录名的i 节点指针,以及在最顶层目录的名称。</font></i>
<a name='L430'><i><font color='green'>*/</font></i>
<a name='L431'><i><font color='green'>// 参数:pathname - 目录路径名;namelen - 路径名长度。</font></i>
<a name='L432'><i><font color='green'>// 返回:指定目录名最顶层目录的i 节点指针和最顶层目录名及其长度。</font></i>
<a name='L433'><b>static</b> <b>struct</b> m_inode *
<a name='L434'><a href='../R/434.html' title='Multiple refered from 7 places.'>dir_namei</a> (<b>const</b> <b>char</b> *pathname, <b>int</b> *namelen, <b>const</b> <b>char</b> **name)
<a name='L435'><font color='red'>{</font>
<a name='L436'>  <b>char</b> c;
<a name='L437'>  <b>const</b> <b>char</b> *basename;
<a name='L438'>  <b>struct</b> m_inode *dir;
<a name='L439'>
<a name='L440'><i><font color='green'>// 取指定路径名最顶层目录的i 节点,若出错则返回NULL,退出。</font></i>
<a name='L441'>  <b>if</b> (!(dir = <a href='../S/14.html#L355' title='Defined at 355 in fs/namei.c.'>get_dir</a> (pathname)))
<a name='L442'>    <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L443'><i><font color='green'>// 对路径名pathname 进行搜索检测,查处最后一个'/'后面的名字字符串,计算其长度,并返回最顶</font></i>
<a name='L444'><i><font color='green'>// 层目录的i 节点指针。</font></i>
<a name='L445'>  basename = pathname;
<a name='L446'>  <b>while</b> (c = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (pathname++))
<a name='L447'>    <b>if</b> (c == '/')
<a name='L448'>      basename = pathname;
<a name='L449'>  *namelen = pathname - basename - 1;
<a name='L450'>  *name = basename;
<a name='L451'>  <b>return</b> dir;
<a name='L452'><font color='red'>}</font>
<a name='L453'>
<a name='L454'><i><font color='green'>/*</font></i>
<a name='L455'><i><font color='green'>* namei()</font></i>
<a name='L456'><i><font color='green'>*</font></i>
<a name='L457'><i><font color='green'>* is used by most simple commands to get the inode of a specified name.</font></i>
<a name='L458'><i><font color='green'>* Open, link etc use their own routines, but this is enough for things</font></i>
<a name='L459'><i><font color='green'>* like 'chmod' etc.</font></i>
<a name='L460'><i><font color='green'>*/</font></i>
<a name='L461'><i><font color='green'>/*</font></i>
<a name='L462'><i><font color='green'>* namei()</font></i>
<a name='L463'><i><font color='green'>* 该函数被许多简单的命令用于取得指定路径名称的i 节点。open、link 等则使用它们</font></i>
<a name='L464'><i><font color='green'>* 自己的相应函数,但对于象修改模式'chmod'等这样的命令,该函数已足够用了。</font></i>
<a name='L465'><i><font color='green'>*/</font></i>
<a name='L466'><i><font color='green'>//// 取指定路径名的i 节点。</font></i>
<a name='L467'><i><font color='green'>// 参数:pathname - 路径名。</font></i>
<a name='L468'><i><font color='green'>// 返回:对应的i 节点。</font></i>
<a name='L469'><b>struct</b> m_inode *
<a name='L470'><a href='../R/534.html' title='Multiple refered from 14 places.'>namei</a> (<b>const</b> <b>char</b> *pathname)
<a name='L471'><font color='red'>{</font>
<a name='L472'>  <b>const</b> <b>char</b> *basename;
<a name='L473'>  <b>int</b> inr, <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, namelen;
<a name='L474'>  <b>struct</b> m_inode *dir;
<a name='L475'>  <b>struct</b> buffer_head *bh;
<a name='L476'>  <b>struct</b> dir_entry *de;
<a name='L477'>
<a name='L478'><i><font color='green'>// 首先查找指定路径的最顶层目录的目录名及其i 节点,若不存在,则返回NULL,退出。</font></i>
<a name='L479'>  <b>if</b> (!(dir = <a href='../S/14.html#L434' title='Defined at 434 in fs/namei.c.'>dir_namei</a> (pathname, &amp;namelen, &amp;basename)))
<a name='L480'>    <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L481'><i><font color='green'>// 如果返回的最顶层名字的长度是0,则表示该路径名以一个目录名为最后一项。</font></i>
<a name='L482'>  <b>if</b> (!namelen)                 <i><font color='green'>/* special case: '/usr/' etc */</font></i>
<a name='L483'>    <b>return</b> dir;                 <i><font color='green'>/* 对应于'/usr/'等情况 */</font></i>
<a name='L484'><i><font color='green'>// 在返回的顶层目录中寻找指定文件名的目录项的i 节点。因为如果最后也是一个目录名,但其后没</font></i>
<a name='L485'><i><font color='green'>// 有加'/',则不会返回该最后目录的i 节点!比如:/var/log/httpd,将只返回log/目录的i 节点。</font></i>
<a name='L486'><i><font color='green'>// 因此dir_namei()将不以'/'结束的最后一个名字当作一个文件名来看待。因此这里需要单独对这种</font></i>
<a name='L487'><i><font color='green'>// 情况使用寻找目录项i 节点函数find_entry()进行处理。</font></i>
<a name='L488'>  bh = <a href='../S/14.html#L141' title='Defined at 141 in fs/namei.c.'>find_entry</a> (&amp;dir, basename, namelen, &amp;de);
<a name='L489'>  <b>if</b> (!bh)
<a name='L490'>    <font color='red'>{</font>
<a name='L491'>      <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (dir);
<a name='L492'>      <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L493'>    <font color='red'>}</font>
<a name='L494'><i><font color='green'>// 取该目录项的i 节点号和目录的设备号,并释放包含该目录项的高速缓冲区以及目录i 节点。</font></i>
<a name='L495'>  inr = de-&gt;inode;
<a name='L496'>  <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> = dir-&gt;i_dev;
<a name='L497'>  <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L498'>  <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (dir);
<a name='L499'><i><font color='green'>// 取对应节号的i 节点,修改其被访问时间为当前时间,并置已修改标志。最后返回该i 节点指针。</font></i>
<a name='L500'>  dir = <a href='../S/12.html#L355' title='Defined at 355 in fs/inode.c.'>iget</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, inr);
<a name='L501'>  <b>if</b> (dir)
<a name='L502'>    <font color='red'>{</font>
<a name='L503'>      dir-&gt;i_atime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L504'>      dir-&gt;i_dirt = 1;
<a name='L505'>    <font color='red'>}</font>
<a name='L506'>  <b>return</b> dir;
<a name='L507'><font color='red'>}</font>
<a name='L508'>
<a name='L509'><i><font color='green'>/*</font></i>
<a name='L510'><i><font color='green'>* open_namei()</font></i>
<a name='L511'><i><font color='green'>*</font></i>
<a name='L512'><i><font color='green'>* namei for open - this is in fact almost the whole open-routine.</font></i>
<a name='L513'><i><font color='green'>*/</font></i>
<a name='L514'><i><font color='green'>/*</font></i>
<a name='L515'><i><font color='green'>* open_namei()</font></i>
<a name='L516'><i><font color='green'>* open()所使用的namei 函数 - 这其实几乎是完整的打开文件程序。</font></i>
<a name='L517'><i><font color='green'>*/</font></i>
<a name='L518'><i><font color='green'>//// 文件打开namei 函数。</font></i>
<a name='L519'><i><font color='green'>// 参数:pathname - 文件路径名;flag - 文件打开标志;mode - 文件访问许可属性;</font></i>
<a name='L520'><i><font color='green'>// 返回:成功返回0,否则返回出错码;res_inode - 返回的对应文件路径名的的i 节点指针。</font></i>
<a name='L521'><b>int</b>
<a name='L522'><a href='../R/543.html' title='Multiple refered from 2 places.'>open_namei</a> (<b>const</b> <b>char</b> *pathname, <b>int</b> flag, <b>int</b> mode,
<a name='L523'>            <b>struct</b> m_inode **res_inode)
<a name='L524'><font color='red'>{</font>
<a name='L525'>  <b>const</b> <b>char</b> *basename;
<a name='L526'>  <b>int</b> inr, <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, namelen;

⌨️ 快捷键说明

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