| //! Functions returning the stdio file descriptors. |
| //! |
| //! # Safety |
| //! |
| //! These access the file descriptors by absolute index value, and nothing |
| //! prevents them from being closed and reused. They should only be used in |
| //! `main` or other situations where one is in control of the process' |
| //! stdio streams. |
| #![allow(unsafe_code)] |
| |
| use crate::backend; |
| use crate::fd::OwnedFd; |
| use backend::fd::{BorrowedFd, FromRawFd, RawFd}; |
| |
| /// `STDIN_FILENO`—Standard input, borrowed. |
| /// |
| /// # Safety |
| /// |
| /// This function must be called from code which knows how the process' |
| /// standard input is being used. Often, this will be the `main` function or |
| /// code that knows its relationship with the `main` function. |
| /// |
| /// The stdin file descriptor can be closed, potentially on other threads, in |
| /// which case the file descriptor index value could be dynamically reused for |
| /// other purposes, potentially on different threads. |
| /// |
| /// # Other hazards |
| /// |
| /// Stdin could be redirected from arbitrary input sources, and unless one |
| /// knows how the process' standard input is being used, one could consume |
| /// bytes that are expected to be consumed by other parts of the process. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdin.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdin.3.html |
| #[doc(alias = "STDIN_FILENO")] |
| #[inline] |
| pub const unsafe fn stdin() -> BorrowedFd<'static> { |
| BorrowedFd::borrow_raw(backend::io::types::STDIN_FILENO as RawFd) |
| } |
| |
| /// `STDIN_FILENO`—Standard input, owned. |
| /// |
| /// This is similar to [`stdin`], however it returns an `OwnedFd` which closes |
| /// standard input when it is dropped. |
| /// |
| /// # Safety |
| /// |
| /// This is unsafe for the same reasons as [`stdin`]. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stdin`]. |
| /// |
| /// And, when the `OwnedFd` is dropped, subsequent newly created file |
| /// descriptors may unknowingly reuse the stdin file descriptor number, which |
| /// may break common assumptions, so it should typically only be dropped at the |
| /// end of a program when no more file descriptors will be created. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdin.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdin.3.html |
| #[doc(alias = "STDIN_FILENO")] |
| #[inline] |
| pub unsafe fn take_stdin() -> OwnedFd { |
| backend::fd::OwnedFd::from_raw_fd(backend::io::types::STDIN_FILENO as RawFd) |
| } |
| |
| /// `STDOUT_FILENO`—Standard output, borrowed. |
| /// |
| /// # Safety |
| /// |
| /// This function must be called from code which knows how the process' |
| /// standard output is being used. Often, this will be the `main` function or |
| /// code that knows its relationship with the `main` function. |
| /// |
| /// The stdout file descriptor can be closed, potentially on other threads, in |
| /// which case the file descriptor index value could be dynamically reused for |
| /// other purposes, potentially on different threads. |
| /// |
| /// # Other hazards |
| /// |
| /// Stdout could be redirected to arbitrary output sinks, and unless one |
| /// knows how the process' standard output is being used, one could |
| /// unexpectedly inject bytes into a stream being written by another part of |
| /// the process. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdout.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdout.3.html |
| #[doc(alias = "STDOUT_FILENO")] |
| #[inline] |
| pub const unsafe fn stdout() -> BorrowedFd<'static> { |
| BorrowedFd::borrow_raw(backend::io::types::STDOUT_FILENO as RawFd) |
| } |
| |
| /// `STDOUT_FILENO`—Standard output, owned. |
| /// |
| /// This is similar to [`stdout`], however it returns an `OwnedFd` which closes |
| /// standard output when it is dropped. |
| /// |
| /// # Safety |
| /// |
| /// This is unsafe for the same reasons as [`stdout`]. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stdout`]. |
| /// |
| /// And, when the `OwnedFd` is dropped, subsequent newly created file |
| /// descriptors may unknowingly reuse the stdout file descriptor number, which |
| /// may break common assumptions, so it should typically only be dropped at the |
| /// end of a program when no more file descriptors will be created. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdout.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdout.3.html |
| #[doc(alias = "STDOUT_FILENO")] |
| #[inline] |
| pub unsafe fn take_stdout() -> OwnedFd { |
| backend::fd::OwnedFd::from_raw_fd(backend::io::types::STDOUT_FILENO as RawFd) |
| } |
| |
| /// `STDERR_FILENO`—Standard error, borrowed. |
| /// |
| /// # Safety |
| /// |
| /// This function must be called from code which knows how the process' |
| /// standard error is being used. Often, this will be the `main` function or |
| /// code that knows its relationship with the `main` function. |
| /// |
| /// The stderr file descriptor can be closed, potentially on other threads, in |
| /// which case the file descriptor index value could be dynamically reused for |
| /// other purposes, potentially on different threads. |
| /// |
| /// # Other hazards |
| /// |
| /// Stderr could be redirected to arbitrary output sinks, and unless one |
| /// knows how the process' standard error is being used, one could unexpectedly |
| /// inject bytes into a stream being written by another part of the process. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stderr.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stderr.3.html |
| #[doc(alias = "STDERR_FILENO")] |
| #[inline] |
| pub const unsafe fn stderr() -> BorrowedFd<'static> { |
| BorrowedFd::borrow_raw(backend::io::types::STDERR_FILENO as RawFd) |
| } |
| |
| /// `STDERR_FILENO`—Standard error, owned. |
| /// |
| /// This is similar to [`stdout`], however it returns an `OwnedFd` which closes |
| /// standard output when it is dropped. |
| /// |
| /// # Safety |
| /// |
| /// This is unsafe for the same reasons as [`stderr`]. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stderr`]. |
| /// |
| /// And, when the `OwnedFd` is dropped, subsequent newly created file |
| /// descriptors may unknowingly reuse the stderr file descriptor number, which |
| /// may break common assumptions, so it should typically only be dropped at the |
| /// end of a program when no more file descriptors will be created. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stderr.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stderr.3.html |
| #[doc(alias = "STDERR_FILENO")] |
| #[inline] |
| pub unsafe fn take_stderr() -> OwnedFd { |
| backend::fd::OwnedFd::from_raw_fd(backend::io::types::STDERR_FILENO as RawFd) |
| } |
| |
| /// `STDIN_FILENO`—Standard input, raw. |
| /// |
| /// This is similar to [`stdin`], however it returns a `RawFd`. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stdin`]. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdin.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdin.3.html |
| #[doc(alias = "STDIN_FILENO")] |
| #[inline] |
| pub const fn raw_stdin() -> RawFd { |
| backend::io::types::STDIN_FILENO as RawFd |
| } |
| |
| /// `STDOUT_FILENO`—Standard output, raw. |
| /// |
| /// This is similar to [`stdout`], however it returns a `RawFd`. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stdout`]. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdout.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stdout.3.html |
| #[doc(alias = "STDOUT_FILENO")] |
| #[inline] |
| pub const fn raw_stdout() -> RawFd { |
| backend::io::types::STDOUT_FILENO as RawFd |
| } |
| |
| /// `STDERR_FILENO`—Standard error, raw. |
| /// |
| /// This is similar to [`stderr`], however it returns a `RawFd`. |
| /// |
| /// # Other hazards |
| /// |
| /// This has the same hazards as [`stderr`]. |
| /// |
| /// # References |
| /// - [POSIX] |
| /// - [Linux] |
| /// |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/stderr.html |
| /// [Linux]: https://man7.org/linux/man-pages/man3/stderr.3.html |
| #[doc(alias = "STDERR_FILENO")] |
| #[inline] |
| pub const fn raw_stderr() -> RawFd { |
| backend::io::types::STDERR_FILENO as RawFd |
| } |