15.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 355 行 · 第 1/3 页
HTML
355 行
<a name='L94'><i><font color='green'>* swapping the effective with the real user id (temporarily),</font></i>
<a name='L95'><i><font color='green'>* and then calling suser() routine. If we do call the</font></i>
<a name='L96'><i><font color='green'>* suser() routine, it needs to be called last.</font></i>
<a name='L97'><i><font color='green'>*/</font></i>
<a name='L98'><i><font color='green'>/*</font></i>
<a name='L99'><i><font color='green'>* XXX 我们最后才做下面的测试,因为我们实际上需要交换有效用户id 和</font></i>
<a name='L100'><i><font color='green'>* 真实用户id(临时地),然后才调用suser()函数。如果我们确实要调用</font></i>
<a name='L101'><i><font color='green'>* suser()函数,则需要最后才被调用。</font></i>
<a name='L102'><i><font color='green'>*/</font></i>
<a name='L103'><i><font color='green'>// 如果当前用户id 为0(超级用户)并且屏蔽码执行位是0 或文件可以被任何人访问,则返回0。</font></i>
<a name='L104'> <b>if</b> ((!current->uid) && (!(mode & 1) || (i_mode & 0111)))
<a name='L105'> <b>return</b> 0;
<a name='L106'><i><font color='green'>// 否则返回出错码。</font></i>
<a name='L107'> <b>return</b> -<a href='../S/28.html#L42' title='Defined at 42 in include/errno.h.'>EACCES</a>;
<a name='L108'><font color='red'>}</font>
<a name='L109'>
<a name='L110'><i><font color='green'>//// 改变当前工作目录系统调用函数。</font></i>
<a name='L111'><i><font color='green'>// 参数filename 是目录名。</font></i>
<a name='L112'><i><font color='green'>// 操作成功则返回0,否则返回出错码。</font></i>
<a name='L113'><b>int</b>
<a name='L114'><a href='../R/633.html' title='Multiple refered from 2 places.'>sys_chdir</a> (<b>const</b> <b>char</b> *filename)
<a name='L115'><font color='red'>{</font>
<a name='L116'> <b>struct</b> m_inode *inode;
<a name='L117'>
<a name='L118'><i><font color='green'>// 如果文件名对应的i 节点不存在,则返回出错码。</font></i>
<a name='L119'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L120'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L121'><i><font color='green'>// 如果该i 节点不是目录的i 节点,则释放该节点,返回出错码。</font></i>
<a name='L122'> <b>if</b> (!<a href='../S/43.html#L35' title='Defined at 35 in include/sys/stat.h.'>S_ISDIR</a> (inode->i_mode))
<a name='L123'> <font color='red'>{</font>
<a name='L124'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L125'> <b>return</b> -<a href='../S/28.html#L49' title='Defined at 49 in include/errno.h.'>ENOTDIR</a>;
<a name='L126'> <font color='red'>}</font>
<a name='L127'><i><font color='green'>// 释放当前进程原工作目录i 节点,并指向该新置的工作目录i 节点。返回0。</font></i>
<a name='L128'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (current->pwd);
<a name='L129'> current->pwd = inode;
<a name='L130'> <b>return</b> (0);
<a name='L131'><font color='red'>}</font>
<a name='L132'>
<a name='L133'><i><font color='green'>//// 改变根目录系统调用函数。</font></i>
<a name='L134'><i><font color='green'>// 将指定的路径名改为根目录'/'。</font></i>
<a name='L135'><i><font color='green'>// 如果操作成功则返回0,否则返回出错码。</font></i>
<a name='L136'><b>int</b>
<a name='L137'><a href='../R/636.html' title='Multiple refered from 2 places.'>sys_chroot</a> (<b>const</b> <b>char</b> *filename)
<a name='L138'><font color='red'>{</font>
<a name='L139'> <b>struct</b> m_inode *inode;
<a name='L140'>
<a name='L141'><i><font color='green'>// 如果文件名对应的i 节点不存在,则返回出错码。</font></i>
<a name='L142'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L143'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L144'><i><font color='green'>// 如果该i 节点不是目录的i 节点,则释放该节点,返回出错码。</font></i>
<a name='L145'> <b>if</b> (!<a href='../S/43.html#L35' title='Defined at 35 in include/sys/stat.h.'>S_ISDIR</a> (inode->i_mode))
<a name='L146'> <font color='red'>{</font>
<a name='L147'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L148'> <b>return</b> -<a href='../S/28.html#L49' title='Defined at 49 in include/errno.h.'>ENOTDIR</a>;
<a name='L149'> <font color='red'>}</font>
<a name='L150'><i><font color='green'>// 释放当前进程的根目录i 节点,并重置为这里指定目录名的i 节点,返回0。</font></i>
<a name='L151'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (current->root);
<a name='L152'> current->root = inode;
<a name='L153'> <b>return</b> (0);
<a name='L154'><font color='red'>}</font>
<a name='L155'>
<a name='L156'><i><font color='green'>//// 修改文件属性系统调用函数。</font></i>
<a name='L157'><i><font color='green'>// 参数filename 是文件名,mode 是新的文件属性。</font></i>
<a name='L158'><i><font color='green'>// 若操作成功则返回0,否则返回出错码。</font></i>
<a name='L159'><b>int</b>
<a name='L160'><a href='../R/634.html' title='Multiple refered from 2 places.'>sys_chmod</a> (<b>const</b> <b>char</b> *filename, <b>int</b> mode)
<a name='L161'><font color='red'>{</font>
<a name='L162'> <b>struct</b> m_inode *inode;
<a name='L163'>
<a name='L164'><i><font color='green'>// 如果文件名对应的i 节点不存在,则返回出错码。</font></i>
<a name='L165'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L166'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L167'><i><font color='green'>// 如果当前进程的有效用户id 不等于文件i 节点的用户id,并且当前进程不是超级用户,则释放该</font></i>
<a name='L168'><i><font color='green'>// 文件i 节点,返回出错码。</font></i>
<a name='L169'> <b>if</b> ((current->euid != inode->i_uid) && !<a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L170'> <font color='red'>{</font>
<a name='L171'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L172'> <b>return</b> -<a href='../S/28.html#L42' title='Defined at 42 in include/errno.h.'>EACCES</a>;
<a name='L173'> <font color='red'>}</font>
<a name='L174'><i><font color='green'>// 重新设置i 节点的文件属性,并置该i 节点已修改标志。释放该i 节点,返回0。</font></i>
<a name='L175'> inode->i_mode = (mode & 07777) | (inode->i_mode & ~07777);
<a name='L176'> inode->i_dirt = 1;
<a name='L177'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L178'> <b>return</b> 0;
<a name='L179'><font color='red'>}</font>
<a name='L180'>
<a name='L181'><i><font color='green'>//// 修改文件宿主系统调用函数。</font></i>
<a name='L182'><i><font color='green'>// 参数filename 是文件名,uid 是用户标识符(用户id),gid 是组id。</font></i>
<a name='L183'><i><font color='green'>// 若操作成功则返回0,否则返回出错码。</font></i>
<a name='L184'><b>int</b>
<a name='L185'><a href='../R/635.html' title='Multiple refered from 2 places.'>sys_chown</a> (<b>const</b> <b>char</b> *filename, <b>int</b> uid, <b>int</b> gid)
<a name='L186'><font color='red'>{</font>
<a name='L187'> <b>struct</b> m_inode *inode;
<a name='L188'>
<a name='L189'><i><font color='green'>// 如果文件名对应的i 节点不存在,则返回出错码。</font></i>
<a name='L190'> <b>if</b> (!(inode = <a href='../S/14.html#L470' title='Defined at 470 in fs/namei.c.'>namei</a> (filename)))
<a name='L191'> <b>return</b> -<a href='../S/28.html#L31' title='Defined at 31 in include/errno.h.'>ENOENT</a>;
<a name='L192'><i><font color='green'>// 若当前进程不是超级用户,则释放该i 节点,返回出错码。</font></i>
<a name='L193'> <b>if</b> (!<a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L194'> <font color='red'>{</font>
<a name='L195'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L196'> <b>return</b> -<a href='../S/28.html#L42' title='Defined at 42 in include/errno.h.'>EACCES</a>;
<a name='L197'> <font color='red'>}</font>
<a name='L198'><i><font color='green'>// 设置文件对应i 节点的用户id 和组id,并置i 节点已经修改标志,释放该i 节点,返回0。</font></i>
<a name='L199'> inode->i_uid = uid;
<a name='L200'> inode->i_gid = gid;
<a name='L201'> inode->i_dirt = 1;
<a name='L202'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L203'> <b>return</b> 0;
<a name='L204'><font color='red'>}</font>
<a name='L205'>
<a name='L206'><i><font color='green'>//// 打开(或创建)文件系统调用函数。</font></i>
<a name='L207'><i><font color='green'>// 参数filename 是文件名,flag 是打开文件标志:只读O_RDONLY、只写O_WRONLY 或读写O_RDWR,</font></i>
<a name='L208'><i><font color='green'>// 以及O_CREAT、O_EXCL、O_APPEND 等其它一些标志的组合,若本函数创建了一个新文件,则mode</font></i>
<a name='L209'><i><font color='green'>// 用于指定使用文件的许可属性,这些属性有S_IRWXU(文件宿主具有读、写和执行权限)、S_IRUSR</font></i>
<a name='L210'><i><font color='green'>// (用户具有读文件权限)、S_IRWXG(组成员具有读、写和执行权限)等等。对于新创建的文件,这些</font></i>
<a name='L211'><i><font color='green'>// 属性只应用于将来对文件的访问,创建了只读文件的打开调用也将返回一个可读写的文件句柄。</font></i>
<a name='L212'><i><font color='green'>// 若操作成功则返回文件句柄(文件描述符),否则返回出错码。(参见sys/stat.h, fcntl.h)</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?