More windows fixes

[ci skip]
diff --git a/libc-test/build.rs b/libc-test/build.rs
index 1f991f1..7e22708 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -50,10 +50,6 @@
     fn headers(&self) -> Vec<&'static str> {
         let mut base = Vec::new();
 
-        if self.target.contains("windows") {
-            base.push("windows.h");
-        }
-
         base.extend(&[
             "errno.h",
             "fcntl.h",
@@ -78,7 +74,10 @@
         }
 
         if self.target.contains("windows") {
-            base.push("winsock.h");
+            base.push("winsock2.h");
+            base.push("ws2ipdef.h");
+            base.push("windows.h");
+            base.push("sys/utime.h");
         } else {
             base.push("glob.h");
             base.push("ifaddrs.h");
@@ -103,6 +102,7 @@
     }
 
     fn rust2c(&self, ty: &str) -> String {
+        let windows = self.target.contains("windows");
         match ty {
             t if t.starts_with("c_") => {
                 match &ty[2..].replace("long", " long")[..] {
@@ -116,8 +116,18 @@
             "glob_t" => "glob_t".to_string(),
             t if t.starts_with("pthread") => t.to_string(),
 
-            t if self.structs.contains(t) => format!("struct {}", t),
+            t if self.structs.contains(t) => {
+                if windows && ty.chars().next().unwrap().is_uppercase() {
+                    t.to_string()
+                } else if windows && t == "stat" {
+                    "struct __stat64".to_string()
+                } else {
+                    format!("struct {}", t)
+                }
+            }
 
+            "time64_t" if windows => "__time64_t".to_string(),
+            "ssize_t" if windows => "SSIZE_T".to_string(),
             t => t.to_string(),
         }
     }
@@ -225,7 +235,9 @@
     cfg.file(out.join("all.c"));
 
     if tg.target.contains("msvc") {
-        cfg.flag("/W3").flag("/Wall").flag("/WX");
+        cfg.flag("/W3").flag("/Wall").flag("/WX")
+           .flag("/wd4820")  // weird warning about adding padding?
+           .flag("/wd4100"); // don't warn about unused parameters
     } else {
         cfg.flag("-Wall").flag("-Wextra").flag("-Werror")
            .flag("-Wno-unused-parameter");
@@ -322,13 +334,9 @@
                           iter::repeat("*").take(ptrs).collect::<String>());
         let cast = if name == "SIG_IGN" {"(size_t)"} else {""};
         t!(writeln!(self.c, r#"
-            int __test_const_{name}({cty} *out) {{
-                int ret = 0;
-                #if defined({name})
-                    *out = {cast}({name});
-                    ret = 1;
-                #endif
-                return ret;
+            int __test_const_{name}({cty} *outptr) {{
+                *outptr = {cast}({name});
+                return 1;
             }}
         "#, name = name, cast = cast, cty = cty));
         t!(writeln!(self.rust, r#"
diff --git a/libc-test/tests/all.rs b/libc-test/tests/all.rs
index 665747f..15ad2cf 100644
--- a/libc-test/tests/all.rs
+++ b/libc-test/tests/all.rs
@@ -7,6 +7,7 @@
 use std::mem;
 
 use libc::*;
+#[cfg(not(windows))]
 use libc::types::os::common::bsd43::*;
 
 trait Pretty {
diff --git a/src/lib.rs b/src/lib.rs
index 234a642..4000bd9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1694,11 +1694,11 @@
         pub mod common {
             pub mod posix01 {
                 use types::os::arch::c95::{c_short, time_t, c_long};
-                use types::os::arch::extra::{int64, time64_t};
+                use types::os::arch::extra::{time64_t};
                 use types::os::arch::posix88::{dev_t, ino_t};
 
-                // pub Note: this is the struct called stat64 in Windows. Not stat,
-                // nor stati64.
+                // pub Note: this is the struct called stat64 in Windows. Not
+                // stat, nor stati64.
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct stat {
                     pub st_dev: dev_t,
@@ -1708,7 +1708,7 @@
                     pub st_uid: c_short,
                     pub st_gid: c_short,
                     pub st_rdev: dev_t,
-                    pub st_size: int64,
+                    pub st_size: i64,
                     pub st_atime: time64_t,
                     pub st_mtime: time64_t,
                     pub st_ctime: time64_t,
@@ -1741,18 +1741,14 @@
                 use types::os::arch::c99::uintptr_t;
 
                 pub type SOCKET = uintptr_t;
-                pub type socklen_t = c_int;
-                pub type sa_family_t = u16;
-                pub type in_port_t = u16;
-                pub type in_addr_t = u32;
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct sockaddr {
-                    pub sa_family: sa_family_t,
+                    pub sa_family: u16,
                     pub sa_data: [u8; 14],
                 }
                 #[repr(C)]
                 #[derive(Copy)] pub struct sockaddr_storage {
-                    pub ss_family: sa_family_t,
+                    pub ss_family: u16,
                     __ss_pad1: [u8; 6],
                     __ss_align: i64,
                     __ss_pad2: [u8; 112],
@@ -1762,19 +1758,19 @@
                 }
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct sockaddr_in {
-                    pub sin_family: sa_family_t,
-                    pub sin_port: in_port_t,
+                    pub sin_family: u16,
+                    pub sin_port: u16,
                     pub sin_addr: in_addr,
                     pub sin_zero: [u8; 8],
                 }
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct in_addr {
-                    pub s_addr: in_addr_t,
+                    pub s_addr: u32,
                 }
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct sockaddr_in6 {
-                    pub sin6_family: sa_family_t,
-                    pub sin6_port: in_port_t,
+                    pub sin6_family: u16,
+                    pub sin6_port: u16,
                     pub sin6_flowinfo: u32,
                     pub sin6_addr: in6_addr,
                     pub sin6_scope_id: u32,
@@ -1782,7 +1778,6 @@
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct in6_addr {
                     pub s6_addr: [u16; 8],
-                    __align: [u32; 0],
                 }
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct ip_mreq {
@@ -1805,14 +1800,6 @@
                     pub ai_addr: *mut sockaddr,
                     pub ai_next: *mut addrinfo,
                 }
-                #[repr(C)]
-                #[derive(Copy)] pub struct sockaddr_un {
-                    pub sun_family: sa_family_t,
-                    pub sun_path: [c_char; 108]
-                }
-                impl Clone for sockaddr_un {
-                    fn clone(&self) -> sockaddr_un { *self }
-                }
             }
         }
 
@@ -1847,11 +1834,6 @@
                 #[cfg(target_arch = "x86_64")]
                 pub type time_t = i64;
 
-                #[cfg(target_arch = "x86")]
-                pub type suseconds_t = i32;
-                #[cfg(target_arch = "x86_64")]
-                pub type suseconds_t = i64;
-
                 pub type wchar_t = u16;
             }
 
@@ -1878,11 +1860,6 @@
                 pub type dev_t = u32;
                 pub type ino_t = u16;
 
-                pub type pid_t = u32;
-
-                pub type useconds_t = u32;
-                pub type mode_t = u16;
-
                 #[cfg(target_arch = "x86")]
                 pub type ssize_t = i32;
                 #[cfg(target_arch = "x86_64")]
@@ -1959,10 +1936,9 @@
                 pub type SIZE_T = size_t;
 
                 pub type time64_t = i64;
-                pub type int64 = i64;
 
                 #[repr(C)]
-                #[derive(Copy, Clone)] pub struct STARTUPINFO {
+                #[derive(Copy, Clone)] pub struct STARTUPINFOW {
                     pub cb: DWORD,
                     pub lpReserved: LPWSTR,
                     pub lpDesktop: LPWSTR,
@@ -1972,7 +1948,7 @@
                     pub dwXSize: DWORD,
                     pub dwYSize: DWORD,
                     pub dwXCountChars: DWORD,
-                    pub dwYCountCharts: DWORD,
+                    pub dwYCountChars: DWORD,
                     pub dwFillAttribute: DWORD,
                     pub dwFlags: DWORD,
                     pub wShowWindow: WORD,
@@ -1982,7 +1958,7 @@
                     pub hStdOutput: HANDLE,
                     pub hStdError: HANDLE,
                 }
-                pub type LPSTARTUPINFO = *mut STARTUPINFO;
+                pub type LPSTARTUPINFOW = *mut STARTUPINFOW;
 
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct PROCESS_INFORMATION {
@@ -2019,7 +1995,7 @@
                     pub Protect: DWORD,
                     pub Type: DWORD,
                 }
-                pub type LPMEMORY_BASIC_INFORMATION = *mut MEMORY_BASIC_INFORMATION;
+                pub type PMEMORY_BASIC_INFORMATION = *mut MEMORY_BASIC_INFORMATION;
 
                 #[repr(C)]
                 #[derive(Copy, Clone)] pub struct OVERLAPPED {
@@ -2532,8 +2508,8 @@
             pub const BUFSIZ : c_uint = 512;
             pub const FOPEN_MAX : c_uint = 20;
             pub const FILENAME_MAX : c_uint = 260;
-            pub const L_tmpnam : c_uint = 16;
-            pub const TMP_MAX : c_uint = 32767;
+            pub const L_tmpnam : c_uint = 260;
+            pub const TMP_MAX : c_uint = 0x7fff_ffff;
 
             pub const WSAEINTR: c_int = 10004;
             pub const WSAEBADF: c_int = 10009;
@@ -2592,7 +2568,6 @@
         }
         pub mod posix88 {
             use types::os::arch::c95::c_int;
-            use types::os::arch::posix88::mode_t;
 
             pub const O_RDONLY : c_int = 0;
             pub const O_WRONLY : c_int = 1;
@@ -2601,36 +2576,13 @@
             pub const O_CREAT : c_int = 256;
             pub const O_EXCL : c_int = 1024;
             pub const O_TRUNC : c_int = 512;
-            pub const S_IFIFO : c_int = 4096;
             pub const S_IFCHR : c_int = 8192;
-            pub const S_IFBLK : c_int = 12288;
             pub const S_IFDIR : c_int = 16384;
             pub const S_IFREG : c_int = 32768;
-            pub const S_IFLNK : c_int = 40960;
-            pub const S_IFSOCK : mode_t = 49152;
             pub const S_IFMT : c_int = 61440;
             pub const S_IEXEC : c_int = 64;
             pub const S_IWRITE : c_int = 128;
             pub const S_IREAD : c_int = 256;
-            pub const S_IRWXU : c_int = 448;
-            pub const S_IXUSR : c_int = 64;
-            pub const S_IWUSR : c_int = 128;
-            pub const S_IRUSR : c_int = 256;
-            pub const S_IRWXG : mode_t = 56;
-            pub const S_IXGRP : mode_t = 8;
-            pub const S_IWGRP : mode_t = 16;
-            pub const S_IRGRP : mode_t = 32;
-            pub const S_IRWXO : mode_t = 7;
-            pub const S_IXOTH : mode_t = 1;
-            pub const S_IWOTH : mode_t = 2;
-            pub const S_IROTH : mode_t = 4;
-            pub const F_OK : c_int = 0;
-            pub const R_OK : c_int = 4;
-            pub const W_OK : c_int = 2;
-            pub const X_OK : c_int = 1;
-            pub const STDIN_FILENO : c_int = 0;
-            pub const STDOUT_FILENO : c_int = 1;
-            pub const STDERR_FILENO : c_int = 2;
         }
         pub mod posix01 {
         }
@@ -2651,8 +2603,8 @@
             pub const IP_MULTICAST_LOOP: c_int = 11;
             pub const IP_ADD_MEMBERSHIP: c_int = 12;
             pub const IP_DROP_MEMBERSHIP: c_int = 13;
-            pub const IPV6_ADD_MEMBERSHIP: c_int = 5;
-            pub const IPV6_DROP_MEMBERSHIP: c_int = 6;
+            pub const IPV6_ADD_MEMBERSHIP: c_int = 12;
+            pub const IPV6_DROP_MEMBERSHIP: c_int = 13;
             pub const IP_TTL: c_int = 4;
             pub const IP_HDRINCL: c_int = 2;
 
@@ -2679,9 +2631,9 @@
 
             pub const IFF_LOOPBACK: c_int = 4;
 
-            pub const SHUT_RD: c_int = 0;
-            pub const SHUT_WR: c_int = 1;
-            pub const SHUT_RDWR: c_int = 2;
+            pub const SD_RECEIVE: c_int = 0;
+            pub const SD_SEND: c_int = 1;
+            pub const SD_BOTH: c_int = 2;
         }
         pub mod extra {
             use types::os::common::bsd44::SOCKET;
@@ -2851,7 +2803,7 @@
             pub const FILE_FLAG_OPEN_NO_RECALL: DWORD = 0x00100000;
             pub const FILE_FLAG_OPEN_REPARSE_POINT: DWORD = 0x00200000;
             pub const FILE_FLAG_OVERLAPPED: DWORD = 0x40000000;
-            pub const FILE_FLAG_POSIX_SEMANTICS: DWORD = 0x0100000;
+            pub const FILE_FLAG_POSIX_SEMANTICS: DWORD = 0x1000000;
             pub const FILE_FLAG_RANDOM_ACCESS: DWORD = 0x10000000;
             pub const FILE_FLAG_SESSION_AWARE: DWORD = 0x00800000;
             pub const FILE_FLAG_SEQUENTIAL_SCAN: DWORD = 0x08000000;
@@ -6155,25 +6107,25 @@
     #[cfg(windows)]
     pub mod bsd43 {
         use types::common::c95::{c_void};
-        use types::os::common::bsd44::{socklen_t, sockaddr, SOCKET};
+        use types::os::common::bsd44::{sockaddr, SOCKET};
         use types::os::arch::c95::c_int;
 
         extern "system" {
             pub fn socket(domain: c_int, ty: c_int, protocol: c_int) -> SOCKET;
             pub fn connect(socket: SOCKET, address: *const sockaddr,
-                           len: socklen_t) -> c_int;
+                           len: c_int) -> c_int;
             pub fn bind(socket: SOCKET, address: *const sockaddr,
-                        address_len: socklen_t) -> c_int;
+                        address_len: c_int) -> c_int;
             pub fn listen(socket: SOCKET, backlog: c_int) -> c_int;
             pub fn accept(socket: SOCKET, address: *mut sockaddr,
-                          address_len: *mut socklen_t) -> SOCKET;
+                          address_len: *mut c_int) -> SOCKET;
             pub fn getpeername(socket: SOCKET, address: *mut sockaddr,
-                               address_len: *mut socklen_t) -> c_int;
+                               address_len: *mut c_int) -> c_int;
             pub fn getsockname(socket: SOCKET, address: *mut sockaddr,
-                               address_len: *mut socklen_t) -> c_int;
+                               address_len: *mut c_int) -> c_int;
             pub fn setsockopt(socket: SOCKET, level: c_int, name: c_int,
                               value: *const c_void,
-                              option_len: socklen_t) -> c_int;
+                              option_len: c_int) -> c_int;
             pub fn closesocket(socket: SOCKET) -> c_int;
             pub fn recv(socket: SOCKET, buf: *mut c_void, len: c_int,
                         flags: c_int) -> c_int;
@@ -6298,17 +6250,7 @@
 
         pub mod kernel32 {
             use types::os::arch::c95::{c_uint};
-            use types::os::arch::extra::{BOOL, DWORD, SIZE_T, HMODULE,
-                                               LPCWSTR, LPWSTR,
-                                               LPWCH, LPDWORD, LPVOID,
-                                               LPCVOID, LPOVERLAPPED,
-                                               LPSECURITY_ATTRIBUTES,
-                                               LPSTARTUPINFO,
-                                               LPPROCESS_INFORMATION,
-                                               LPMEMORY_BASIC_INFORMATION,
-                                               LPSYSTEM_INFO, HANDLE, LPHANDLE,
-                                               LARGE_INTEGER, PLARGE_INTEGER,
-                                               LPFILETIME, LPWIN32_FIND_DATAW};
+            use types::os::arch::extra::*;
 
             extern "system" {
                 pub fn GetEnvironmentVariableW(n: LPCWSTR,
@@ -6367,7 +6309,7 @@
                                       dwCreationFlags: DWORD,
                                       lpEnvironment: LPVOID,
                                       lpCurrentDirectory: LPCWSTR,
-                                      lpStartupInfo: LPSTARTUPINFO,
+                                      lpStartupInfo: LPSTARTUPINFOW,
                                       lpProcessInformation:
                                       LPPROCESS_INFORMATION)
                                       -> BOOL;
@@ -6398,7 +6340,7 @@
                                       lpflOldProtect: LPDWORD)
                                       -> BOOL;
                 pub fn VirtualQuery(lpAddress: LPCVOID,
-                                    lpBuffer: LPMEMORY_BASIC_INFORMATION,
+                                    lpBuffer: PMEMORY_BASIC_INFORMATION,
                                     dwLength: SIZE_T)
                                     -> SIZE_T;
                 pub fn CreateFileMappingW(hFile: HANDLE,