More windows compat

[ci skip]
diff --git a/libc-test/build.rs b/libc-test/build.rs
index 54f5a9f..d9aadc1 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -74,10 +74,14 @@
         }
 
         if self.target.contains("windows") {
-            base.push("winsock2.h");
-            base.push("ws2ipdef.h");
-            base.push("windows.h");
+            base.push("winsock2.h"); // must be before windows.h
+
+            base.push("direct.h");
+            base.push("io.h");
             base.push("sys/utime.h");
+            base.push("windows.h");
+            base.push("process.h");
+            base.push("ws2ipdef.h");
         } else {
             base.push("ctype.h");
             base.push("dirent.h");
@@ -131,6 +135,8 @@
                     t.to_string()
                 } else if windows && t == "stat" {
                     "struct __stat64".to_string()
+                } else if windows && t == "utimbuf" {
+                    "struct __utimbuf64".to_string()
                 } else {
                     format!("struct {}", t)
                 }
@@ -247,7 +253,8 @@
     if tg.target.contains("msvc") {
         cfg.flag("/W3").flag("/Wall").flag("/WX")
            .flag("/wd4820")  // weird warning about adding padding?
-           .flag("/wd4100"); // don't warn about unused parameters
+           .flag("/wd4100")  // don't warn about unused parameters
+           .flag("/wd4996"); // don't warn about deprecated functions
     } else {
         cfg.flag("-Wall").flag("-Wextra").flag("-Werror")
            .flag("-Wno-unused-parameter");
@@ -378,13 +385,15 @@
         "#, ty = rust_ty, name = name));
     }
 
-    fn test_extern_fn(&mut self, name: &str, args: &[String], ret: &str,
+    fn test_extern_fn(&mut self, name: &str, cname: &str,
+                      args: &[String], ret: &str,
                       variadic: bool) {
         match name {
             // manually verified
             "execv" |
             "execve" |
             "execvp" |
+            "execvpe" |
             "glob" |
             "getrlimit" |
             "setrlimit" |
@@ -401,11 +410,12 @@
         let cret = self.rust_ty_to_c_ty(ret);
         t!(writeln!(self.c, r#"
             {ret} (*__test_fn_{name}(void))({args}) {{
-                return {name};
+                return {cname};
             }}
-        "#, name = name, args = args, ret = cret));
+        "#, name = name, cname = cname, args = args, ret = cret));
         t!(writeln!(self.rust, r#"
             #[test]
+            #[cfg_attr(windows, ignore)] // FIXME -- dllimport weirdness?
             fn fn_{name}() {{
                 extern {{
                     fn __test_fn_{name}() -> size_t;
@@ -497,7 +507,14 @@
             ast::ForeignItemFn(ref decl, ref generics) => {
                 self.assert_no_generics(i.ident, generics);
                 let (ret, args, variadic) = self.decl2rust(decl);
-                self.test_extern_fn(&i.ident.to_string(), &args, &ret,
+                let cname = match attr::first_attr_value_str_by_name(&i.attrs,
+                                                                     "link_name") {
+                    Some(ref i) if !i.to_string().contains("$") => {
+                        i.to_string()
+                    }
+                    _ => i.ident.to_string(),
+                };
+                self.test_extern_fn(&i.ident.to_string(), &cname, &args, &ret,
                                     variadic);
             }
             ast::ForeignItemStatic(_, _) => {
diff --git a/src/lib.rs b/src/lib.rs
index 5aa50af..f17bc99 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -12,6 +12,7 @@
        html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
        html_root_url = "https://doc.rust-lang.org/nightly/",
        html_playground_url = "https://play.rust-lang.org/")]
+#![feature(linked_from)]
 
 //! Bindings for the C standard library and other platform libraries
 //!
@@ -5397,6 +5398,8 @@
             use types::os::arch::c95::{c_long, c_uint, c_ulong};
             use types::os::arch::c95::{size_t};
 
+            #[linked_from = "kernel32"]
+            #[link(name = "kernel32")]
             extern {
                 pub fn abs(i: c_int) -> c_int;
                 pub fn labs(i: c_long) -> c_long;
@@ -5527,11 +5530,9 @@
             use types::os::arch::c95::{c_int, c_char, wchar_t};
             extern {
                 #[link_name = "_open"]
-                pub fn open(path: *const c_char, oflag: c_int, mode: c_int)
-                            -> c_int;
+                pub fn open(path: *const c_char, oflag: c_int, ...) -> c_int;
                 #[link_name = "_wopen"]
-                pub fn wopen(path: *const wchar_t, oflag: c_int, mode: c_int)
-                            -> c_int;
+                pub fn wopen(path: *const wchar_t, oflag: c_int, ...) -> c_int;
                 #[link_name = "_creat"]
                 pub fn creat(path: *const c_char, mode: c_int) -> c_int;
             }
@@ -5543,8 +5544,7 @@
 
         pub mod unistd {
             use types::common::c95::c_void;
-            use types::os::arch::c95::{c_int, c_uint, c_char,
-                                             c_long, size_t};
+            use types::os::arch::c95::{c_int, c_uint, c_char, c_long};
             use types::os::arch::c99::intptr_t;
 
             extern {
@@ -5572,7 +5572,7 @@
                 pub fn execvpe(c: *const c_char, argv: *const *const c_char,
                                envp: *const *const c_char) -> c_int;
                 #[link_name = "_getcwd"]
-                pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char;
+                pub fn getcwd(buf: *mut c_char, size: c_int) -> *mut c_char;
                 #[link_name = "_getpid"]
                 pub fn getpid() -> c_int;
                 #[link_name = "_isatty"]
@@ -6480,7 +6480,7 @@
         }
 
         pub mod msvcrt {
-            use types::os::arch::c95::{c_int, c_long};
+            use types::os::arch::c95::c_int;
             use types::os::arch::c99::intptr_t;
 
             extern {
@@ -6488,7 +6488,7 @@
                 pub fn commit(fd: c_int) -> c_int;
 
                 #[link_name = "_get_osfhandle"]
-                pub fn get_osfhandle(fd: c_int) -> c_long;
+                pub fn get_osfhandle(fd: c_int) -> intptr_t;
 
                 #[link_name = "_open_osfhandle"]
                 pub fn open_osfhandle(osfhandle: intptr_t,