@@ -106,14 +106,17 @@ pub fn parse_sha256(string: impl AsRef<str>) -> Result<Sha256Digest> {
106106 Ok ( value)
107107}
108108
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+ }
117120 }
118121}
119122
@@ -135,12 +138,15 @@ pub(crate) fn replace_symlinkat(
135138 let target = target. as_ref ( ) ;
136139
137140 // 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+ {
139145 return Ok ( ( ) ) ;
140146 } ;
141147
142148 // 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 ) ? {
144150 if current_target. into_bytes ( ) == target. as_os_str ( ) . as_bytes ( ) {
145151 return Ok ( ( ) ) ;
146152 }
@@ -149,7 +155,10 @@ pub(crate) fn replace_symlinkat(
149155 // Step 3: full atomic replace path
150156 for _ in 0 ..16 {
151157 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+ {
153162 // This temporary filename already exists, try another
154163 continue ;
155164 }
0 commit comments