• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Hello world, via plain syscalls.
2 
3 #[cfg(all(feature = "std", not(windows)))]
main() -> std::io::Result<()>4 fn main() -> std::io::Result<()> {
5     // The message to print. It includes an explicit newline because we're
6     // not using `println!`, so we have to include the newline manually.
7     let message = "Hello, world!\n";
8 
9     // The bytes to print. The `write` syscall operates on byte buffers and
10     // returns a byte offset if it writes fewer bytes than requested, so we
11     // need the ability to compute substrings at arbitrary byte offsets.
12     let mut bytes = message.as_bytes();
13 
14     // Safety: See [here] for the safety conditions for calling `stdout`. In
15     // this example, the code is inside `main` itself so we know how `stdout`
16     // is being used and we know that it's not dropped.
17     //
18     // [here]: https://docs.rs/rustix/*/rustix/io/fn.stdout.html#safety
19     let stdout = unsafe { rustix::io::stdout() };
20 
21     while !bytes.is_empty() {
22         match rustix::io::write(&stdout, bytes) {
23             // `write` can write fewer bytes than requested. In that case,
24             // continue writing with the remainder of the bytes.
25             Ok(n) => bytes = &bytes[n..],
26 
27             // `write` can be interrupted before doing any work; if that
28             // happens, retry it.
29             Err(rustix::io::Errno::INTR) => (),
30 
31             // `write` can also fail for external reasons, such as running out
32             // of storage space.
33             Err(err) => return Err(err.into()),
34         }
35     }
36 
37     Ok(())
38 }
39 
40 #[cfg(any(not(feature = "std"), windows))]
main()41 fn main() {
42     unimplemented!()
43 }
44