Skip to content
This repository has been archived by the owner on Nov 15, 2019. It is now read-only.

Updated to work with libc 0.2 #24

Merged
merged 2 commits into from Jun 2, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion Cargo.toml
Expand Up @@ -10,6 +10,9 @@ version = "0.4.0"

[dependencies]
clippy = {version = "~0.0.45", optional = true}
libc = "~0.1.12"
libc = "0.2"
c_linked_list = "~1.1.0"

[target.'cfg(target_os = "windows")'.dependencies]
winapi = "0.2"

107 changes: 54 additions & 53 deletions src/lib.rs
Expand Up @@ -44,6 +44,9 @@
extern crate c_linked_list;
extern crate libc;

#[cfg(windows)]
extern crate winapi;

use std::io;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

Expand Down Expand Up @@ -138,13 +141,13 @@ mod getifaddrs_posix {
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::{mem, io};
use std::ffi::CStr;
use libc::consts::os::bsd44::{AF_INET, AF_INET6};
use libc::funcs::bsd43::getifaddrs as posix_getifaddrs;
use libc::funcs::bsd43::freeifaddrs as posix_freeifaddrs;
use libc::types::os::common::bsd44::ifaddrs as posix_ifaddrs;
use libc::types::os::common::bsd44::sockaddr as posix_sockaddr;
use libc::types::os::common::bsd44::sockaddr_in as posix_sockaddr_in;
use libc::types::os::common::bsd44::sockaddr_in6 as posix_sockaddr_in6;
use libc::{AF_INET, AF_INET6};
use libc::getifaddrs as posix_getifaddrs;
use libc::freeifaddrs as posix_freeifaddrs;
use libc::ifaddrs as posix_ifaddrs;
use libc::sockaddr as posix_sockaddr;
use libc::sockaddr_in as posix_sockaddr_in;
use libc::sockaddr_in6 as posix_sockaddr_in6;

#[allow(unsafe_code)]
fn sockaddr_to_ipaddr(sockaddr: *const posix_sockaddr) -> Option<IpAddr> {
Expand All @@ -160,25 +163,25 @@ mod getifaddrs_posix {
} else if unsafe { *sockaddr }.sa_family as u32 == AF_INET6 as u32 {
let sa = &unsafe { *(sockaddr as *const posix_sockaddr_in6) };
// Ignore all fe80:: addresses as these are link locals
if sa.sin6_addr.s6_addr[0] == 0x80fe {
if sa.sin6_addr.s6_addr[0] == 0xfe && sa.sin6_addr.s6_addr[1] == 0x80 {
return None;
}
Some(IpAddr::V6(Ipv6Addr::new(((sa.sin6_addr.s6_addr[0] & 255) << 8) |
((sa.sin6_addr.s6_addr[0] >> 8) & 255),
((sa.sin6_addr.s6_addr[1] & 255) << 8) |
((sa.sin6_addr.s6_addr[1] >> 8) & 255),
((sa.sin6_addr.s6_addr[2] & 255) << 8) |
((sa.sin6_addr.s6_addr[2] >> 8) & 255),
((sa.sin6_addr.s6_addr[3] & 255) << 8) |
((sa.sin6_addr.s6_addr[3] >> 8) & 255),
((sa.sin6_addr.s6_addr[4] & 255) << 8) |
((sa.sin6_addr.s6_addr[4] >> 8) & 255),
((sa.sin6_addr.s6_addr[5] & 255) << 8) |
((sa.sin6_addr.s6_addr[5] >> 8) & 255),
((sa.sin6_addr.s6_addr[6] & 255) << 8) |
((sa.sin6_addr.s6_addr[6] >> 8) & 255),
((sa.sin6_addr.s6_addr[7] & 255) << 8) |
((sa.sin6_addr.s6_addr[7] >> 8) & 255))))
Some(IpAddr::V6(Ipv6Addr::new(((sa.sin6_addr.s6_addr[0] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[0] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[1] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[1] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[2] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[2] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[3] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[3] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[4] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[4] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[5] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[5] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[6] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[6] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[7] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[7] as u16 >> 8) & 255))))
} else {
None
}
Expand Down Expand Up @@ -276,13 +279,11 @@ mod getifaddrs_windows {
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::{io, ptr};
use std::ffi::CStr;
use libc::types::common::c95::c_void;
use libc::types::os::arch::c95::{c_char, c_ulong, size_t, c_int};
use libc::types::os::arch::extra::*; // libc source code says this is all the Windows integral types
use libc::consts::os::extra::*; // win32 status code, constants etc
use libc::consts::os::bsd44::*; // the winsock constants
use libc::types::os::common::bsd44::*; // the winsock types
use libc::{c_void, c_char, c_ulong, size_t, c_int};
use libc;
use winapi::{DWORD, AF_INET, AF_INET6, sockaddr_in6, ERROR_SUCCESS};
use winapi::SOCKADDR as sockaddr;
use winapi::SOCKADDR_IN as sockaddr_in;

#[repr(C)]
struct SocketAddress {
Expand Down Expand Up @@ -348,35 +349,35 @@ mod getifaddrs_windows {
if unsafe { *sockaddr }.sa_family as u32 == AF_INET as u32 {
let ref sa = unsafe { *(sockaddr as *const sockaddr_in) };
// Ignore all 169.254.x.x addresses as these are not active interfaces
if sa.sin_addr.s_addr & 65535 == 0xfea9 {
if sa.sin_addr.S_un & 65535 == 0xfea9 {
return None;
}
Some(IpAddr::V4(Ipv4Addr::new(((sa.sin_addr.s_addr >> 0) & 255) as u8,
((sa.sin_addr.s_addr >> 8) & 255) as u8,
((sa.sin_addr.s_addr >> 16) & 255) as u8,
((sa.sin_addr.s_addr >> 24) & 255) as u8)))
Some(IpAddr::V4(Ipv4Addr::new(((sa.sin_addr.S_un >> 0) & 255) as u8,
((sa.sin_addr.S_un >> 8) & 255) as u8,
((sa.sin_addr.S_un >> 16) & 255) as u8,
((sa.sin_addr.S_un >> 24) & 255) as u8)))
} else if unsafe { *sockaddr }.sa_family as u32 == AF_INET6 as u32 {
let ref sa = unsafe { *(sockaddr as *const sockaddr_in6) };
// Ignore all fe80:: addresses as these are link locals
if sa.sin6_addr.s6_addr[0] == 0x80fe {
if sa.sin6_addr.s6_addr[0] == 0xfe && sa.sin6_addr.s6_addr[1] == 0x80 {
return None;
}
Some(IpAddr::V6(Ipv6Addr::new(((sa.sin6_addr.s6_addr[0] & 255) << 8) |
((sa.sin6_addr.s6_addr[0] >> 8) & 255),
((sa.sin6_addr.s6_addr[1] & 255) << 8) |
((sa.sin6_addr.s6_addr[1] >> 8) & 255),
((sa.sin6_addr.s6_addr[2] & 255) << 8) |
((sa.sin6_addr.s6_addr[2] >> 8) & 255),
((sa.sin6_addr.s6_addr[3] & 255) << 8) |
((sa.sin6_addr.s6_addr[3] >> 8) & 255),
((sa.sin6_addr.s6_addr[4] & 255) << 8) |
((sa.sin6_addr.s6_addr[4] >> 8) & 255),
((sa.sin6_addr.s6_addr[5] & 255) << 8) |
((sa.sin6_addr.s6_addr[5] >> 8) & 255),
((sa.sin6_addr.s6_addr[6] & 255) << 8) |
((sa.sin6_addr.s6_addr[6] >> 8) & 255),
((sa.sin6_addr.s6_addr[7] & 255) << 8) |
((sa.sin6_addr.s6_addr[7] >> 8) & 255))))
Some(IpAddr::V6(Ipv6Addr::new(((sa.sin6_addr.s6_addr[0] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[0] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[1] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[1] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[2] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[2] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[3] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[3] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[4] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[4] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[5] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[5] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[6] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[6] as u16 >> 8) & 255),
((sa.sin6_addr.s6_addr[7] as u16 & 255) << 8) |
((sa.sin6_addr.s6_addr[7] as u16 >> 8) & 255))))
} else {
None
}
Expand Down Expand Up @@ -406,7 +407,7 @@ mod getifaddrs_windows {
0x3e,
ptr::null(),
ifaddrs,
&mut buffersize) as c_int;
&mut buffersize);
match retcode {
ERROR_SUCCESS => break,
111 => {
Expand Down