@@ -106,14 +106,17 @@ pub fn parse_sha256(string: impl AsRef<str>) -> Result<Sha256Digest> {
106
106
Ok ( value)
107
107
}
108
108
109
- pub ( crate ) fn filter_errno < T > (
110
- result : rustix:: io:: Result < T > ,
111
- ignored : Errno ,
112
- ) -> ErrnoResult < Option < T > > {
113
- match result {
114
- Ok ( result) => Ok ( Some ( result) ) ,
115
- Err ( err) if err == ignored => Ok ( None ) ,
116
- Err ( err) => Err ( err) ,
109
+ pub ( crate ) trait ErrnoFilter < T > {
110
+ fn filter_errno ( self , ignored : Errno ) -> ErrnoResult < Option < T > > ;
111
+ }
112
+
113
+ impl < T > ErrnoFilter < T > for ErrnoResult < T > {
114
+ fn filter_errno ( self , ignored : Errno ) -> ErrnoResult < Option < T > > {
115
+ match self {
116
+ Ok ( result) => Ok ( Some ( result) ) ,
117
+ Err ( err) if err == ignored => Ok ( None ) ,
118
+ Err ( err) => Err ( err) ,
119
+ }
117
120
}
118
121
}
119
122
@@ -135,12 +138,15 @@ pub(crate) fn replace_symlinkat(
135
138
let target = target. as_ref ( ) ;
136
139
137
140
// Step 1: try to create the symlink
138
- if filter_errno ( symlinkat ( target, dirfd, name) , Errno :: EXIST ) ?. is_some ( ) {
141
+ if symlinkat ( target, dirfd, name)
142
+ . filter_errno ( Errno :: EXIST ) ?
143
+ . is_some ( )
144
+ {
139
145
return Ok ( ( ) ) ;
140
146
} ;
141
147
142
148
// Step 2: the symlink already exists. Maybe it already has the correct target?
143
- if let Some ( current_target) = filter_errno ( readlinkat ( dirfd, name, [ ] ) , Errno :: NOENT ) ? {
149
+ if let Some ( current_target) = readlinkat ( dirfd, name, [ ] ) . filter_errno ( Errno :: NOENT ) ? {
144
150
if current_target. into_bytes ( ) == target. as_os_str ( ) . as_bytes ( ) {
145
151
return Ok ( ( ) ) ;
146
152
}
@@ -149,7 +155,10 @@ pub(crate) fn replace_symlinkat(
149
155
// Step 3: full atomic replace path
150
156
for _ in 0 ..16 {
151
157
let tmp_name = generate_tmpname ( ".symlink-" ) ;
152
- if filter_errno ( symlinkat ( target, dirfd, & tmp_name) , Errno :: EXIST ) ?. is_none ( ) {
158
+ if symlinkat ( target, dirfd, & tmp_name)
159
+ . filter_errno ( Errno :: EXIST ) ?
160
+ . is_none ( )
161
+ {
153
162
// This temporary filename already exists, try another
154
163
continue ;
155
164
}
0 commit comments