#![no_std] #![no_main] use lancer_user::fs; use lancer_user::net; use lancer_user::println; use lancer_user::syscall; const INODE_TYPE_DIR: u8 = 1; #[unsafe(no_mangle)] pub extern "C" fn lancer_main() -> ! { let (rx, _tx) = match net::init() { Some(pair) => pair, None => syscall::exit(), }; let mut args_buf = [0u8; 256]; let args_len = net::recv_args(&rx, &mut args_buf); let args = &args_buf[..args_len]; let (_cmd, rest) = net::next_token(args); let (path_tok, _) = net::next_token(rest); if path_tok.is_empty() { syscall::exit(); } let mut client = unsafe { fs::init() }; match fs::open_path(&mut client, 0, path_tok) { Ok(handle) => match client.stat(handle) { Ok(st) if st.inode_type == INODE_TYPE_DIR => { let _ = client.close(handle); } Ok(_) => { let _ = client.close(handle); println!("cd: not a directory"); } Err(e) => { let _ = client.close(handle); println!("cd: {}", e.name()); } }, Err(e) => { println!("cd: {}", e.name()); } } syscall::exit() }