Fix android
diff --git a/libc-test/build.rs b/libc-test/build.rs
index 3bc7782..d7ee75b 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -9,18 +9,19 @@
let windows = target.contains("windows");
let mingw = target.contains("windows-gnu");
let linux = target.contains("unknown-linux");
+ let android = target.contains("android");
let mut cfg = ctest::TestGenerator::new();
// Pull in extra goodies on linux/mingw
if target.contains("unknown-linux-gnu") {
cfg.define("_GNU_SOURCE", None);
- } else if target.contains("windows") {
+ } else if windows {
cfg.define("_WIN32_WINNT", Some("0x8000"));
}
// Android doesn't actually have in_port_t but it's much easier if we
// provide one for us to test against
- if target.contains("android") {
+ if android {
cfg.define("in_port_t", Some("uint16_t"));
}
@@ -39,13 +40,12 @@
if target.contains("apple-darwin") {
cfg.header("mach-o/dyld.h");
cfg.header("mach/mach_time.h");
- } else if target.contains("unknown-linux") ||
- target.contains("android") {
+ } else if linux || android {
cfg.header("linux/if_packet.h");
cfg.header("net/ethernet.h");
}
- if target.contains("windows") {
+ if windows {
cfg.header("winsock2.h"); // must be before windows.h
cfg.header("direct.h");
@@ -67,6 +67,7 @@
cfg.header("netinet/ip.h");
cfg.header("netinet/tcp.h");
cfg.header("pthread.h");
+ cfg.header("dlfcn.h");
cfg.header("signal.h");
cfg.header("string.h");
cfg.header("sys/file.h");
@@ -81,13 +82,15 @@
cfg.header("utime.h");
cfg.header("pwd.h");
cfg.header("grp.h");
+ cfg.header("malloc.h");
- if target.contains("android") {
+ if android {
cfg.header("arpa/inet.h");
} else {
cfg.header("glob.h");
cfg.header("ifaddrs.h");
cfg.header("sys/sysctl.h");
+ cfg.header("execinfo.h");
}
}
@@ -193,9 +196,13 @@
"getrlimit" | // non-int in 1st arg
"setrlimit" | // non-int in 1st arg
- "gettimeofday" | // typed 2nd arg on linux
"strerror_r" if linux => true, // actually xpg-something-or-other
+ // typed 2nd arg on linux and android
+ "gettimeofday" if linux || android => true,
+
+ "dlerror" if android => true, // const-ness is added
+
_ => false,
}
});
diff --git a/src/lib.rs b/src/lib.rs
index 8ee87ea..8d0211a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -150,6 +150,7 @@
base: c_int) -> c_ulong;
pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
pub fn malloc(size: size_t) -> *mut c_void;
+ pub fn memalign(align: size_t, size: size_t) -> *mut c_void;
pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
pub fn free(p: *mut c_void);
pub fn exit(status: c_int) -> !;
diff --git a/src/unix/mod.rs b/src/unix/mod.rs
index 2dabfd1..eee5289 100644
--- a/src/unix/mod.rs
+++ b/src/unix/mod.rs
@@ -297,8 +297,8 @@
pub fn ftruncate(fd: c_int, length: off_t) -> c_int;
- pub fn signal(signum: c_int,
- handler: sighandler_t) -> sighandler_t;
+ #[cfg_attr(target_os = "android", link_name = "bsd_signal")]
+ pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t;
pub fn getrlimit(resource: c_int, rlim: *mut rlimit) -> c_int;
pub fn setrlimit(resource: c_int, rlim: *const rlimit) -> c_int;
@@ -310,70 +310,7 @@
-> *mut ::c_char;
pub fn flock(fd: c_int, operation: c_int) -> c_int;
-}
-// TODO: get rid of this #[cfg(not(...))]
-#[cfg(not(target_os = "android"))]
-extern {
- pub fn getifaddrs(ifap: *mut *mut ifaddrs) -> c_int;
- pub fn freeifaddrs(ifa: *mut ifaddrs);
- pub fn glob(pattern: *const c_char,
- flags: c_int,
- errfunc: ::dox::Option<extern "C" fn(epath: *const c_char,
- errno: c_int) -> c_int>,
- pglob: *mut glob_t) -> c_int;
- pub fn globfree(pglob: *mut glob_t);
-
- pub fn posix_madvise(addr: *mut ::c_void, len: size_t, advice: c_int)
- -> c_int;
-
- pub fn shm_unlink(name: *const c_char) -> c_int;
-
- #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
- link_name = "seekdir$INODE64")]
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "seekdir$INODE64$UNIX2003")]
- pub fn seekdir(dirp: *mut ::DIR, loc: c_long);
-
- #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
- link_name = "telldir$INODE64")]
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "telldir$INODE64$UNIX2003")]
- pub fn telldir(dirp: *mut ::DIR) -> c_long;
-
- pub fn getsid(pid: pid_t) -> pid_t;
- pub fn madvise(addr: *mut ::c_void, len: size_t, advice: c_int)
- -> c_int;
- pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "putenv$UNIX2003")]
- pub fn putenv(string: *mut c_char) -> c_int;
- pub fn readlink(path: *const c_char,
- buf: *mut c_char,
- bufsz: size_t)
- -> ssize_t;
-
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "msync$UNIX2003")]
- pub fn msync(addr: *mut ::c_void, len: size_t, flags: c_int) -> c_int;
- pub fn sysconf(name: c_int) -> c_long;
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "usleep$UNIX2003")]
- pub fn usleep(secs: c_uint) -> c_int;
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "recvfrom$UNIX2003")]
- pub fn recvfrom(socket: c_int, buf: *mut ::c_void, len: size_t,
- flags: c_int, addr: *mut sockaddr,
- addrlen: *mut socklen_t) -> ssize_t;
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "send$UNIX2003")]
- pub fn send(socket: c_int, buf: *const ::c_void, len: size_t,
- flags: c_int) -> ssize_t;
- #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
- link_name = "recv$UNIX2003")]
- pub fn recv(socket: c_int, buf: *mut ::c_void, len: size_t,
- flags: c_int) -> ssize_t;
- pub fn mkfifo(path: *const c_char, mode: mode_t) -> c_int;
pub fn gettimeofday(tp: *mut ::timeval,
tz: *mut ::c_void) -> ::c_int;
@@ -443,19 +380,94 @@
oldact: *mut sigaction) -> ::c_int;
pub fn sigaltstack(ss: *const sigaltstack,
oss: *mut sigaltstack) -> ::c_int;
- pub fn sigemptyset(set: *mut sigset_t) -> ::c_int;
-
- pub fn getpwuid_r(uid: ::uid_t,
- pwd: *mut passwd,
- buf: *mut ::c_char,
- buflen: ::size_t,
- result: *mut *mut passwd) -> ::c_int;
pub fn utimes(filename: *const ::c_char,
times: *const ::timeval) -> ::c_int;
pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char;
pub fn setgroups(ngroups: ::size_t,
ptr: *const ::gid_t) -> ::c_int;
+ pub fn dlopen(filename: *const ::c_char,
+ flag: ::c_int) -> *mut ::c_void;
+ pub fn dlerror() -> *mut ::c_char;
+ pub fn dlsym(handle: *mut ::c_void,
+ symbol: *const ::c_char) -> *mut ::c_void;
+ pub fn dlclose(handle: *mut ::c_void) -> ::c_int;
+}
+
+// TODO: get rid of this #[cfg(not(...))]
+#[cfg(not(target_os = "android"))]
+extern {
+ pub fn getifaddrs(ifap: *mut *mut ifaddrs) -> c_int;
+ pub fn freeifaddrs(ifa: *mut ifaddrs);
+ pub fn glob(pattern: *const c_char,
+ flags: c_int,
+ errfunc: ::dox::Option<extern "C" fn(epath: *const c_char,
+ errno: c_int) -> c_int>,
+ pglob: *mut glob_t) -> c_int;
+ pub fn globfree(pglob: *mut glob_t);
+
+ pub fn posix_madvise(addr: *mut ::c_void, len: size_t, advice: c_int)
+ -> c_int;
+
+ pub fn shm_unlink(name: *const c_char) -> c_int;
+
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
+ link_name = "seekdir$INODE64")]
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "seekdir$INODE64$UNIX2003")]
+ pub fn seekdir(dirp: *mut ::DIR, loc: c_long);
+
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
+ link_name = "telldir$INODE64")]
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "telldir$INODE64$UNIX2003")]
+ pub fn telldir(dirp: *mut ::DIR) -> c_long;
+
+ pub fn getsid(pid: pid_t) -> pid_t;
+ pub fn madvise(addr: *mut ::c_void, len: size_t, advice: c_int)
+ -> c_int;
+ pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "putenv$UNIX2003")]
+ pub fn putenv(string: *mut c_char) -> c_int;
+ pub fn readlink(path: *const c_char,
+ buf: *mut c_char,
+ bufsz: size_t)
+ -> ssize_t;
+
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "msync$UNIX2003")]
+ pub fn msync(addr: *mut ::c_void, len: size_t, flags: c_int) -> c_int;
+ pub fn sysconf(name: c_int) -> c_long;
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "usleep$UNIX2003")]
+ pub fn usleep(secs: c_uint) -> c_int;
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "recvfrom$UNIX2003")]
+ pub fn recvfrom(socket: c_int, buf: *mut ::c_void, len: size_t,
+ flags: c_int, addr: *mut sockaddr,
+ addrlen: *mut socklen_t) -> ssize_t;
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "send$UNIX2003")]
+ pub fn send(socket: c_int, buf: *const ::c_void, len: size_t,
+ flags: c_int) -> ssize_t;
+ #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+ link_name = "recv$UNIX2003")]
+ pub fn recv(socket: c_int, buf: *mut ::c_void, len: size_t,
+ flags: c_int) -> ssize_t;
+ pub fn mkfifo(path: *const c_char, mode: mode_t) -> c_int;
+
+ pub fn getpwuid_r(uid: ::uid_t,
+ pwd: *mut passwd,
+ buf: *mut ::c_char,
+ buflen: ::size_t,
+ result: *mut *mut passwd) -> ::c_int;
+ pub fn backtrace(buf: *mut *mut ::c_void,
+ sz: ::c_int) -> ::c_int;
+ pub fn posix_memalign(memptr: *mut *mut ::c_void,
+ align: ::size_t,
+ size: ::size_t) -> ::c_int;
+ pub fn sigemptyset(set: *mut sigset_t) -> ::c_int;
}
cfg_if! {
diff --git a/src/unix/notbsd/android/b32.rs b/src/unix/notbsd/android/b32.rs
new file mode 100644
index 0000000..2f3de7b
--- /dev/null
+++ b/src/unix/notbsd/android/b32.rs
@@ -0,0 +1,8 @@
+s! {
+ pub struct sigaction {
+ pub sa_sigaction: ::sighandler_t,
+ pub sa_mask: ::sigset_t,
+ pub sa_flags: ::c_ulong,
+ pub sa_restorer: Option<extern fn()>,
+ }
+}
diff --git a/src/unix/notbsd/android/b64.rs b/src/unix/notbsd/android/b64.rs
new file mode 100644
index 0000000..45dd78c
--- /dev/null
+++ b/src/unix/notbsd/android/b64.rs
@@ -0,0 +1,8 @@
+s! {
+ pub struct sigaction {
+ pub sa_flags: ::c_uint,
+ pub sa_sigaction: sighandler_t,
+ pub sa_mask: sigset_t,
+ _restorer: *mut ::c_void,
+ }
+}
diff --git a/src/unix/notbsd/android.rs b/src/unix/notbsd/android/mod.rs
similarity index 93%
rename from src/unix/notbsd/android.rs
rename to src/unix/notbsd/android/mod.rs
index 6f4833c..78e9898 100644
--- a/src/unix/notbsd/android.rs
+++ b/src/unix/notbsd/android/mod.rs
@@ -91,27 +91,6 @@
pub si_errno: ::c_int,
pub si_code: ::c_int,
pub _pad: [::c_int; 29],
- _align: [u64; 0],
- }
-}
-
-#[cfg(target_pointer_width = "32")]
-s!{
- pub struct sigaction {
- pub sa_sigaction: sighandler_t,
- pub sa_flags: libc::c_ulong,
- _restorer: *mut libc::c_void,
- pub sa_mask: sigset_t,
- }
-}
-
-#[cfg(target_pointer_width = "64")]
-s!{
- pub struct sigaction {
- pub sa_flags: libc::c_uint,
- pub sa_sigaction: sighandler_t,
- pub sa_mask: sigset_t,
- _restorer: *mut libc::c_void,
}
}
@@ -230,3 +209,17 @@
pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
flags: ::c_uint) -> ::ssize_t;
}
+
+cfg_if! {
+ if #[cfg(target_pointer_width = "32")] {
+ mod b32;
+ pub use self::b32::*;
+ } else if #[cfg(target_pointer_width = "64")] {
+ mod b64;
+ pub use self::b64::*;
+ } else {
+ // ...
+ }
+}
+
+