Skip to content

Commit e857e29

Browse files
authored
Rollup merge of rust-lang#40317 - malbarbo:update-libc, r=alexcrichton
Update libc to 0.2.21 Update to include android aarch64 and x86 improvements.
2 parents ccce2c6 + 24be899 commit e857e29

File tree

6 files changed

+36
-11
lines changed

6 files changed

+36
-11
lines changed

src/liblibc

Submodule liblibc updated 43 files

src/libstd/os/raw.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,24 @@
1414

1515
use fmt;
1616

17-
#[cfg(any(target_os = "android",
18-
target_os = "emscripten",
17+
#[cfg(any(target_os = "emscripten",
1918
all(target_os = "linux", any(target_arch = "aarch64",
2019
target_arch = "arm",
2120
target_arch = "powerpc",
2221
target_arch = "powerpc64",
2322
target_arch = "s390x")),
23+
all(target_os = "android", any(target_arch = "aarch64",
24+
target_arch = "arm")),
2425
all(target_os = "fuchsia", target_arch = "aarch64")))]
2526
#[stable(feature = "raw_os", since = "1.1.0")] pub type c_char = u8;
26-
#[cfg(not(any(target_os = "android",
27-
target_os = "emscripten",
27+
#[cfg(not(any(target_os = "emscripten",
2828
all(target_os = "linux", any(target_arch = "aarch64",
2929
target_arch = "arm",
3030
target_arch = "powerpc",
3131
target_arch = "powerpc64",
3232
target_arch = "s390x")),
33+
all(target_os = "android", any(target_arch = "aarch64",
34+
target_arch = "arm")),
3335
all(target_os = "fuchsia", target_arch = "aarch64"))))]
3436
#[stable(feature = "raw_os", since = "1.1.0")] pub type c_char = i8;
3537
#[stable(feature = "raw_os", since = "1.1.0")] pub type c_schar = i8;

src/libstd/sys/unix/ext/net.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ impl UnixListener {
641641
let inner = Socket::new_raw(libc::AF_UNIX, libc::SOCK_STREAM)?;
642642
let (addr, len) = sockaddr_un(path)?;
643643

644-
cvt(libc::bind(*inner.as_inner(), &addr as *const _ as *const _, len))?;
644+
cvt(libc::bind(*inner.as_inner(), &addr as *const _ as *const _, len as _))?;
645645
cvt(libc::listen(*inner.as_inner(), 128))?;
646646

647647
Ok(UnixListener(inner))
@@ -920,7 +920,7 @@ impl UnixDatagram {
920920
let socket = UnixDatagram::unbound()?;
921921
let (addr, len) = sockaddr_un(path)?;
922922

923-
cvt(libc::bind(*socket.0.as_inner(), &addr as *const _ as *const _, len))?;
923+
cvt(libc::bind(*socket.0.as_inner(), &addr as *const _ as *const _, len as _))?;
924924

925925
Ok(socket)
926926
}

src/libstd/sys/unix/process/process_common.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -417,12 +417,26 @@ mod tests {
417417
}
418418
}
419419

420+
// Android with api less than 21 define sig* functions inline, so it is not
421+
// available for dynamic link. Implementing sigemptyset and sigaddset allow us
422+
// to support older Android version (independent of libc version).
423+
// The following implementations are based on https://git.io/vSkNf
424+
420425
#[cfg(not(target_os = "android"))]
421426
extern {
427+
#[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")]
428+
fn sigemptyset(set: *mut libc::sigset_t) -> libc::c_int;
429+
422430
#[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")]
423431
fn sigaddset(set: *mut libc::sigset_t, signum: libc::c_int) -> libc::c_int;
424432
}
425433

434+
#[cfg(target_os = "android")]
435+
unsafe fn sigemptyset(set: *mut libc::sigset_t) -> libc::c_int {
436+
libc::memset(set as *mut _, 0, mem::size_of::<libc::sigset_t>());
437+
return 0;
438+
}
439+
426440
#[cfg(target_os = "android")]
427441
unsafe fn sigaddset(set: *mut libc::sigset_t, signum: libc::c_int) -> libc::c_int {
428442
use slice;
@@ -450,7 +464,7 @@ mod tests {
450464

451465
let mut set: libc::sigset_t = mem::uninitialized();
452466
let mut old_set: libc::sigset_t = mem::uninitialized();
453-
t!(cvt(libc::sigemptyset(&mut set)));
467+
t!(cvt(sigemptyset(&mut set)));
454468
t!(cvt(sigaddset(&mut set, libc::SIGINT)));
455469
t!(cvt(libc::pthread_sigmask(libc::SIG_SETMASK, &set, &mut old_set)));
456470

src/libstd/sys/unix/process/process_unix.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,16 @@ impl Command {
193193
// need to clean things up now to avoid confusing the program
194194
// we're about to run.
195195
let mut set: libc::sigset_t = mem::uninitialized();
196-
t!(cvt(libc::sigemptyset(&mut set)));
196+
if cfg!(target_os = "android") {
197+
// Implementing sigemptyset allow us to support older Android
198+
// versions. See the comment about Android and sig* functions in
199+
// process_common.rs
200+
libc::memset(&mut set as *mut _ as *mut _,
201+
0,
202+
mem::size_of::<libc::sigset_t>());
203+
} else {
204+
t!(cvt(libc::sigemptyset(&mut set)));
205+
}
197206
t!(cvt(libc::pthread_sigmask(libc::SIG_SETMASK, &set,
198207
ptr::null_mut())));
199208
let ret = sys::signal(libc::SIGPIPE, libc::SIG_DFL);

src/libstd/sys_common/net.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ impl TcpListener {
339339

340340
// Bind our new socket
341341
let (addrp, len) = addr.into_inner();
342-
cvt(unsafe { c::bind(*sock.as_inner(), addrp, len) })?;
342+
cvt(unsafe { c::bind(*sock.as_inner(), addrp, len as _) })?;
343343

344344
// Start listening
345345
cvt(unsafe { c::listen(*sock.as_inner(), 128) })?;
@@ -430,7 +430,7 @@ impl UdpSocket {
430430

431431
let sock = Socket::new(addr, c::SOCK_DGRAM)?;
432432
let (addrp, len) = addr.into_inner();
433-
cvt(unsafe { c::bind(*sock.as_inner(), addrp, len) })?;
433+
cvt(unsafe { c::bind(*sock.as_inner(), addrp, len as _) })?;
434434
Ok(UdpSocket { inner: sock })
435435
}
436436

0 commit comments

Comments
 (0)