@@ -42,13 +42,17 @@ fn cvt(ret: c_int) -> io::Result<c_int> {
42
42
}
43
43
}
44
44
45
- fn set_blocking ( fd : RawFd ) -> io:: Result < ( ) > {
45
+ fn set_blocking_inner ( fd : RawFd ) -> io:: Result < ( ) > {
46
46
let flags = cvt ( unsafe { fcntl ( fd, F_GETFL ) } ) ?;
47
47
cvt ( unsafe { fcntl ( fd, F_SETFL , flags & ( !O_NONBLOCK ) ) } ) ?;
48
48
49
49
Ok ( ( ) )
50
50
}
51
51
52
+ fn set_blocking ( fd : RawFd ) -> Result < ( ) , Error > {
53
+ set_blocking_inner ( fd) . map_err ( Error :: ChildIo )
54
+ }
55
+
52
56
impl Fd {
53
57
pub ( crate ) fn as_raw_fd_or_null_fd ( & self ) -> Result < RawFd , Error > {
54
58
use Fd :: * ;
@@ -66,12 +70,7 @@ impl Fd {
66
70
/// the ownershipt of it.
67
71
unsafe fn new_owned < T : IntoRawFd > ( fd : T ) -> Result < Self , Error > {
68
72
let raw_fd = fd. into_raw_fd ( ) ;
69
- // Create owned_fd so that the fd will be closed on error
70
- let owned_fd = OwnedFd :: from_raw_fd ( raw_fd) ;
71
-
72
- set_blocking ( raw_fd) . map_err ( Error :: ChildIo ) ?;
73
-
74
- Ok ( Fd :: Owned ( owned_fd) )
73
+ Ok ( Fd :: Owned ( OwnedFd :: from_raw_fd ( raw_fd) ) )
75
74
}
76
75
}
77
76
@@ -106,12 +105,16 @@ impl Stdio {
106
105
StdioImpl :: Null => Ok ( ( Fd :: Null , None ) ) ,
107
106
StdioImpl :: Pipe => {
108
107
let ( read, write) = create_pipe ( ) ?;
108
+
109
+ // read end will be sent to ssh multiplex server
110
+ // and it expects blocking fd.
111
+ set_blocking ( read. as_raw_fd ( ) ) ?;
109
112
Ok ( ( read. try_into ( ) ?, Some ( write) ) )
110
113
}
111
114
StdioImpl :: Fd ( fd, owned) => {
112
115
let raw_fd = fd. as_raw_fd ( ) ;
113
116
if * owned {
114
- set_blocking ( raw_fd) . map_err ( Error :: ChildIo ) ?;
117
+ set_blocking ( raw_fd) ?;
115
118
}
116
119
Ok ( ( Fd :: Borrowed ( raw_fd) , None ) )
117
120
}
@@ -124,12 +127,16 @@ impl Stdio {
124
127
StdioImpl :: Null => Ok ( ( Fd :: Null , None ) ) ,
125
128
StdioImpl :: Pipe => {
126
129
let ( read, write) = create_pipe ( ) ?;
130
+
131
+ // write end will be sent to ssh multiplex server
132
+ // and it expects blocking fd.
133
+ set_blocking ( write. as_raw_fd ( ) ) ?;
127
134
Ok ( ( write. try_into ( ) ?, Some ( read) ) )
128
135
}
129
136
StdioImpl :: Fd ( fd, owned) => {
130
137
let raw_fd = fd. as_raw_fd ( ) ;
131
138
if * owned {
132
- set_blocking ( raw_fd) . map_err ( Error :: ChildIo ) ?;
139
+ set_blocking ( raw_fd) ?;
133
140
}
134
141
Ok ( ( Fd :: Borrowed ( raw_fd) , None ) )
135
142
}
0 commit comments