diff --git a/libc-test/build.rs b/libc-test/build.rs
index 0e5cd9f9fea739f7f16c7b7af25ebb8230f08c11..233983d9644eef26c9b20dfee7659c4ed7f71c66 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -189,5 +189,10 @@ fn main() {
     // Windows dllimport oddness?
     cfg.skip_fn_ptrcheck(move |_| windows);
 
+    cfg.skip_field_type(|struct_, field| {
+        // This is a weird union, don't check the type.
+        struct_ == "ifaddrs" && field == "ifa_ifu"
+    });
+
     cfg.generate("../src/lib.rs", "all.rs");
 }
diff --git a/src/unix/mod.rs b/src/unix/mod.rs
index 14c427fd3aab86f75dff88559ce2f599b9696f38..cacecbc3adfc2315e3cb270fb23aabf12b368bb9 100644
--- a/src/unix/mod.rs
+++ b/src/unix/mod.rs
@@ -48,7 +48,7 @@ s! {
     }
 
     pub struct in6_addr {
-        pub s6_addr: [u16; 8],
+        pub s6_addr16: [u16; 8],
         __align: [u32; 0],
     }
 
diff --git a/src/unix/notbsd/mod.rs b/src/unix/notbsd/mod.rs
index 87fec5e17ff92fd62ab42419fcb4fc64bde7b80f..8591420ce5b8e8f1415acc38d62996a6c8a3c1c4 100644
--- a/src/unix/notbsd/mod.rs
+++ b/src/unix/notbsd/mod.rs
@@ -24,7 +24,7 @@ pub enum timezone {}
 s! {
     pub struct sockaddr {
         pub sa_family: sa_family_t,
-        pub sa_data: [u8; 14],
+        pub sa_data: [::c_char; 14],
     }
 
     pub struct sockaddr_in {
@@ -49,7 +49,7 @@ s! {
 
     pub struct sockaddr_storage {
         pub ss_family: sa_family_t,
-        __ss_align: isize,
+        __ss_align: ::size_t,
         #[cfg(target_pointer_width = "32")]
         __ss_pad2: [u8; 128 - 2 * 4],
         #[cfg(target_pointer_width = "64")]