diff --git a/src/lib.rs b/src/lib.rs
index 797c5394f904d751d54c3e16c9b6bf7b1d20bb34..5df3b5b38f3b8de0a120f10ebcdb2ebd8fac855f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -101,8 +101,6 @@ pub type ssize_t = isize;
 
 pub enum FILE {}
 pub enum fpos_t {}
-pub enum DIR {}
-pub enum dirent {}
 
 extern {
     pub fn isalnum(c: c_int) -> c_int;
diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs
index 7aefcab271e45232da09c7d42c47ae2de77a9611..e50eb49ade13a39bcd9f24ed1cb9d3e8530f76ef 100644
--- a/src/unix/bsd/apple/mod.rs
+++ b/src/unix/bsd/apple/mod.rs
@@ -83,11 +83,20 @@ s! {
         pub st_qspare: [::int64_t; 2],
     }
 
+    pub struct dirent {
+        pub d_ino: u64,
+        pub d_seekoff: u64,
+        pub d_reclen: u16,
+        pub d_namlen: u16,
+        pub d_type: u8,
+        pub d_name: [::c_char; 1024],
+    }
 
     pub struct pthread_mutex_t {
         __sig: ::c_long,
         __opaque: [u8; __PTHREAD_MUTEX_SIZE__],
     }
+
     pub struct pthread_mutexattr_t {
         __sig: ::c_long,
         __opaque: [u8; 8],
diff --git a/src/unix/bsd/freebsdlike/mod.rs b/src/unix/bsd/freebsdlike/mod.rs
index 043eb64afa7b043f76d971c89a5830d20c30b18a..d4342eae3c0cb03d1d22d0f15802f97e6ac48998 100644
--- a/src/unix/bsd/freebsdlike/mod.rs
+++ b/src/unix/bsd/freebsdlike/mod.rs
@@ -16,6 +16,14 @@ pub type pthread_key_t = ::c_int;
 pub enum timezone {}
 
 s! {
+    pub struct dirent {
+        pub d_fileno: u32,
+        pub d_reclen: u16,
+        pub d_type: u8,
+        pub d_namelen: u8,
+        pub d_name: [::c_char; 256],
+    }
+
     pub struct glob_t {
         pub gl_pathc: ::size_t,
         __unused1: ::size_t,
diff --git a/src/unix/bsd/openbsdlike/mod.rs b/src/unix/bsd/openbsdlike/mod.rs
index ecd1579e0c211ad66de0aac4907916ec4e9c27d9..d78c4171fa8164a115f9a078157a03d87f618dbf 100644
--- a/src/unix/bsd/openbsdlike/mod.rs
+++ b/src/unix/bsd/openbsdlike/mod.rs
@@ -22,6 +22,16 @@ pub type rlim_t = u64;
 pub enum timezone {}
 
 s! {
+    pub struct dirent {
+        pub d_fileno: ::ino_t,
+        pub d_off: ::off_t,
+        pub d_reclen: u16,
+        pub d_type: u8,
+        pub d_namelen: u8,
+        __d_padding: [u8; 4],
+        pub d_name: [::c_char; 256],
+    }
+
     pub struct siginfo_t {
         pub si_signo: ::c_int,
         pub si_code: ::c_int,
diff --git a/src/unix/mod.rs b/src/unix/mod.rs
index c78058674d1b6de29b7b1b844ede0cca19839f6d..cb45123f9e8cae97d9fb22d1015ac1a6e4aaf704 100644
--- a/src/unix/mod.rs
+++ b/src/unix/mod.rs
@@ -10,6 +10,8 @@ pub type in_addr_t = u32;
 pub type in_port_t = u16;
 pub type sighandler_t = ::size_t;
 
+pub enum DIR {}
+
 s! {
     pub struct utimbuf {
         pub actime: time_t,
diff --git a/src/unix/notbsd/android/mod.rs b/src/unix/notbsd/android/mod.rs
index e26bceac30c9281b25361cb5dfc3ec3eda8621fd..6187f315858715b699dbc8da51b7f2d675f81ea3 100644
--- a/src/unix/notbsd/android/mod.rs
+++ b/src/unix/notbsd/android/mod.rs
@@ -43,6 +43,14 @@ s! {
         pub st_ino: ::c_ulonglong,
     }
 
+    pub struct dirent {
+        pub d_ino: u64,
+        pub d_off: i64,
+        pub d_reclen: ::c_ushort,
+        pub d_type: ::c_uchar,
+        pub d_name: [::c_char; 256],
+    }
+
     pub struct pthread_attr_t {
         pub flags: ::uint32_t,
         pub stack_base: *mut ::c_void,
diff --git a/src/unix/notbsd/linux/mod.rs b/src/unix/notbsd/linux/mod.rs
index 6606b41c9c6e0f2489fe2e8e83e7df7b4b0a6def..67d7d7c833f9a7777228601995babf77ca13c282 100644
--- a/src/unix/notbsd/linux/mod.rs
+++ b/src/unix/notbsd/linux/mod.rs
@@ -7,6 +7,14 @@ pub type pthread_t = c_ulong;
 pub type mode_t = u32;
 
 s! {
+    pub struct dirent {
+        pub d_ino: ::ino_t,
+        pub d_off: ::off_t,
+        pub d_reclen: ::c_ushort,
+        pub d_type: ::c_uchar,
+        pub d_name: [::c_char; 256],
+    }
+
     pub struct glob_t {
         pub gl_pathc: ::size_t,
         pub gl_pathv: *mut *mut c_char,