linux/fs/namei.c/permission()
来源:互联网 发布:计算机编程相关书籍 编辑:程序博客网 时间:2024/05/18 08:49
/*
* permission()
*
* is used to check for read/write/execute permissions on a file.
* I don't know if we should look at just the euid or both euid and
* uid, but that should be easily changed.
*/
// permission()函数用来检验当前进程对inode指向的文件是否有mask标示的权限
static int permission(struct m_inode * inode,int mask)
{
// 取出inode的i_mode,这表明了imode指向的文件本身的读写权限。
int mode = inode->i_mode;
/* special case: not even root can read/write a deleted file */
// inode->i_dev存在(i节点有对应的设备),并且inode->i_nlinks=0
// (即文件没有被引用),则表明这个文件是一个被删除了的文件。即使是
// 超级用户root也没有操作已删除文件的权限,因此return 0
if (inode->i_dev && !inode->i_nlinks)
return 0;
// 首先明白euid的含义。euid是进程task_struct中的一个short字段。一般
// 一个进程的euid等于运行这个进程的用户的uid。(同样地egid等于运行
// 这个进程的用户的gid),这样这个进程就有了运行进程的用户的权限设置了。
// 其次明白inode->i_uid的含义。i_uid用来标示inode指向的文件的uid,即这个
// 文件的宿主的uid。同样地,i_gid表明文件宿主所在的group的gid
// 当前进程的euid == inode->i_uid,表明运行进程的用户和该文件的宿主用户
// 是同一用户。此时inode文件在被自己的宿主使用,因此应该查三组权限位中的
// U(SUGO:即超级用户,宿主,宿主group,others中的U)
else if (current->euid==inode->i_uid)
// mode>>6,将U所在的三位移到了最底三位。
mode >>= 6;
// 若操作inode文件的用户不是文件宿主,但是是宿主group内的成员,则适用G权限位
else if (current->egid==inode->i_gid)
// mode>>3将G移到了最低3bit
mode >>= 3;
// 这里两个else if却没有最后的else,其实相当于是有个default的,default就是
// 对mode不做处理。因为default的情况对应着O权限位(即others),刚好是mode的
// 最低3bit,所以不用做什么处理。
// mode & 0007取出了mode的最低三位,再位与mask后,若等于mask说明mode表示的权限
// 包含mask,即当前进程有mask表示的操作权限,返回1.若不等则返回0.
// suser()宏用来判断当前进程的宿主是否是超级用户root(current->euid == 0)
// 超级用户对于所有文件具有操作权限,所以直接返回1.
if (((mode & mask & 0007) == mask) || suser())
return 1;
return 0;
}
* permission()
*
* is used to check for read/write/execute permissions on a file.
* I don't know if we should look at just the euid or both euid and
* uid, but that should be easily changed.
*/
// permission()函数用来检验当前进程对inode指向的文件是否有mask标示的权限
static int permission(struct m_inode * inode,int mask)
{
// 取出inode的i_mode,这表明了imode指向的文件本身的读写权限。
int mode = inode->i_mode;
/* special case: not even root can read/write a deleted file */
// inode->i_dev存在(i节点有对应的设备),并且inode->i_nlinks=0
// (即文件没有被引用),则表明这个文件是一个被删除了的文件。即使是
// 超级用户root也没有操作已删除文件的权限,因此return 0
if (inode->i_dev && !inode->i_nlinks)
return 0;
// 首先明白euid的含义。euid是进程task_struct中的一个short字段。一般
// 一个进程的euid等于运行这个进程的用户的uid。(同样地egid等于运行
// 这个进程的用户的gid),这样这个进程就有了运行进程的用户的权限设置了。
// 其次明白inode->i_uid的含义。i_uid用来标示inode指向的文件的uid,即这个
// 文件的宿主的uid。同样地,i_gid表明文件宿主所在的group的gid
// 当前进程的euid == inode->i_uid,表明运行进程的用户和该文件的宿主用户
// 是同一用户。此时inode文件在被自己的宿主使用,因此应该查三组权限位中的
// U(SUGO:即超级用户,宿主,宿主group,others中的U)
else if (current->euid==inode->i_uid)
// mode>>6,将U所在的三位移到了最底三位。
mode >>= 6;
// 若操作inode文件的用户不是文件宿主,但是是宿主group内的成员,则适用G权限位
else if (current->egid==inode->i_gid)
// mode>>3将G移到了最低3bit
mode >>= 3;
// 这里两个else if却没有最后的else,其实相当于是有个default的,default就是
// 对mode不做处理。因为default的情况对应着O权限位(即others),刚好是mode的
// 最低3bit,所以不用做什么处理。
// mode & 0007取出了mode的最低三位,再位与mask后,若等于mask说明mode表示的权限
// 包含mask,即当前进程有mask表示的操作权限,返回1.若不等则返回0.
// suser()宏用来判断当前进程的宿主是否是超级用户root(current->euid == 0)
// 超级用户对于所有文件具有操作权限,所以直接返回1.
if (((mode & mask & 0007) == mask) || suser())
return 1;
return 0;
}
- linux/fs/namei.c/permission()
- Liunx FS / Namei.c
- linux 0.11 namei.c 注释
- linux 0.11 内核学习 -- namei.c。
- Linux内核源码分析--文件系统(七、Namei.c)
- ext2文件系统源代码之namei.c
- linux/fs/inode.c/_bmap() and bmap()
- linux fs
- linux fs
- file_table.c 文件分析 linux1_0\linux\fs\file_table.c
- EXT2 file system namei.c with my comments
- 文件系统(二)--buffer.c namei.c truncate.c open.c源码分析
- linux/fs/proc.txt
- linux debug fs(1)
- oracle 12c rac Linux-x86_64 Error: 13: Permission denied
- Access linux fs from windows
- FS
- fs
- Windows Phone开发(43):推送通知第一集——Toast推送
- Linux下启动java程序的通用脚本sh
- jsoncpp在VS2008下的配置方法
- JAVA重点知识集合的简单总结,望高手斧正
- 十五周(一)
- linux/fs/namei.c/permission()
- 创建非模态对话框时向非模态对话框传递参数方法
- c#中WebBrowser控件 .
- 让死掉的U盘起死回生,使用UBUNTU给U盘格式化
- c程序是如何启动和终止
- DB2 pureXML
- ubuntu 10.04安装 kscope
- Oracle查询表注释
- 20120530--asio让网络编程代码变简洁了