Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-0.11
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
linux-0.11
Commits
0399b71c
Commit
0399b71c
authored
Sep 09, 2014
by
karottc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
给fs/open.c文件增加注释-(3).
parent
f8bc7b3f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
31 additions
and
0 deletions
+31
-0
fs/open.c
fs/open.c
+31
-0
No files found.
fs/open.c
View file @
0399b71c
...
...
@@ -126,47 +126,70 @@ int sys_chdir(const char * filename)
return
(
0
);
}
//// 改变根目录系统调用
// 把指定的目录名设置成当前进程的根目录'/'.
// 如果操作成功则返回0,否则返回出错码。
int
sys_chroot
(
const
char
*
filename
)
{
struct
m_inode
*
inode
;
// 该调用用于改变当前进程任务结构中的根目录字段root,让其执行参数给定目录名
// 的i节点。如果目录名对应的i节点不存在,则返回出错码。如果该i节点不是目录i
// 节点,则放回该i节点,也返回出错码。
if
(
!
(
inode
=
namei
(
filename
)))
return
-
ENOENT
;
if
(
!
S_ISDIR
(
inode
->
i_mode
))
{
iput
(
inode
);
return
-
ENOTDIR
;
}
// 然后释放当前进程的根目录i节点,并重新设置为指定目录名的i节点,返回0。
iput
(
current
->
root
);
current
->
root
=
inode
;
return
(
0
);
}
//// 修改文件属性系统调用
// 参数filename是文件名,mode是新的文件属性
// 若操作成功则返回0,否则返回出错码。
int
sys_chmod
(
const
char
*
filename
,
int
mode
)
{
struct
m_inode
*
inode
;
// 该调用为指定文件设置新的访问属性Mode。文件的访问属性在文件名对应的i节点
// 中,因此我们首先取文件名对应的i节点。如果i节点不存在,则返回出错码(文件或
// 目录不存在)。如果当前进程是有效用户id与文件i节点的用户id不同,并且也不是
// 超级用户,则放回该文件i节点,返回出错码(没有访问权限)。
if
(
!
(
inode
=
namei
(
filename
)))
return
-
ENOENT
;
if
((
current
->
euid
!=
inode
->
i_uid
)
&&
!
suser
())
{
iput
(
inode
);
return
-
EACCES
;
}
// 否则就重新设置该i节点的文件属性,并置该i节点的已修改标志。放回该i节点,返回0.
inode
->
i_mode
=
(
mode
&
07777
)
|
(
inode
->
i_mode
&
~
07777
);
inode
->
i_dirt
=
1
;
iput
(
inode
);
return
0
;
}
///// 修改文件宿主系统调用
// 参数filename是文件名,uid是用户标识符(用户ID),gid是组ID。
// 若操作成功则返回0,否则返回出错码。
int
sys_chown
(
const
char
*
filename
,
int
uid
,
int
gid
)
{
struct
m_inode
*
inode
;
// 该调用用于设置文件i节点中的用户和组ID,因此首先要取得给定文件名的i节点。
// 如果文件名的i节点不存在,则返回出错码(文件或目录不存在)。如果当前进程不
// 是超级用户,则放回该i节点,并返回出错码(没有访问权限)。
if
(
!
(
inode
=
namei
(
filename
)))
return
-
ENOENT
;
if
(
!
suser
())
{
iput
(
inode
);
return
-
EACCES
;
}
// 否则我们就用参数提供的值来设置文件i节点的用户ID和组ID,并置i节点已修改
// 标志,放回该节点,返回0.
inode
->
i_uid
=
uid
;
inode
->
i_gid
=
gid
;
inode
->
i_dirt
=
1
;
...
...
@@ -174,6 +197,14 @@ int sys_chown(const char * filename,int uid,int gid)
return
0
;
}
//// 打开(或创建)文件系统调用。
// 参数filename是文件名,flag是打开文件标志,它可取值:O_RDONLY(只读)、O_WRONLY
// (只写)或O_RDWR(读写),以及O_EXCL(被创建文件必须不存在)、O_APPEND(在文件
// 尾添加数据)等其他一些标志的组合。如果本调用创建了一个新文件,则mode就用于指
// 定文件的许可属性。这些属性有S_IRWXU(文件宿主具有读、写和执行权限)、S_IRUSR
// (用户具有读文件权限)、S_IRWXG(组成员具有读、写和执行权限)等等。对于新创
// 建的文件,这些属性只应用与将来对文件的访问,创建了只读文件的打开调用也将返回
// 一个可读写的文件句柄。如果调用操作成功,则返回文件句柄(文件描述符),否则返回出错码。
int
sys_open
(
const
char
*
filename
,
int
flag
,
int
mode
)
{
struct
m_inode
*
inode
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment