diff options
author | Alan Somers <asomers@gmail.com> | 2021-06-06 10:43:02 -0600 |
---|---|---|
committer | Alan Somers <asomers@gmail.com> | 2021-07-07 20:49:28 -0600 |
commit | 6511d02414ec9dd4bcaa237336c5f74869e6c41a (patch) | |
tree | 61e6cde2230efb026e9ac9c6a6e786cb6ba77642 /src/fcntl.rs | |
parent | f90033ed35af02f39d4eaf28eff85f226c10d91b (diff) | |
download | nix-6511d02414ec9dd4bcaa237336c5f74869e6c41a.zip |
Overhaul Nix's error types
For many of Nix's consumers it be convenient to easily convert a Nix
error into a std::io::Error. That's currently not possible because of
the InvalidPath, InvalidUtf8, and UnsupportedOperation types that have
no equivalent in std::io::Error.
However, very few of Nix's public APIs actually return those unusual
errors. So a more useful API would be for Nix's standard error type to
implement Into<std::io::Error>.
This commit makes Error a simple NewType around Errno. For most
functions it's a drop-in replacement. There are only three exceptions:
* clearenv now returns a bespoke error type. It was the only Nix
function whose error couldn't be cleanly mapped onto an Errno.
* sys::signal::signal now returns Error(Errno::ENOTSUP) instead of
Error::UnsupportedOperation when the user passes an incompatible
argument to `handler`.
* When a NixPath exceeds PATH_MAX, it will now return
Error(Errno::ENAMETOOLONG) instead of Error::InvalidPath.
In the latter two cases there is now some abiguity about whether the
error code was generated by Nix or by the OS. But I think the ambiguity
is worth it for the sake of being able to implement Into<io::Error>.
This commit also introduces Error::Sys() as a migration aid. Previously
that as an enum variant. Now it's a function, but it will work in many
of the same contexts as the original.
Fixes #1155
Diffstat (limited to 'src/fcntl.rs')
-rw-r--r-- | src/fcntl.rs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/fcntl.rs b/src/fcntl.rs index ce30b7d1..ec6db00a 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -288,7 +288,7 @@ fn inner_readlink<P: ?Sized + NixPath>(dirfd: Option<RawFd>, path: &P) -> Result Some(next_size) => try_size = next_size, // It's absurd that this would happen, but handle it sanely // anyway. - None => break Err(super::Error::Sys(Errno::ENAMETOOLONG)), + None => break Err(super::Error::from(Errno::ENAMETOOLONG)), } } } @@ -646,6 +646,6 @@ pub fn posix_fallocate(fd: RawFd, offset: libc::off_t, len: libc::off_t) -> Resu match Errno::result(res) { Err(err) => Err(err), Ok(0) => Ok(()), - Ok(errno) => Err(crate::Error::Sys(Errno::from_i32(errno))), + Ok(errno) => Err(crate::Error::from(Errno::from_i32(errno))), } } |