From 003811e0ea2fec2afb2b8786a528067c0a26ee4b Mon Sep 17 00:00:00 2001 From: hinus Date: Fri, 6 Aug 2021 11:14:43 +0800 Subject: [PATCH] Title: System call chown. Issue: https://gitee.com/hinus/linux_kernel_011/issues/I43DC1 Description: System call, chown, chroot, chmod --- fs/open.c | 56 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/sys.h | 12 +++++----- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/fs/open.c b/fs/open.c index 999d441..b0d56d6 100644 --- a/fs/open.c +++ b/fs/open.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include #include @@ -9,6 +11,60 @@ #include +int sys_ustat(int dev, struct ustat * ubuf) { + return -ENOSYS; +} + +int sys_chroot(const char * filename) { + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + + if (!S_ISDIR(inode->i_mode)) { + iput(inode); + return -ENOTDIR; + } + + iput(current->root); + current->root = inode; + return 0; +} + +int sys_chmod(const char * filename,int mode) { + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + + if ((current->euid != inode->i_uid) && !suser()) { + iput(inode); + return -EACCES; + } + + inode->i_mode = (mode & 07777) | (inode->i_mode & ~07777); + inode->i_dirt = 1; + iput(inode); + return 0; +} + +int sys_chown(const char * filename,int uid,int gid) { + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + if (!suser()) { + iput(inode); + return -EACCES; + } + + inode->i_uid=uid; + inode->i_gid=gid; + inode->i_dirt=1; + iput(inode); + return 0; +} + int sys_chdir(const char * filename) { struct m_inode * inode; if (!(inode = namei(filename))) diff --git a/include/linux/sys.h b/include/linux/sys.h index 3c7ba08..291b74a 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -13,8 +13,8 @@ extern int sys_execve(); extern int sys_chdir(); extern int sys_time(); //extern int sys_mknod(); -//extern int sys_chmod(); -//extern int sys_chown(); +extern int sys_chmod(); +extern int sys_chown(); //extern int sys_break(); //extern int sys_stat(); //extern int sys_lseek(); @@ -59,7 +59,7 @@ extern int sys_ioctl(); extern int sys_ulimit(); //extern int sys_uname(); //extern int sys_umask(); -//extern int sys_chroot(); +extern int sys_chroot(); //extern int sys_ustat(); //extern int sys_dup2(); extern int sys_getppid(); @@ -103,9 +103,9 @@ fn_ptr sys_call_table[] = { sys_chdir, sys_time, 0, //sys_mknod, - 0, //sys_chmod, + sys_chmod, - 0, //sys_chown, + sys_chown, 0, //sys_break, 0, //sys_stat, 0, //sys_lseek, @@ -157,7 +157,7 @@ fn_ptr sys_call_table[] = { 0, // sys_uname, 0, // sys_umask, - 0, // sys_chroot, + sys_chroot, 0, // sys_ustat, 0, // sys_dup2, sys_getppid, -- Gitee