summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-05-19 17:48:03 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-05-19 21:34:09 -0700
commite7aad2861422a4fb65808d2a8a6dbeb22e6a0c1d (patch)
treecabc0bc847ae5ad233f7091218f7d7a5a79540c1 /src/rt
parentc322dbbf8a518d00c6db689ca80b0047f2328890 (diff)
downloadrust-e7aad2861422a4fb65808d2a8a6dbeb22e6a0c1d.tar.gz
rust-e7aad2861422a4fb65808d2a8a6dbeb22e6a0c1d.zip
std: Handle DT_DIR file types in `dirent` pointers
This "fast path" in `DirEntry::file_type` on Unix wasn't turning out to be so
much of a fast path as the `DT_DIR` case wasn't handled, so directories fell
back to using `lstat` instead. This commit adds the missing case to return
quickly if a path is a directory and `DirEntry::file_type` is used.
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust_builtin.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/rt/rust_builtin.c b/src/rt/rust_builtin.c
index 362439c1469..fef25f608fd 100644
--- a/src/rt/rust_builtin.c
+++ b/src/rt/rust_builtin.c
@@ -50,7 +50,7 @@ rust_list_dir_val(struct dirent* entry_ptr) {
 
 int
 rust_dir_get_mode(struct dirent* entry_ptr) {
-#if defined(_DIRENT_HAVE_D_TYPE)
+#if defined(_DIRENT_HAVE_D_TYPE) || defined(__APPLE__)
     switch (entry_ptr->d_type) {
         case DT_BLK: return S_IFBLK;
         case DT_CHR: return S_IFCHR;
@@ -58,6 +58,7 @@ rust_dir_get_mode(struct dirent* entry_ptr) {
         case DT_LNK: return S_IFLNK;
         case DT_REG: return S_IFREG;
         case DT_SOCK: return S_IFSOCK;
+        case DT_DIR: return S_IFDIR;
     }
 #endif
     return -1;