Nothing to see here, move along
at main 79 lines 2.1 kB view raw
1#![no_std] 2#![no_main] 3 4use lancer_user::fs::{self, FsRights}; 5use lancer_user::net; 6use lancer_user::println; 7use lancer_user::syscall; 8 9#[unsafe(no_mangle)] 10pub extern "C" fn lancer_main() -> ! { 11 let (rx, _tx) = match net::init() { 12 Some(pair) => pair, 13 None => { 14 lancer_user::show!(net, error, "netsock init failed"); 15 syscall::exit(); 16 } 17 }; 18 19 let mut args_buf = [0u8; 4096]; 20 let args_len = net::recv_args(&rx, &mut args_buf); 21 let args = &args_buf[..args_len]; 22 23 let (_cmd, rest) = net::next_token(args); 24 let (path_tok, text_rest) = net::next_token(rest); 25 26 if path_tok.is_empty() { 27 println!("usage: write <path> <text>"); 28 syscall::exit(); 29 } 30 31 let text = net::skip_spaces(text_rest); 32 33 let mut client = unsafe { fs::init() }; 34 35 let (parent, basename) = match fs::open_parent(&mut client, 0, path_tok) { 36 Ok(pair) => pair, 37 Err(e) => { 38 println!("write: {}", e.name()); 39 syscall::exit(); 40 } 41 }; 42 43 let mode = FsRights::from_raw(FsRights::WRITE.raw() | FsRights::CREATE.raw()); 44 let handle = match client.open(parent, basename, mode) { 45 Ok(h) => h, 46 Err(e) => { 47 println!("write: open: {}", e.name()); 48 let _ = client.close(parent); 49 syscall::exit(); 50 } 51 }; 52 53 match client.truncate(handle, 0) { 54 Ok(()) => {} 55 Err(e) => { 56 println!("write: truncate: {}", e.name()); 57 let _ = client.close(handle); 58 let _ = client.close(parent); 59 syscall::exit(); 60 } 61 } 62 63 match text.is_empty() { 64 true => {} 65 false => match client.write(handle, 0, text) { 66 Ok(n) if n < text.len() => { 67 println!("write: partial write ({}/{} bytes)", n, text.len()); 68 } 69 Ok(_) => {} 70 Err(e) => { 71 println!("write: {}", e.name()); 72 } 73 }, 74 } 75 76 let _ = client.close(handle); 77 let _ = client.close(parent); 78 syscall::exit() 79}