14.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 693 行 · 第 1/5 页
HTML
693 行
<html>
<head>
<title>fs/namei.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/98.html'>fs</a>/namei.c</h2>
<i><font color='green'>/* [<][>]<a href='#L58'>[^]</a><a href='#L1107'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L58' title='Defined at 58.'>permission</a>
<li><a href='#L96' title='Defined at 96.'>match</a>
<li><a href='#L141' title='Defined at 141.'>find_entry</a>
<li><a href='#L258' title='Defined at 258.'>add_entry</a>
<li><a href='#L355' title='Defined at 355.'>get_dir</a>
<li><a href='#L434' title='Defined at 434.'>dir_namei</a>
<li><a href='#L470' title='Defined at 470.'>namei</a>
<li><a href='#L522' title='Defined at 522.'>open_namei</a>
<li><a href='#L636' title='Defined at 636.'>sys_mknod</a>
<li><a href='#L711' title='Defined at 711.'>sys_mkdir</a>
<li><a href='#L828' title='Defined at 828.'>empty_dir</a>
<li><a href='#L898' title='Defined at 898.'>sys_rmdir</a>
<li><a href='#L1019' title='Defined at 1019.'>sys_unlink</a>
<li><a href='#L1107' title='Defined at 1107.'>sys_link</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/namei.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><i><font color='green'>/*</font></i>
<a name='L8'><i><font color='green'>* Some corrections by tytso.</font></i>
<a name='L9'><i><font color='green'>*/</font></i>
<a name='L10'><i><font color='green'>/*</font></i>
<a name='L11'><i><font color='green'>* tytso 作了一些纠正。</font></i>
<a name='L12'><i><font color='green'>*/</font></i>
<a name='L13'>
<a name='L14'><font color='darkred'>#include</font> <<a href='36.html'>linux/sched.h</a>> <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L15'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L16'><font color='darkred'>#include</font> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L17'><font color='darkred'>#include</font> <<a href='24.html'>asm/segment.h</a>> <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L18'>
<a name='L19'><font color='darkred'>#include</font> <<a href='42.html'>string.h</a>> <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L20'><font color='darkred'>#include</font> <<a href='29.html'>fcntl.h</a>> <i><font color='green'>// 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。</font></i>
<a name='L21'><font color='darkred'>#include</font> <<a href='28.html'>errno.h</a>> <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)。</font></i>
<a name='L22'><font color='darkred'>#include</font> <<a href='26.html'>const.h</a>> <i><font color='green'>// 常数符号头文件。目前仅定义了i 节点中i_mode 字段的各标志位。</font></i>
<a name='L23'><font color='darkred'>#include</font> <<a href='43.html'>sys/stat.h</a>> <i><font color='green'>// 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。</font></i>
<a name='L24'>
<a name='L25'><i><font color='green'>// 访问模式宏。x 是include/fcntl.h 第7 行开始定义的文件访问标志。</font></i>
<a name='L26'><i><font color='green'>// 根据x 值索引对应数值(数值表示rwx 权限: r, w, rw, wxrwxrwx)(数值是8 进制)。</font></i>
<a name='L27'><font color='darkred'>#define</font> <a href='../S/14.html#L616' title='Refered from 616 in fs/namei.c.'>ACC_MODE</a>(x) ( "\004\002\006\377"[(x)&<a href='../S/29.html#L8' title='Defined at 8 in include/fcntl.h.'>O_ACCMODE</a>])
<a name='L28'>
<a name='L29'><i><font color='green'>/*</font></i>
<a name='L30'><i><font color='green'>* comment out this line if you want names > NAME_LEN chars to be</font></i>
<a name='L31'><i><font color='green'>* truncated. Else they will be disallowed.</font></i>
<a name='L32'><i><font color='green'>*/</font></i>
<a name='L33'><i><font color='green'>/*</font></i>
<a name='L34'><i><font color='green'>* 如果想让文件名长度>NAME_LEN 的字符被截掉,就将下面定义注释掉。</font></i>
<a name='L35'><i><font color='green'>*/</font></i>
<a name='L36'><i><font color='green'>/* #define NO_TRUNCATE */</font></i>
<a name='L37'>
<a name='L38'><font color='darkred'>#define</font> <a href='../S/14.html#L389' title='Refered from 389 in fs/namei.c.'>MAY_EXEC</a> 1 <i><font color='green'>// 可执行(可进入)。</font></i>
<a name='L39'><font color='darkred'>#define</font> <a href='../R/128.html' title='Multiple refered from 6 places.'>MAY_WRITE</a> 2 <i><font color='green'>// 可写。</font></i>
<a name='L40'><font color='darkred'>#define</font> MAY_READ 4 <i><font color='green'>// 可读。</font></i>
<a name='L41'>
<a name='L42'><i><font color='green'>/*</font></i>
<a name='L43'><i><font color='green'>* permission()</font></i>
<a name='L44'><i><font color='green'>*</font></i>
<a name='L45'><i><font color='green'>* is used to check for read/write/execute permissions on a file.</font></i>
<a name='L46'><i><font color='green'>* I don't know if we should look at just the euid or both euid and</font></i>
<a name='L47'><i><font color='green'>* uid, but that should be easily changed.</font></i>
<a name='L48'><i><font color='green'>*/</font></i>
<a name='L49'><i><font color='green'>/*</font></i>
<a name='L50'><i><font color='green'>* permission()</font></i>
<a name='L51'><i><font color='green'>* 该函数用于检测一个文件的读/写/执行权限。我不知道是否只需检查euid,还是</font></i>
<a name='L52'><i><font color='green'>* 需要检查euid 和uid 两者,不过这很容易修改。</font></i>
<a name='L53'><i><font color='green'>*/</font></i>
<a name='L54'><i><font color='green'>//// 检测文件访问许可权限。</font></i>
<a name='L55'><i><font color='green'>// 参数:inode - 文件对应的i 节点;mask - 访问属性屏蔽码。</font></i>
<a name='L56'><i><font color='green'>// 返回:访问许可返回1,否则返回0。</font></i>
<a name='L57'><b>static</b> <b>int</b>
<a name='L58'><a href='../R/548.html' title='Multiple refered from 8 places.'>permission</a> (<b>struct</b> m_inode *inode, <b>int</b> mask)
<a name='L59'><font color='red'>{</font>
<a name='L60'> <b>int</b> mode = inode->i_mode; <i><font color='green'>// 文件访问属性</font></i>
<a name='L61'>
<a name='L62'><i><font color='green'>/* special case: not even root can read/write a deleted file */</font></i>
<a name='L63'><i><font color='green'>/* 特殊情况:即使是超级用户(root)也不能读/写一个已被删除的文件 */</font></i>
<a name='L64'><i><font color='green'>// 如果i 节点有对应的设备,但该i 节点的连接数等于0,则返回。</font></i>
<a name='L65'> <b>if</b> (inode->i_dev && !inode->i_nlinks)
<a name='L66'> <b>return</b> 0;
<a name='L67'><i><font color='green'>// 否则,如果进程的有效用户id(euid)与i 节点的用户id 相同,则取文件宿主的用户访问权限。</font></i>
<a name='L68'> <b>else</b> <b>if</b> (current->euid == inode->i_uid)
<a name='L69'> mode >>= 6;
<a name='L70'><i><font color='green'>// 否则,如果进程的有效组id(egid)与i 节点的组id 相同,则取组用户的访问权限。</font></i>
<a name='L71'> <b>else</b> <b>if</b> (current->egid == inode->i_gid)
<a name='L72'> mode >>= 3;
<a name='L73'><i><font color='green'>// 如果上面所取的的访问权限与屏蔽码相同,或者是超级用户,则返回1,否则返回0。</font></i>
<a name='L74'> <b>if</b> (((mode & mask & 0007) == mask) || <a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L75'> <b>return</b> 1;
<a name='L76'> <b>return</b> 0;
<a name='L77'><font color='red'>}</font>
<a name='L78'>
<a name='L79'><i><font color='green'>/*</font></i>
<a name='L80'><i><font color='green'>* ok, we cannot use strncmp, as the name is not in our data space.</font></i>
<a name='L81'><i><font color='green'>* Thus we'll have to use match. No big problem. Match also makes</font></i>
<a name='L82'><i><font color='green'>* some sanity tests.</font></i>
<a name='L83'><i><font color='green'>*</font></i>
<a name='L84'><i><font color='green'>* NOTE! unlike strncmp, match returns 1 for success, 0 for failure.</font></i>
<a name='L85'><i><font color='green'>*/</font></i>
<a name='L86'><i><font color='green'>/*</font></i>
<a name='L87'><i><font color='green'>* ok,我们不能使用strncmp 字符串比较函数,因为名称不在我们的数据空间(不在内核空间)。</font></i>
<a name='L88'><i><font color='green'>* 因而我们只能使用match()。问题不大。match()同样也处理一些完整的测试。</font></i>
<a name='L89'><i><font color='green'>*</font></i>
<a name='L90'><i><font color='green'>* 注意!与strncmp 不同的是match()成功时返回1,失败时返回0。</font></i>
<a name='L91'><i><font color='green'>*/</font></i>
<a name='L92'><i><font color='green'>//// 指定长度字符串比较函数。</font></i>
<a name='L93'><i><font color='green'>// 参数:len - 比较的字符串长度;name - 文件名指针;de - 目录项结构。</font></i>
<a name='L94'><i><font color='green'>// 返回:相同返回1,不同返回0。</font></i>
<a name='L95'><b>static</b> <b>int</b>
<a name='L96'><a href='../S/14.html#L221' title='Refered from 221 in fs/namei.c.'>match</a> (<b>int</b> len, <b>const</b> <b>char</b> *name, <b>struct</b> dir_entry *de)
<a name='L97'><font color='red'>{</font>
<a name='L98'> <b>register</b> <b>int</b> same <b>__asm__</b> ("ax");
<a name='L99'>
<a name='L100'><i><font color='green'>// 如果目录项指针空,或者目录项i 节点等于0,或者要比较的字符串长度超过文件名长度,则返回0。</font></i>
<a name='L101'> <b>if</b> (!de || !de->inode || len > <a href='../S/31.html#L52' title='Defined at 52 in include/linux/fs.h.'>NAME_LEN</a>)
<a name='L102'> <b>return</b> 0;
<a name='L103'><i><font color='green'>// 如果要比较的长度len 小于NAME_LEN,但是目录项中文件名长度超过len,则返回0。</font></i>
<a name='L104'> <b>if</b> (len < <a href='../S/31.html#L52' title='Defined at 52 in include/linux/fs.h.'>NAME_LEN</a> && de->name[len])
<a name='L105'> <b>return</b> 0;
<a name='L106'><i><font color='green'>// 下面嵌入汇编语句,在用户数据空间(fs)执行字符串的比较操作。</font></i>
<a name='L107'><i><font color='green'>// %0 - eax(比较结果same);%1 - eax(eax 初值0);%2 - esi(名字指针);%3 - edi(目录项名指针);</font></i>
<a name='L108'><i><font color='green'>// %4 - ecx(比较的字节长度值len)。</font></i>
<a name='L109'> <b>__asm__</b> ("cld\n\t" <i><font color='green'>// 清方向位。</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?