Nothing to see here, move along
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}