| //! 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; |
| } |