@@ -183,9 +183,14 @@ struct InnerReadDir {
183
183
root : PathBuf ,
184
184
}
185
185
186
- #[ derive( Clone ) ]
187
186
pub struct ReadDir {
188
187
inner : Arc < InnerReadDir > ,
188
+ #[ cfg( not( any(
189
+ target_os = "solaris" ,
190
+ target_os = "illumos" ,
191
+ target_os = "fuchsia" ,
192
+ target_os = "redox" ,
193
+ ) ) ) ]
189
194
end_of_stream : bool ,
190
195
}
191
196
@@ -196,7 +201,7 @@ unsafe impl Sync for Dir {}
196
201
197
202
pub struct DirEntry {
198
203
entry : dirent64 ,
199
- dir : ReadDir ,
204
+ dir : Arc < InnerReadDir > ,
200
205
// We need to store an owned copy of the entry name
201
206
// on Solaris and Fuchsia because a) it uses a zero-length
202
207
// array to store the name, b) its lifetime between readdir
@@ -443,7 +448,7 @@ impl Iterator for ReadDir {
443
448
name : slice:: from_raw_parts ( name as * const u8 , namelen as usize )
444
449
. to_owned ( )
445
450
. into_boxed_slice ( ) ,
446
- dir : self . clone ( ) ,
451
+ dir : Arc :: clone ( & self . inner ) ,
447
452
} ;
448
453
if ret. name_bytes ( ) != b"." && ret. name_bytes ( ) != b".." {
449
454
return Some ( Ok ( ret) ) ;
@@ -464,7 +469,7 @@ impl Iterator for ReadDir {
464
469
}
465
470
466
471
unsafe {
467
- let mut ret = DirEntry { entry : mem:: zeroed ( ) , dir : self . clone ( ) } ;
472
+ let mut ret = DirEntry { entry : mem:: zeroed ( ) , dir : Arc :: clone ( & self . inner ) } ;
468
473
let mut entry_ptr = ptr:: null_mut ( ) ;
469
474
loop {
470
475
if readdir64_r ( self . inner . dirp . 0 , & mut ret. entry , & mut entry_ptr) != 0 {
@@ -497,7 +502,7 @@ impl Drop for Dir {
497
502
498
503
impl DirEntry {
499
504
pub fn path ( & self ) -> PathBuf {
500
- self . dir . inner . root . join ( OsStr :: from_bytes ( self . name_bytes ( ) ) )
505
+ self . dir . root . join ( OsStr :: from_bytes ( self . name_bytes ( ) ) )
501
506
}
502
507
503
508
pub fn file_name ( & self ) -> OsString {
@@ -506,7 +511,7 @@ impl DirEntry {
506
511
507
512
#[ cfg( any( target_os = "linux" , target_os = "emscripten" , target_os = "android" ) ) ]
508
513
pub fn metadata ( & self ) -> io:: Result < FileAttr > {
509
- let fd = cvt ( unsafe { dirfd ( self . dir . inner . dirp . 0 ) } ) ?;
514
+ let fd = cvt ( unsafe { dirfd ( self . dir . dirp . 0 ) } ) ?;
510
515
let name = self . entry . d_name . as_ptr ( ) ;
511
516
512
517
cfg_has_statx ! {
@@ -944,7 +949,16 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> {
944
949
Err ( Error :: last_os_error ( ) )
945
950
} else {
946
951
let inner = InnerReadDir { dirp : Dir ( ptr) , root } ;
947
- Ok ( ReadDir { inner : Arc :: new ( inner) , end_of_stream : false } )
952
+ Ok ( ReadDir {
953
+ inner : Arc :: new ( inner) ,
954
+ #[ cfg( not( any(
955
+ target_os = "solaris" ,
956
+ target_os = "illumos" ,
957
+ target_os = "fuchsia" ,
958
+ target_os = "redox" ,
959
+ ) ) ) ]
960
+ end_of_stream : false ,
961
+ } )
948
962
}
949
963
}
950
964
}
0 commit comments