blob: 4757a5a268c654cfbdce32fda5fae43cece8ea1b [file] [log] [blame]
//! Utils that need libc.
#![allow(dead_code)]
pub unsafe fn read_all(
fd: libc::c_int,
buf: *mut libc::c_void,
count: libc::size_t,
) -> libc::ssize_t {
assert!(count > 0);
let mut read_so_far = 0;
while read_so_far < count {
let res = libc::read(fd, buf.add(read_so_far), count - read_so_far);
if res < 0 {
return res;
}
if res == 0 {
// EOF
break;
}
read_so_far += res as libc::size_t;
}
return read_so_far as libc::ssize_t;
}
pub unsafe fn write_all(
fd: libc::c_int,
buf: *const libc::c_void,
count: libc::size_t,
) -> libc::ssize_t {
assert!(count > 0);
let mut written_so_far = 0;
while written_so_far < count {
let res = libc::write(fd, buf.add(written_so_far), count - written_so_far);
if res < 0 {
return res;
}
// Apparently a return value of 0 is just a short write, nothing special (unlike reads).
written_so_far += res as libc::size_t;
}
return written_so_far as libc::ssize_t;
}