From a4961e5ee2a3f39de692868af48c5fa9b34c1781 Mon Sep 17 00:00:00 2001 From: "Charles J. Schneider" Date: Mon, 13 Jun 2016 09:04:32 +0200 Subject: [PATCH 1/6] Add `if_nameindex()` and `if_freenameindex()` from POSIX-2001 --- src/unix/mod.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 44603824..4aeb7a36 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -109,6 +109,12 @@ s! { pub ws_xpixel: ::c_ushort, pub ws_ypixel: ::c_ushort, } + + #[link(name = "if_nameindex")] + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } } pub const SIG_DFL: sighandler_t = 0 as sighandler_t; @@ -444,6 +450,8 @@ extern { pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; pub fn if_indextoname(ifindex: ::c_uint, ifname: *mut ::c_char) -> *mut ::c_char; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); #[cfg_attr(target_os = "macos", link_name = "lstat$INODE64")] #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")] From af25d0e049544c9612cddd1aeabc930a6923a288 Mon Sep 17 00:00:00 2001 From: "C. Jeremiah Schneider" Date: Mon, 13 Jun 2016 09:14:00 +0200 Subject: [PATCH 2/6] remove stray link-time configuration --- src/unix/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 4aeb7a36..74ddc37c 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -110,7 +110,6 @@ s! { pub ws_ypixel: ::c_ushort, } - #[link(name = "if_nameindex")] pub struct if_nameindex { pub if_index: ::c_uint, pub if_name: *mut ::c_char, From 02d53eadefce7fe728d949b59742397a2335d840 Mon Sep 17 00:00:00 2001 From: "C. Jeremiah Schneider" Date: Mon, 13 Jun 2016 09:56:03 +0200 Subject: [PATCH 3/6] Remove android support for `if_nameindex` & `if_freenameindex` --- src/unix/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 74ddc37c..4fe3f1cb 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -110,6 +110,7 @@ s! { pub ws_ypixel: ::c_ushort, } + #[cfg(not(target_os = "android"))] pub struct if_nameindex { pub if_index: ::c_uint, pub if_name: *mut ::c_char, @@ -449,8 +450,6 @@ extern { pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; pub fn if_indextoname(ifindex: ::c_uint, ifname: *mut ::c_char) -> *mut ::c_char; - pub fn if_nameindex() -> *mut if_nameindex; - pub fn if_freenameindex(ptr: *mut if_nameindex); #[cfg_attr(target_os = "macos", link_name = "lstat$INODE64")] #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")] @@ -701,6 +700,8 @@ extern { extern { pub fn getifaddrs(ifap: *mut *mut ifaddrs) -> ::c_int; pub fn freeifaddrs(ifa: *mut ifaddrs); + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); #[cfg_attr(target_os = "macos", link_name = "glob$INODE64")] #[cfg_attr(target_os = "netbsd", link_name = "__glob30")] pub fn glob(pattern: *const c_char, From f14620655c7b06a335d98eaf959a19c69e57ce4f Mon Sep 17 00:00:00 2001 From: "C. Jeremiah Schneider" Date: Mon, 13 Jun 2016 10:51:41 +0200 Subject: [PATCH 4/6] Remove build specification on `if_nameindex` struct --- src/unix/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/unix/mod.rs b/src/unix/mod.rs index 4fe3f1cb..b79d45e1 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -110,7 +110,6 @@ s! { pub ws_ypixel: ::c_ushort, } - #[cfg(not(target_os = "android"))] pub struct if_nameindex { pub if_index: ::c_uint, pub if_name: *mut ::c_char, From d02c2b6f1b7850c22b9380f575c700723f587334 Mon Sep 17 00:00:00 2001 From: "Charles J. Schneider" Date: Fri, 17 Jun 2016 10:03:30 +0200 Subject: [PATCH 5/6] Do not compile the `if_nameindex` struct for android --- src/unix/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unix/mod.rs b/src/unix/mod.rs index b79d45e1..4fe3f1cb 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -110,6 +110,7 @@ s! { pub ws_ypixel: ::c_ushort, } + #[cfg(not(target_os = "android"))] pub struct if_nameindex { pub if_index: ::c_uint, pub if_name: *mut ::c_char, From 332bd866894cd580c16ab3ffe5d43fee8a7d779b Mon Sep 17 00:00:00 2001 From: "Charles J. Schneider" Date: Tue, 12 Jul 2016 09:32:42 +0200 Subject: [PATCH 6/6] Manually exclude Android instead of compiler cfg This change is due to an unfortunate interaction between the `s!` macro and the Android abi. When the struct is defined, but excluded through a `[cfg(not(target_os = "android"))]` the macro tries to define a non-existent struct. This commit manually add the functions & struct to each platform independently. --- src/unix/bsd/mod.rs | 7 +++++++ src/unix/mod.rs | 6 ------ src/unix/notbsd/linux/mod.rs | 8 ++++++++ src/unix/solaris/mod.rs | 37 +++++++++++++++++++++--------------- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/unix/bsd/mod.rs b/src/unix/bsd/mod.rs index f9af6738..f36fa61c 100644 --- a/src/unix/bsd/mod.rs +++ b/src/unix/bsd/mod.rs @@ -120,6 +120,11 @@ s! { pub struct fsid_t { __fsid_val: [::int32_t; 2], } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } } pub const LC_ALL: ::c_int = 0; @@ -358,6 +363,8 @@ extern { pub fn getprogname() -> *const ::c_char; pub fn setprogname(name: *const ::c_char); pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); } cfg_if! { diff --git a/src/unix/mod.rs b/src/unix/mod.rs index b0d2d5d8..214f2cc0 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -114,12 +114,6 @@ s! { pub l_onoff: ::c_int, pub l_linger: ::c_int, } - - #[cfg(not(target_os = "android"))] - pub struct if_nameindex { - pub if_index: ::c_uint, - pub if_name: *mut ::c_char, - } } pub const SIG_DFL: sighandler_t = 0 as sighandler_t; diff --git a/src/unix/notbsd/linux/mod.rs b/src/unix/notbsd/linux/mod.rs index 4b46caf7..bfcbd747 100644 --- a/src/unix/notbsd/linux/mod.rs +++ b/src/unix/notbsd/linux/mod.rs @@ -181,6 +181,12 @@ s! { #[cfg(target_pointer_width = "64")] bits: [u64; 16], } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + } pub const ABDAY_1: ::nl_item = 0x20000; @@ -637,6 +643,8 @@ extern { // Not available now on Android pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); } cfg_if! { diff --git a/src/unix/solaris/mod.rs b/src/unix/solaris/mod.rs index 7c31c35d..809a4d9d 100644 --- a/src/unix/solaris/mod.rs +++ b/src/unix/solaris/mod.rs @@ -318,6 +318,11 @@ s! { pub l_pid: ::pid_t, pub l_pad: [::c_long; 4] } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } } pub const LC_CTYPE: ::c_int = 0; @@ -990,21 +995,23 @@ extern { pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char, newdirfd: ::c_int, newpath: *const ::c_char, flags: ::c_int) -> ::c_int; - pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, dev: dev_t) -> ::c_int; - pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char, - buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t; - pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char, - newdirfd: ::c_int, newpath: *const ::c_char) - -> ::c_int; - pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int, - linkpath: *const ::c_char) -> ::c_int; - pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, - flags: ::c_int) -> ::c_int; - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, dev: dev_t) -> ::c_int; + pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char, + buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t; + pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char, + newdirfd: ::c_int, newpath: *const ::c_char) + -> ::c_int; + pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int, + linkpath: *const ::c_char) -> ::c_int; + pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, + flags: ::c_int) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); }