Skip to content

Commit 4547b30

Browse files
committed
Replace TryFrom<Owned*> with From
Signed-off-by: Jiahao XU <[email protected]>
1 parent 62b846e commit 4547b30

File tree

4 files changed

+28
-199
lines changed

4 files changed

+28
-199
lines changed

library/std/src/sys/anonymous_pipe/tests.rs

-99
Original file line numberDiff line numberDiff line change
@@ -27,102 +27,3 @@ fn pipe_try_clone_and_rw() {
2727
rx.read_to_string(&mut s).unwrap();
2828
assert_eq!(s, "45");
2929
}
30-
31-
#[cfg(unix)]
32-
mod unix_specific {
33-
use super::*;
34-
35-
use crate::{
36-
fs::File,
37-
io,
38-
os::fd::{AsRawFd, OwnedFd},
39-
};
40-
41-
#[test]
42-
fn pipe_owned_fd_round_trip_conversion() {
43-
let (rx, tx) = pipe().unwrap();
44-
let raw_fds = (rx.as_raw_fd(), tx.as_raw_fd());
45-
let (rx_owned_fd, tx_owned_fd) = (OwnedFd::from(rx), OwnedFd::from(tx));
46-
47-
let rx = PipeReader::try_from(rx_owned_fd).unwrap();
48-
let tx = PipeWriter::try_from(tx_owned_fd).unwrap();
49-
assert_eq!(raw_fds, (rx.as_raw_fd(), tx.as_raw_fd()));
50-
}
51-
52-
#[test]
53-
fn convert_from_non_pipe_to_pipe_reader_shall_fail() {
54-
let file = File::open("/dev/zero").unwrap();
55-
let err = PipeReader::try_from(OwnedFd::from(file)).unwrap_err();
56-
57-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
58-
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
59-
}
60-
61-
#[test]
62-
fn convert_from_non_pipe_to_pipe_writer_shall_fail() {
63-
let file = File::options().write(true).open("/dev/null").unwrap();
64-
let err = PipeWriter::try_from(OwnedFd::from(file)).unwrap_err();
65-
66-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
67-
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
68-
}
69-
70-
#[test]
71-
fn convert_pipe_writer_to_pipe_reader_shall_fail() {
72-
let (_, tx) = pipe().unwrap();
73-
let fd = tx.as_raw_fd();
74-
let err = PipeReader::try_from(OwnedFd::from(tx)).unwrap_err();
75-
76-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
77-
assert_eq!(format!("{}", err.get_ref().unwrap()), format!("Pipe {fd} is not readable"));
78-
}
79-
80-
#[test]
81-
fn convert_pipe_reader_to_pipe_writer_shall_fail() {
82-
let (rx, _) = pipe().unwrap();
83-
let fd = rx.as_raw_fd();
84-
let err = PipeWriter::try_from(OwnedFd::from(rx)).unwrap_err();
85-
86-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
87-
assert_eq!(format!("{}", err.get_ref().unwrap()), format!("Pipe {fd} is not writable"));
88-
}
89-
}
90-
91-
#[cfg(windows)]
92-
mod windows_specific {
93-
use super::*;
94-
95-
use crate::{
96-
io,
97-
os::windows::io::{AsHandle, AsRawHandle, OwnedHandle},
98-
};
99-
100-
#[test]
101-
fn pipe_owned_handle_round_trip_conversion() {
102-
let (rx, tx) = pipe().unwrap();
103-
let raw_handles = (rx.as_raw_handle(), tx.as_raw_handle());
104-
let (rx_owned_handle, tx_owned_handle) = (OwnedHandle::from(rx), OwnedHandle::from(tx));
105-
106-
let rx = PipeReader::try_from(rx_owned_handle).unwrap();
107-
let tx = PipeWriter::try_from(tx_owned_handle).unwrap();
108-
assert_eq!(raw_handles, (rx.as_raw_handle(), tx.as_raw_handle()));
109-
}
110-
111-
#[test]
112-
fn convert_from_non_pipe_to_pipe_reader_shall_fail() {
113-
let file = io::stdin().as_handle().try_clone_to_owned().unwrap();
114-
let err = PipeReader::try_from(OwnedHandle::from(file)).unwrap_err();
115-
116-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
117-
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
118-
}
119-
120-
#[test]
121-
fn convert_from_non_pipe_to_pipe_writer_shall_fail() {
122-
let file = io::stdout().as_handle().try_clone_to_owned().unwrap();
123-
let err = PipeWriter::try_from(OwnedHandle::from(file)).unwrap_err();
124-
125-
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
126-
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
127-
}
128-
}

library/std/src/sys/anonymous_pipe/unix.rs

+9-44
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
use super::*;
22

33
use crate::{
4-
fs::File,
5-
os::{
6-
fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd},
7-
unix::fs::FileTypeExt,
8-
},
4+
os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd},
95
sys::{
106
fd::FileDesc,
117
pipe::{anon_pipe, AnonPipe},
@@ -92,51 +88,20 @@ impl From<PipeWriter> for Stdio {
9288
}
9389
}
9490

95-
fn convert_to_pipe(owned_fd: OwnedFd) -> io::Result<AnonPipe> {
96-
let file = File::from(owned_fd);
97-
if file.metadata()?.file_type().is_fifo() {
98-
Ok(AnonPipe::from_inner(FileDesc::from_inner(OwnedFd::from(file))))
99-
} else {
100-
Err(io::Error::new(io::ErrorKind::InvalidInput, "Not a pipe"))
101-
}
91+
fn convert_to_pipe(owned_fd: OwnedFd) -> AnonPipe {
92+
AnonPipe::from_inner(FileDesc::from_inner(OwnedFd::from(owned_fd)))
10293
}
10394

10495
#[unstable(feature = "anonymous_pipe", issue = "127154")]
105-
impl TryFrom<OwnedFd> for PipeReader {
106-
type Error = io::Error;
107-
108-
fn try_from(owned_fd: OwnedFd) -> Result<Self, Self::Error> {
109-
convert_to_pipe(owned_fd)
110-
.and_then(|pipe| {
111-
if pipe.as_file_desc().get_access_mode()?.is_readable() {
112-
Ok(pipe)
113-
} else {
114-
Err(io::Error::new(
115-
io::ErrorKind::InvalidInput,
116-
format!("Pipe {} is not readable", pipe.as_raw_fd()),
117-
))
118-
}
119-
})
120-
.map(Self)
96+
impl From<OwnedFd> for PipeReader {
97+
fn from(owned_fd: OwnedFd) -> Self {
98+
Self(convert_to_pipe(owned_fd))
12199
}
122100
}
123101

124102
#[unstable(feature = "anonymous_pipe", issue = "127154")]
125-
impl TryFrom<OwnedFd> for PipeWriter {
126-
type Error = io::Error;
127-
128-
fn try_from(owned_fd: OwnedFd) -> Result<Self, Self::Error> {
129-
convert_to_pipe(owned_fd)
130-
.and_then(|pipe| {
131-
if pipe.as_file_desc().get_access_mode()?.is_writable() {
132-
Ok(pipe)
133-
} else {
134-
Err(io::Error::new(
135-
io::ErrorKind::InvalidInput,
136-
format!("Pipe {} is not writable", pipe.as_raw_fd()),
137-
))
138-
}
139-
})
140-
.map(Self)
103+
impl From<OwnedFd> for PipeWriter {
104+
fn from(owned_fd: OwnedFd) -> Self {
105+
Self(convert_to_pipe(owned_fd))
141106
}
142107
}

library/std/src/sys/anonymous_pipe/windows.rs

+8-17
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::{
55
AsHandle, AsRawHandle, BorrowedHandle, FromRawHandle, IntoRawHandle, OwnedHandle, RawHandle,
66
},
77
sys::{
8-
c::{GetFileType, FILE_TYPE_PIPE},
98
handle::Handle,
109
pipe::{anon_pipe, AnonPipe, Pipes},
1110
},
@@ -95,28 +94,20 @@ impl From<PipeWriter> for Stdio {
9594
}
9695
}
9796

98-
fn convert_to_pipe(owned_handle: OwnedHandle) -> io::Result<AnonPipe> {
99-
if unsafe { GetFileType(owned_handle.as_raw_handle()) } == FILE_TYPE_PIPE {
100-
Ok(AnonPipe::from_inner(Handle::from_inner(owned_handle)))
101-
} else {
102-
Err(io::Error::new(io::ErrorKind::InvalidInput, "Not a pipe"))
103-
}
97+
fn convert_to_pipe(owned_handle: OwnedHandle) -> AnonPipe {
98+
AnonPipe::from_inner(Handle::from_inner(owned_handle))
10499
}
105100

106101
#[unstable(feature = "anonymous_pipe", issue = "127154")]
107-
impl TryFrom<OwnedHandle> for PipeReader {
108-
type Error = io::Error;
109-
110-
fn try_from(owned_handle: OwnedHandle) -> Result<Self, Self::Error> {
111-
convert_to_pipe(owned_handle).map(Self)
102+
impl From<OwnedHandle> for PipeReader {
103+
fn from(owned_handle: OwnedHandle) -> Self {
104+
Self(convert_to_pipe(owned_handle))
112105
}
113106
}
114107

115108
#[unstable(feature = "anonymous_pipe", issue = "127154")]
116-
impl TryFrom<OwnedHandle> for PipeWriter {
117-
type Error = io::Error;
118-
119-
fn try_from(owned_handle: OwnedHandle) -> Result<Self, Self::Error> {
120-
convert_to_pipe(owned_handle).map(Self)
109+
impl From<OwnedHandle> for PipeWriter {
110+
fn from(owned_handle: OwnedHandle) -> Self {
111+
Self(convert_to_pipe(owned_handle))
121112
}
122113
}

library/std/src/sys/pal/unix/fd.rs

+11-39
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,6 @@ use libc::off64_t;
2626
)))]
2727
use libc::off_t as off64_t;
2828

29-
#[derive(Copy, Clone)]
30-
pub enum AccessMode {
31-
ReadOnly,
32-
WriteOnly,
33-
ReadWrite,
34-
None,
35-
}
36-
37-
impl AccessMode {
38-
pub fn is_readable(self) -> bool {
39-
matches!(self, AccessMode::ReadOnly | AccessMode::ReadWrite)
40-
}
41-
42-
pub fn is_writable(self) -> bool {
43-
matches!(self, AccessMode::WriteOnly | AccessMode::ReadWrite)
44-
}
45-
}
46-
4729
#[derive(Debug)]
4830
pub struct FileDesc(OwnedFd);
4931

@@ -536,30 +518,20 @@ impl FileDesc {
536518
}
537519
}
538520

539-
fn get_flags(&self) -> io::Result<libc::c_int> {
540-
unsafe { cvt(libc::fcntl(self.as_raw_fd(), libc::F_GETFL)) }
541-
}
542-
543-
pub fn get_access_mode(&self) -> io::Result<AccessMode> {
544-
let access_mode = self.get_flags()? & libc::O_ACCMODE;
545-
Ok(match access_mode {
546-
libc::O_RDWR => AccessMode::ReadWrite,
547-
libc::O_RDONLY => AccessMode::ReadOnly,
548-
libc::O_WRONLY => AccessMode::WriteOnly,
549-
550-
_ => AccessMode::None,
551-
})
552-
}
553-
554521
#[cfg(not(target_os = "linux"))]
555522
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
556-
let previous = self.get_flags()?;
557-
let new =
558-
if nonblocking { previous | libc::O_NONBLOCK } else { previous & !libc::O_NONBLOCK };
559-
if new != previous {
560-
unsafe { cvt(libc::fcntl(self.as_raw_fd(), libc::F_SETFL, new)) }?;
523+
unsafe {
524+
let previous = cvt(libc::fcntl(self.as_raw_fd(), libc::F_GETFL))?;
525+
let new = if nonblocking {
526+
previous | libc::O_NONBLOCK
527+
} else {
528+
previous & !libc::O_NONBLOCK
529+
};
530+
if new != previous {
531+
cvt(libc::fcntl(self.as_raw_fd(), libc::F_SETFL, new))?;
532+
}
533+
Ok(())
561534
}
562-
Ok(())
563535
}
564536

565537
#[inline]

0 commit comments

Comments
 (0)