Implement unix permissions
This commit is contained in:
		
							parent
							
								
									10c88e7424
								
							
						
					
					
						commit
						f38426e458
					
				
					 19 changed files with 99 additions and 76 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -288,6 +288,8 @@ $(BUILD)/filesystem.bin: \
 | 
			
		|||
	-cp -RL filesystem/* $(BUILD)/filesystem/
 | 
			
		||||
	-chown -R 0:0 $(BUILD)/filesystem/
 | 
			
		||||
	-chown -R 1000:1000 $(BUILD)/filesystem/home/user/
 | 
			
		||||
	-chmod 700 $(BUILD)/filesystem/root/
 | 
			
		||||
	-chmod 700 $(BUILD)/filesystem/home/user/
 | 
			
		||||
	sync
 | 
			
		||||
	-fusermount -u $(BUILD)/filesystem/
 | 
			
		||||
	rm -rf $(BUILD)/filesystem/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ impl DiskScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for DiskScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let path_str = str::from_utf8(path).or(Err(Error::new(ENOENT)))?;
 | 
			
		||||
 | 
			
		||||
        let i = path_str.parse::<usize>().or(Err(Error::new(ENOENT)))?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ impl DisplayScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for DisplayScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        if path == b"input" {
 | 
			
		||||
            Ok(1)
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ pub extern fn debug_input(b: u8) {
 | 
			
		|||
pub struct DebugScheme;
 | 
			
		||||
 | 
			
		||||
impl Scheme for DebugScheme {
 | 
			
		||||
    fn open(&self, _path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        Ok(0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ impl EnvScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for EnvScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let path = str::from_utf8(path).map_err(|_err| Error::new(ENOENT))?.trim_matches('/');
 | 
			
		||||
 | 
			
		||||
        let env_lock = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ impl EventScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for EventScheme {
 | 
			
		||||
    fn open(&self, _path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let handle = {
 | 
			
		||||
            let contexts = context::contexts();
 | 
			
		||||
            let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ impl InitFsScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for InitFsScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let path_utf8 = str::from_utf8(path).map_err(|_err| Error::new(ENOENT))?;
 | 
			
		||||
        let path_trimmed = path_utf8.trim_matches('/');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ impl Scheme for InitFsScheme {
 | 
			
		|||
                self.handles.write().insert(id, Handle {
 | 
			
		||||
                    path: entry.0,
 | 
			
		||||
                    data: (entry.1).0,
 | 
			
		||||
                    mode: if (entry.1).1 { MODE_DIR } else { MODE_FILE },
 | 
			
		||||
                    mode: if (entry.1).1 { MODE_DIR |  0o755 } else { MODE_FILE | 0o744 },
 | 
			
		||||
                    seek: 0
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -130,6 +130,8 @@ impl Scheme for InitFsScheme {
 | 
			
		|||
        let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
 | 
			
		||||
 | 
			
		||||
        stat.st_mode = handle.mode;
 | 
			
		||||
        stat.st_uid = 0;
 | 
			
		||||
        stat.st_gid = 0;
 | 
			
		||||
        stat.st_size = handle.data.len() as u64;
 | 
			
		||||
 | 
			
		||||
        Ok(0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ use syscall::scheme::Scheme;
 | 
			
		|||
pub struct IrqScheme;
 | 
			
		||||
 | 
			
		||||
impl Scheme for IrqScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let path_str = str::from_utf8(path).or(Err(Error::new(ENOENT)))?;
 | 
			
		||||
 | 
			
		||||
        let id = path_str.parse::<usize>().or(Err(Error::new(ENOENT)))?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ impl RootScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for RootScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let context = {
 | 
			
		||||
            let contexts = context::contexts();
 | 
			
		||||
            let context = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,7 +218,7 @@ impl UserScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Scheme for UserScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
 | 
			
		||||
        let address = inner.capture(path)?;
 | 
			
		||||
        let result = inner.call(SYS_OPEN, address, path.len(), flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -226,15 +226,15 @@ impl Scheme for UserScheme {
 | 
			
		|||
        result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn mkdir(&self, path: &[u8], mode: usize) -> Result<usize> {
 | 
			
		||||
    fn mkdir(&self, path: &[u8], mode: u16, _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
 | 
			
		||||
        let address = inner.capture(path)?;
 | 
			
		||||
        let result = inner.call(SYS_MKDIR, address, path.len(), mode);
 | 
			
		||||
        let result = inner.call(SYS_MKDIR, address, path.len(), mode as usize);
 | 
			
		||||
        let _ = inner.release(address);
 | 
			
		||||
        result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn rmdir(&self, path: &[u8]) -> Result<usize> {
 | 
			
		||||
    fn rmdir(&self, path: &[u8], _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
 | 
			
		||||
        let address = inner.capture(path)?;
 | 
			
		||||
        let result = inner.call(SYS_RMDIR, address, path.len(), 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -242,7 +242,7 @@ impl Scheme for UserScheme {
 | 
			
		|||
        result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn unlink(&self, path: &[u8]) -> Result<usize> {
 | 
			
		||||
    fn unlink(&self, path: &[u8], _uid: u32, _gid: u32) -> Result<usize> {
 | 
			
		||||
        let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
 | 
			
		||||
        let address = inner.capture(path)?;
 | 
			
		||||
        let result = inner.call(SYS_UNLINK, address, path.len(), 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
use context;
 | 
			
		||||
use scheme;
 | 
			
		||||
use syscall::data::{Packet, Stat};
 | 
			
		||||
use syscall::data::Packet;
 | 
			
		||||
use syscall::error::*;
 | 
			
		||||
 | 
			
		||||
pub fn file_op(a: usize, fd: usize, c: usize, d: usize) -> Result<usize> {
 | 
			
		||||
| 
						 | 
				
			
			@ -70,11 +70,11 @@ pub fn getcwd(buf: &mut [u8]) -> Result<usize> {
 | 
			
		|||
 | 
			
		||||
/// Open syscall
 | 
			
		||||
pub fn open(path: &[u8], flags: usize) -> Result<usize> {
 | 
			
		||||
    let path_canon = {
 | 
			
		||||
    let (path_canon, uid, gid) = {
 | 
			
		||||
        let contexts = context::contexts();
 | 
			
		||||
        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
        let context = context_lock.read();
 | 
			
		||||
        context.canonicalize(path)
 | 
			
		||||
        (context.canonicalize(path), context.uid, context.gid)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut parts = path_canon.splitn(2, |&b| b == b':');
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
 | 
			
		|||
            let (scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
 | 
			
		||||
            (scheme_id, scheme.clone())
 | 
			
		||||
        };
 | 
			
		||||
        let file_id = scheme.open(reference_opt.unwrap_or(b""), flags)?;
 | 
			
		||||
        let file_id = scheme.open(reference_opt.unwrap_or(b""), flags, uid, gid)?;
 | 
			
		||||
        (scheme_id, file_id)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,12 +102,12 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/// mkdir syscall
 | 
			
		||||
pub fn mkdir(path: &[u8], mode: usize) -> Result<usize> {
 | 
			
		||||
    let path_canon = {
 | 
			
		||||
pub fn mkdir(path: &[u8], mode: u16) -> Result<usize> {
 | 
			
		||||
    let (path_canon, uid, gid) = {
 | 
			
		||||
        let contexts = context::contexts();
 | 
			
		||||
        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
        let context = context_lock.read();
 | 
			
		||||
        context.canonicalize(path)
 | 
			
		||||
        (context.canonicalize(path), context.uid, context.gid)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut parts = path_canon.splitn(2, |&b| b == b':');
 | 
			
		||||
| 
						 | 
				
			
			@ -120,16 +120,16 @@ pub fn mkdir(path: &[u8], mode: usize) -> Result<usize> {
 | 
			
		|||
        let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
 | 
			
		||||
        scheme.clone()
 | 
			
		||||
    };
 | 
			
		||||
    scheme.mkdir(reference_opt.unwrap_or(b""), mode)
 | 
			
		||||
    scheme.mkdir(reference_opt.unwrap_or(b""), mode, uid, gid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// rmdir syscall
 | 
			
		||||
pub fn rmdir(path: &[u8]) -> Result<usize> {
 | 
			
		||||
    let path_canon = {
 | 
			
		||||
    let (path_canon, uid, gid) = {
 | 
			
		||||
        let contexts = context::contexts();
 | 
			
		||||
        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
        let context = context_lock.read();
 | 
			
		||||
        context.canonicalize(path)
 | 
			
		||||
        (context.canonicalize(path), context.uid, context.gid)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut parts = path_canon.splitn(2, |&b| b == b':');
 | 
			
		||||
| 
						 | 
				
			
			@ -142,16 +142,16 @@ pub fn rmdir(path: &[u8]) -> Result<usize> {
 | 
			
		|||
        let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
 | 
			
		||||
        scheme.clone()
 | 
			
		||||
    };
 | 
			
		||||
    scheme.rmdir(reference_opt.unwrap_or(b""))
 | 
			
		||||
    scheme.rmdir(reference_opt.unwrap_or(b""), uid, gid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Unlink syscall
 | 
			
		||||
pub fn unlink(path: &[u8]) -> Result<usize> {
 | 
			
		||||
    let path_canon = {
 | 
			
		||||
    let (path_canon, uid, gid) = {
 | 
			
		||||
        let contexts = context::contexts();
 | 
			
		||||
        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
        let context = context_lock.read();
 | 
			
		||||
        context.canonicalize(path)
 | 
			
		||||
        (context.canonicalize(path), context.uid, context.gid)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut parts = path_canon.splitn(2, |&b| b == b':');
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ pub fn unlink(path: &[u8]) -> Result<usize> {
 | 
			
		|||
        let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
 | 
			
		||||
        scheme.clone()
 | 
			
		||||
    };
 | 
			
		||||
    scheme.unlink(reference_opt.unwrap_or(b""))
 | 
			
		||||
    scheme.unlink(reference_opt.unwrap_or(b""), uid, gid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Close syscall
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,9 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
 | 
			
		|||
            },
 | 
			
		||||
            SYS_CLASS_PATH => match a {
 | 
			
		||||
                SYS_OPEN => open(validate_slice(b as *const u8, c)?, d),
 | 
			
		||||
                SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d as u16),
 | 
			
		||||
                SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?),
 | 
			
		||||
                SYS_UNLINK => unlink(validate_slice(b as *const u8, c)?),
 | 
			
		||||
                _ => unreachable!()
 | 
			
		||||
            },
 | 
			
		||||
            _ => match a {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -432,9 +432,33 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> {
 | 
			
		|||
            args.push(arg.to_vec()); // Must be moved into kernel space before exec unmaps all memory
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let (uid, gid) = {
 | 
			
		||||
            let contexts = context::contexts();
 | 
			
		||||
            let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
 | 
			
		||||
            let context = context_lock.read();
 | 
			
		||||
            (context.uid, context.gid)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let file = syscall::open(path, 0)?;
 | 
			
		||||
        let mut stat = Stat::default();
 | 
			
		||||
        syscall::file_op_mut_slice(syscall::number::SYS_FSTAT, file, &mut stat)?;
 | 
			
		||||
 | 
			
		||||
        let mut perm = stat.st_mode & 0o7;
 | 
			
		||||
        if stat.st_uid == uid {
 | 
			
		||||
            perm |= (stat.st_mode >> 6) & 0o7;
 | 
			
		||||
        }
 | 
			
		||||
        if stat.st_gid == gid {
 | 
			
		||||
            perm |= (stat.st_mode >> 3) & 0o7;
 | 
			
		||||
        }
 | 
			
		||||
        if uid == 0 {
 | 
			
		||||
            perm |= 0o7;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if perm & 0o1 != 0o1 {
 | 
			
		||||
            let _ = syscall::close(file);
 | 
			
		||||
            return Err(Error::new(EACCES));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //TODO: Only read elf header, not entire file. Then read required segments
 | 
			
		||||
        let mut data = vec![0; stat.st_size as usize];
 | 
			
		||||
        syscall::file_op_mut_slice(syscall::number::SYS_READ, file, &mut data)?;
 | 
			
		||||
| 
						 | 
				
			
			@ -458,6 +482,14 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> {
 | 
			
		|||
                    drop(context.stack.take());
 | 
			
		||||
                    context.grants = Arc::new(Mutex::new(Vec::new()));
 | 
			
		||||
 | 
			
		||||
                    if stat.st_mode & syscall::flag::MODE_SETUID == syscall::flag::MODE_SETUID {
 | 
			
		||||
                        context.uid = stat.st_uid;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if stat.st_mode & syscall::flag::MODE_SETGID == syscall::flag::MODE_SETGID {
 | 
			
		||||
                        context.gid = stat.st_gid;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Map and copy new segments
 | 
			
		||||
                    for segment in elf.segments() {
 | 
			
		||||
                        if segment.p_type == program_header::PT_LOAD {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								libstd
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								libstd
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit 60c282e9b09cc37251d0229108398e7d7add99b9
 | 
			
		||||
Subproject commit 0484051024316956c9e658ed7c3211f76a30a2f9
 | 
			
		||||
| 
						 | 
				
			
			@ -10,8 +10,8 @@ use syscall::{Packet, Result, Scheme};
 | 
			
		|||
struct ExampleScheme;
 | 
			
		||||
 | 
			
		||||
impl Scheme for ExampleScheme {
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize) -> Result<usize> {
 | 
			
		||||
        println!("{}", unsafe { str::from_utf8_unchecked(path) });
 | 
			
		||||
    fn open(&self, path: &[u8], _flags: usize, uid: u32, gid: u32) -> Result<usize> {
 | 
			
		||||
        println!("{} from {}:{}", unsafe { str::from_utf8_unchecked(path) }, uid, gid);
 | 
			
		||||
        Ok(0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -25,27 +25,6 @@ impl Scheme for ExampleScheme {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
fn main(){
 | 
			
		||||
    {
 | 
			
		||||
        let events = syscall::open("event:", 0).unwrap();
 | 
			
		||||
 | 
			
		||||
        let a = syscall::open("display:", 0).unwrap();
 | 
			
		||||
        syscall::fevent(a, syscall::EVENT_READ).unwrap();
 | 
			
		||||
        let b = syscall::open("debug:", 0).unwrap();
 | 
			
		||||
        syscall::fevent(b, syscall::EVENT_READ).unwrap();
 | 
			
		||||
 | 
			
		||||
        loop {
 | 
			
		||||
            let mut event = syscall::Event::default();
 | 
			
		||||
            syscall::read(events, &mut event).unwrap();
 | 
			
		||||
            println!("{:?}", event);
 | 
			
		||||
 | 
			
		||||
            let mut buf = vec![0; event.data];
 | 
			
		||||
            syscall::read(event.id, &mut buf).unwrap();
 | 
			
		||||
            println!("{}", unsafe { ::std::str::from_utf8_unchecked(&buf) });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let _ = syscall::close(events);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    thread::spawn(move || {
 | 
			
		||||
        let mut socket = File::create(":example").expect("example: failed to create example scheme");
 | 
			
		||||
        let scheme = ExampleScheme;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit c06edb232b48024a7a8e468dd5316d5b28a3eac9
 | 
			
		||||
Subproject commit 3dcaad55fe6e82450c1691da5d515861a7deed0a
 | 
			
		||||
| 
						 | 
				
			
			@ -25,25 +25,30 @@ pub const FUTEX_REQUEUE: usize = 2;
 | 
			
		|||
pub const MAP_WRITE: usize = 1;
 | 
			
		||||
pub const MAP_WRITE_COMBINE: usize = 2;
 | 
			
		||||
 | 
			
		||||
pub const MODE_TYPE: u16 = 0xF000;
 | 
			
		||||
pub const MODE_DIR: u16 = 0x4000;
 | 
			
		||||
pub const MODE_FILE: u16 = 0x8000;
 | 
			
		||||
pub const MODE_ALL: u16 = MODE_DIR | MODE_FILE;
 | 
			
		||||
 | 
			
		||||
pub const MODE_PERM: u16 = 0x0FFF;
 | 
			
		||||
pub const MODE_SETUID: u16 = 0o4000;
 | 
			
		||||
pub const MODE_SETGID: u16 = 0o2000;
 | 
			
		||||
 | 
			
		||||
pub const SEEK_SET: usize = 0;
 | 
			
		||||
pub const SEEK_CUR: usize = 1;
 | 
			
		||||
pub const SEEK_END: usize = 2;
 | 
			
		||||
 | 
			
		||||
pub const O_RDONLY: usize = 0;
 | 
			
		||||
pub const O_WRONLY: usize = 1;
 | 
			
		||||
pub const O_RDWR: usize = 2;
 | 
			
		||||
pub const O_NONBLOCK: usize = 4;
 | 
			
		||||
pub const O_APPEND: usize = 8;
 | 
			
		||||
pub const O_SHLOCK: usize = 0x10;
 | 
			
		||||
pub const O_EXLOCK: usize = 0x20;
 | 
			
		||||
pub const O_ASYNC: usize = 0x40;
 | 
			
		||||
pub const O_FSYNC: usize = 0x80;
 | 
			
		||||
pub const O_CREAT: usize = 0x200;
 | 
			
		||||
pub const O_TRUNC: usize = 0x400;
 | 
			
		||||
pub const O_EXCL: usize = 0x800;
 | 
			
		||||
pub const O_RDONLY: usize =     0x0000_0000;
 | 
			
		||||
pub const O_WRONLY: usize =     0x0001_0000;
 | 
			
		||||
pub const O_RDWR: usize =       0x0002_0000;
 | 
			
		||||
pub const O_NONBLOCK: usize =   0x0004_0000;
 | 
			
		||||
pub const O_APPEND: usize =     0x0008_0000;
 | 
			
		||||
pub const O_SHLOCK: usize =     0x0010_0000;
 | 
			
		||||
pub const O_EXLOCK: usize =     0x0020_0000;
 | 
			
		||||
pub const O_ASYNC: usize =      0x0040_0000;
 | 
			
		||||
pub const O_FSYNC: usize =      0x0080_0000;
 | 
			
		||||
pub const O_CLOEXEC: usize =    0x0100_0000;
 | 
			
		||||
pub const O_CREAT: usize =      0x0200_0000;
 | 
			
		||||
pub const O_TRUNC: usize =      0x0400_0000;
 | 
			
		||||
pub const O_EXCL: usize =       0x0800_0000;
 | 
			
		||||
 | 
			
		||||
pub const WNOHANG: usize = 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,8 +112,8 @@ pub fn lseek(fd: usize, offset: isize, whence: usize) -> Result<usize> {
 | 
			
		|||
    unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn mkdir(path: &str, mode: usize) -> Result<usize> {
 | 
			
		||||
    unsafe { syscall3(SYS_MKDIR, path.as_ptr() as usize, path.len(), mode) }
 | 
			
		||||
pub fn mkdir(path: &str, mode: u16) -> Result<usize> {
 | 
			
		||||
    unsafe { syscall3(SYS_MKDIR, path.as_ptr() as usize, path.len(), mode as usize) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,10 +5,10 @@ use super::*;
 | 
			
		|||
pub trait Scheme {
 | 
			
		||||
    fn handle(&self, packet: &mut Packet) {
 | 
			
		||||
        packet.a = Error::mux(match packet.a {
 | 
			
		||||
            SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d),
 | 
			
		||||
            SYS_MKDIR => self.mkdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d),
 | 
			
		||||
            SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }),
 | 
			
		||||
            SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }),
 | 
			
		||||
            SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid),
 | 
			
		||||
            SYS_MKDIR => self.mkdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
 | 
			
		||||
            SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
 | 
			
		||||
            SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
 | 
			
		||||
 | 
			
		||||
            SYS_DUP => self.dup(packet.b),
 | 
			
		||||
            SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
 | 
			
		||||
| 
						 | 
				
			
			@ -28,22 +28,22 @@ pub trait Scheme {
 | 
			
		|||
    /* Scheme operations */
 | 
			
		||||
 | 
			
		||||
    #[allow(unused_variables)]
 | 
			
		||||
    fn open(&self, path: &[u8], flags: usize) -> Result<usize> {
 | 
			
		||||
    fn open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize> {
 | 
			
		||||
        Err(Error::new(ENOENT))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[allow(unused_variables)]
 | 
			
		||||
    fn mkdir(&self, path: &[u8], mode: usize) -> Result<usize> {
 | 
			
		||||
    fn mkdir(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize> {
 | 
			
		||||
        Err(Error::new(ENOENT))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[allow(unused_variables)]
 | 
			
		||||
    fn rmdir(&self, path: &[u8]) -> Result<usize> {
 | 
			
		||||
    fn rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
 | 
			
		||||
        Err(Error::new(ENOENT))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[allow(unused_variables)]
 | 
			
		||||
    fn unlink(&self, path: &[u8]) -> Result<usize> {
 | 
			
		||||
    fn unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
 | 
			
		||||
        Err(Error::new(ENOENT))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue