diff options
Diffstat (limited to 'vendor/rustix/examples/hello.rs')
-rw-r--r-- | vendor/rustix/examples/hello.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/vendor/rustix/examples/hello.rs b/vendor/rustix/examples/hello.rs new file mode 100644 index 000000000..16ce69bd6 --- /dev/null +++ b/vendor/rustix/examples/hello.rs @@ -0,0 +1,43 @@ +//! Hello world, via plain syscalls. + +#[cfg(all(feature = "std", not(windows)))] +fn main() -> std::io::Result<()> { + // The message to print. It includes an explicit newline because we're + // not using `println!`, so we have to include the newline manually. + let message = "Hello, world!\n"; + + // The bytes to print. The `write` syscall operates on byte buffers and + // returns a byte offset if it writes fewer bytes than requested, so we + // need the ability to compute substrings at arbitrary byte offsets. + let mut bytes = message.as_bytes(); + + // Safety: See [here] for the safety conditions for calling `stdout`. In + // this example, the code is inside `main` itself so we know how `stdout` + // is being used and we know that it's not dropped. + // + // [here]: https://docs.rs/rustix/*/rustix/io/fn.stdout.html#safety + let stdout = unsafe { rustix::io::stdout() }; + + while !bytes.is_empty() { + match rustix::io::write(&stdout, bytes) { + // `write` can write fewer bytes than requested. In that case, + // continue writing with the remainder of the bytes. + Ok(n) => bytes = &bytes[n..], + + // `write` can be interrupted before doing any work; if that + // happens, retry it. + Err(rustix::io::Errno::INTR) => (), + + // `write` can also fail for external reasons, such as running out + // of storage space. + Err(e) => return Err(e.into()), + } + } + + Ok(()) +} + +#[cfg(any(not(feature = "std"), windows))] +fn main() { + unimplemented!() +} |