@@ -228,23 +228,54 @@ struct Dir(*mut libc::DIR);
228
228
unsafe impl Send for Dir { }
229
229
unsafe impl Sync for Dir { }
230
230
231
+ #[ cfg( any(
232
+ target_os = "android" ,
233
+ target_os = "linux" ,
234
+ target_os = "solaris" ,
235
+ target_os = "illumos" ,
236
+ target_os = "fuchsia" ,
237
+ target_os = "redox"
238
+ ) ) ]
231
239
pub struct DirEntry {
232
- entry : dirent64 ,
233
240
dir : Arc < InnerReadDir > ,
241
+ entry : dirent64_min ,
234
242
// We need to store an owned copy of the entry name on platforms that use
235
243
// readdir() (not readdir_r()), because a) struct dirent may use a flexible
236
244
// array to store the name, b) it lives only until the next readdir() call.
237
- #[ cfg( any(
238
- target_os = "android" ,
239
- target_os = "linux" ,
240
- target_os = "solaris" ,
241
- target_os = "illumos" ,
242
- target_os = "fuchsia" ,
243
- target_os = "redox"
244
- ) ) ]
245
245
name : CString ,
246
246
}
247
247
248
+ // Define a minimal subset of fields we need from `dirent64`, especially since
249
+ // we're not using the immediate `d_name` on these targets. Keeping this as an
250
+ // `entry` field in `DirEntry` helps reduce the `cfg` boilerplate elsewhere.
251
+ #[ cfg( any(
252
+ target_os = "android" ,
253
+ target_os = "linux" ,
254
+ target_os = "solaris" ,
255
+ target_os = "illumos" ,
256
+ target_os = "fuchsia" ,
257
+ target_os = "redox"
258
+ ) ) ]
259
+ struct dirent64_min {
260
+ d_ino : u64 ,
261
+ #[ cfg( not( any( target_os = "solaris" , target_os = "illumos" ) ) ) ]
262
+ d_type : u8 ,
263
+ }
264
+
265
+ #[ cfg( not( any(
266
+ target_os = "android" ,
267
+ target_os = "linux" ,
268
+ target_os = "solaris" ,
269
+ target_os = "illumos" ,
270
+ target_os = "fuchsia" ,
271
+ target_os = "redox"
272
+ ) ) ) ]
273
+ pub struct DirEntry {
274
+ dir : Arc < InnerReadDir > ,
275
+ // The full entry includes a fixed-length `d_name`.
276
+ entry : dirent64 ,
277
+ }
278
+
248
279
#[ derive( Clone , Debug ) ]
249
280
pub struct OpenOptions {
250
281
// generic
@@ -501,8 +532,14 @@ impl Iterator for ReadDir {
501
532
let entry_name = entry_bytes. add ( name_offset) ;
502
533
ptr:: copy_nonoverlapping ( entry_bytes, copy_bytes, name_offset) ;
503
534
535
+ let entry = dirent64_min {
536
+ d_ino : copy. d_ino as u64 ,
537
+ #[ cfg( not( any( target_os = "solaris" , target_os = "illumos" ) ) ) ]
538
+ d_type : copy. d_type as u8 ,
539
+ } ;
540
+
504
541
let ret = DirEntry {
505
- entry : copy ,
542
+ entry,
506
543
// d_name is guaranteed to be null-terminated.
507
544
name : CStr :: from_ptr ( entry_name as * const _ ) . to_owned ( ) ,
508
545
dir : Arc :: clone ( & self . inner ) ,
0 commit comments