Browse Source

feat: add sys_chmod, remove debug prints

greatbridf 3 months ago
parent
commit
f10251a691
5 changed files with 68 additions and 10 deletions
  1. 19 0
      init_script.sh
  2. 26 0
      src/fs/tmpfs.rs
  3. 15 10
      src/kernel/syscall/procops.rs
  4. 4 0
      src/kernel/vfs/dentry.rs
  5. 4 0
      src/kernel/vfs/inode.rs

+ 19 - 0
init_script.sh

@@ -59,4 +59,23 @@ alias ll="ls -l "
 alias la="ls -la "
 EOF
 
+cat > /root/test.c <<EOF
+#include <stdio.h>
+
+int main() {
+    int var = 0;
+    printf("Hello, world!\n");
+    printf("Please input a number: \n");
+    scanf("%d", &var);
+    if (var > 0) {
+        printf("You typed a positive number.\n");
+    } else if (var == 0 ) {
+        printf("You input a zero.\n");
+    } else {
+        printf("You typed a negative number.\n");
+    }
+    return 0;
+}
+EOF
+
 exec /mnt/init /bin/sh -c 'exec sh -l < /dev/ttyS0 > /dev/ttyS0 2> /dev/ttyS0'

+ 26 - 0
src/fs/tmpfs.rs

@@ -203,6 +203,17 @@ impl Inode for DirectoryInode {
 
         Ok(())
     }
+
+    fn chmod(&self, mode: Mode) -> KResult<()> {
+        let _vfs = acquire(&self.vfs)?;
+        let _lock = self.rwsem.lock();
+
+        // SAFETY: `rwsem` has done the synchronization
+        let old = self.mode.load(Ordering::Relaxed);
+        self.mode
+            .store((old & !0o777) | (mode & 0o777), Ordering::Relaxed);
+        Ok(())
+    }
 }
 
 define_struct_inode! {
@@ -229,6 +240,10 @@ impl Inode for SymlinkInode {
             .fill(self.target.as_ref())
             .map(|result| result.allow_partial())
     }
+
+    fn chmod(&self, _: Mode) -> KResult<()> {
+        Ok(())
+    }
 }
 
 define_struct_inode! {
@@ -298,6 +313,17 @@ impl Inode for FileInode {
 
         Ok(())
     }
+
+    fn chmod(&self, mode: Mode) -> KResult<()> {
+        let _vfs = acquire(&self.vfs)?;
+        let _lock = self.rwsem.lock();
+
+        // SAFETY: `rwsem` has done the synchronization
+        let old = self.mode.load(Ordering::Relaxed);
+        self.mode
+            .store((old & !0o777) | (mode & 0o777), Ordering::Relaxed);
+        Ok(())
+    }
 }
 
 impl_any!(TmpFs);

+ 15 - 10
src/kernel/syscall/procops.rs

@@ -449,14 +449,6 @@ fn do_prlimit64(
     new_limit: *const RLimit,
     old_limit: *mut RLimit,
 ) -> KResult<()> {
-    println_debug!(
-        "prlimit64({}, {}, {:?}, {:?})",
-        pid,
-        resource,
-        new_limit,
-        old_limit
-    );
-
     if pid != 0 {
         return Err(ENOSYS);
     }
@@ -507,8 +499,6 @@ struct RUsage {
 }
 
 fn do_getrusage(who: u32, rusage: *mut RUsage) -> KResult<()> {
-    println_debug!("getrusage({}, {:?})", who, rusage);
-
     if who != 0 {
         return Err(ENOSYS);
     }
@@ -536,6 +526,19 @@ fn do_getrusage(who: u32, rusage: *mut RUsage) -> KResult<()> {
     Ok(())
 }
 
+fn do_chmod(pathname: *const u8, mode: u32) -> KResult<()> {
+    let context = FsContext::get_current();
+    let path = UserString::new(pathname)?;
+    let path = Path::new(path.as_cstr().to_bytes())?;
+
+    let dentry = Dentry::open(&context, path, true)?;
+    if !dentry.is_valid() {
+        return Err(ENOENT);
+    }
+
+    dentry.chmod(mode)
+}
+
 define_syscall32!(sys_chdir, do_chdir, path: *const u8);
 define_syscall32!(sys_umask, do_umask, mask: u32);
 define_syscall32!(sys_getcwd, do_getcwd, buffer: *mut u8, bufsize: usize);
@@ -568,6 +571,7 @@ define_syscall32!(sys_prlimit64, do_prlimit64,
     pid: u32, resource: u32, new_limit: *const RLimit, old_limit: *mut RLimit);
 define_syscall32!(sys_getrlimit, do_getrlimit, resource: u32, rlimit: *mut RLimit);
 define_syscall32!(sys_getrusage, do_getrusage, who: u32, rlimit: *mut RUsage);
+define_syscall32!(sys_chmod, do_chmod, pathname: *const u8, mode: u32);
 
 fn sys_vfork(int_stack: &mut InterruptContext, ext: &mut ExtendedContext) -> usize {
     sys_fork(int_stack, ext)
@@ -602,6 +606,7 @@ pub(super) fn register() {
     register_syscall!(0x07, waitpid);
     register_syscall!(0x0b, execve);
     register_syscall!(0x0c, chdir);
+    register_syscall!(0x0f, chmod);
     register_syscall!(0x14, getpid);
     register_syscall!(0x15, mount);
     register_syscall!(0x25, kill);

+ 4 - 0
src/kernel/vfs/dentry.rs

@@ -433,4 +433,8 @@ impl Dentry {
             self.parent.get_inode().unwrap().mknod(self, mode, devid)
         }
     }
+
+    pub fn chmod(&self, mode: Mode) -> KResult<()> {
+        self.get_inode()?.chmod(mode)
+    }
 }

+ 4 - 0
src/kernel/vfs/inode.rs

@@ -138,6 +138,10 @@ pub trait Inode: Send + Sync + InodeInner {
         Err(if !self.is_dir() { ENOTDIR } else { EPERM })
     }
 
+    fn chmod(&self, mode: Mode) -> KResult<()> {
+        Err(EPERM)
+    }
+
     fn statx(&self, stat: &mut statx, mask: u32) -> KResult<()> {
         // Safety: ffi should have checked reference
         let vfs = self.vfs.upgrade().expect("Vfs is dropped");