mkdir and rmdir
This commit is contained in:
		
							parent
							
								
									a68d5a5237
								
							
						
					
					
						commit
						14d3798a48
					
				
					 2 changed files with 46 additions and 0 deletions
				
			
		|  | @ -62,6 +62,50 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> { | ||||||
|     }).ok_or(Error::new(EMFILE)) |     }).ok_or(Error::new(EMFILE)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// mkdir syscall
 | ||||||
|  | pub fn mkdir(path: &[u8], mode: usize) -> Result<usize> { | ||||||
|  |     let path_canon = { | ||||||
|  |         let contexts = context::contexts(); | ||||||
|  |         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; | ||||||
|  |         let context = context_lock.read(); | ||||||
|  |         context.canonicalize(path) | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let mut parts = path_canon.splitn(2, |&b| b == b':'); | ||||||
|  |     let namespace_opt = parts.next(); | ||||||
|  |     let reference_opt = parts.next(); | ||||||
|  | 
 | ||||||
|  |     let namespace = namespace_opt.ok_or(Error::new(ENOENT))?; | ||||||
|  |     let scheme = { | ||||||
|  |         let schemes = scheme::schemes(); | ||||||
|  |         let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?; | ||||||
|  |         scheme.clone() | ||||||
|  |     }; | ||||||
|  |     scheme.mkdir(reference_opt.unwrap_or(b""), mode) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// rmdir syscall
 | ||||||
|  | pub fn rmdir(path: &[u8]) -> Result<usize> { | ||||||
|  |     let path_canon = { | ||||||
|  |         let contexts = context::contexts(); | ||||||
|  |         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; | ||||||
|  |         let context = context_lock.read(); | ||||||
|  |         context.canonicalize(path) | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let mut parts = path_canon.splitn(2, |&b| b == b':'); | ||||||
|  |     let namespace_opt = parts.next(); | ||||||
|  |     let reference_opt = parts.next(); | ||||||
|  | 
 | ||||||
|  |     let namespace = namespace_opt.ok_or(Error::new(ENOENT))?; | ||||||
|  |     let scheme = { | ||||||
|  |         let schemes = scheme::schemes(); | ||||||
|  |         let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?; | ||||||
|  |         scheme.clone() | ||||||
|  |     }; | ||||||
|  |     scheme.rmdir(reference_opt.unwrap_or(b"")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /// Unlink syscall
 | /// Unlink syscall
 | ||||||
| pub fn unlink(path: &[u8]) -> Result<usize> { | pub fn unlink(path: &[u8]) -> Result<usize> { | ||||||
|     let path_canon = { |     let path_canon = { | ||||||
|  |  | ||||||
|  | @ -38,6 +38,8 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize | ||||||
|             SYS_LSEEK => lseek(b, c, d), |             SYS_LSEEK => lseek(b, c, d), | ||||||
|             SYS_GETPID => getpid(), |             SYS_GETPID => getpid(), | ||||||
|             SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]), |             SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]), | ||||||
|  |             SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d), | ||||||
|  |             SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?), | ||||||
|             SYS_DUP => dup(b), |             SYS_DUP => dup(b), | ||||||
|             SYS_BRK => brk(b), |             SYS_BRK => brk(b), | ||||||
|             SYS_FTRUNCATE => ftruncate(b, c), |             SYS_FTRUNCATE => ftruncate(b, c), | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jeremy Soller
						Jeremy Soller