message: Fix _IONBF crashing when reading
diff: @@ -74,7 +74,11 @@ impl FILE {
  self.flags |= constants::F_ERR;
  return false;
  }
  - self.read = Some((self.buf.len() - 1, self.buf.len() - 1));
  + self.read = if self.buf.len() == 0 {
  + Some((0, 0))
  + } else {
  + Some((self.buf.len() - 1, self.buf.len() - 1))
  + };
  if self.flags & constants::F_EOF > 0 {
  false
  } else {
  @@ -343,7 +347,7 @@ pub extern "C" fn fgetpos(stream: &mut FILE, pos: Option<&mut fpos_t>) -> c_int
  pub extern "C" fn fgets(s: *mut c_char, n: c_int, stream: &mut FILE) -> *mut c_char {
  use core::slice;
  flockfile(stream);
  - let st = unsafe { slice::from_raw_parts_mut(s, n as usize) };
  + let st = unsafe { slice::from_raw_parts_mut(s as *mut u8, n as usize) };
  let mut len = n;
  @@ -372,14 +376,18 @@ pub extern "C" fn fgets(s: *mut c_char, n: c_int, stream: &mut FILE) -> *mut c_c
  let mut idiff = 0usize;
  for _ in (0..(len - 1) as usize).take_while(|x| rpos + x < rend) {
  let pos = (n - len) as usize;
  - st[pos] = stream.buf[rpos + idiff] as i8;
  + st[pos] = stream.buf[rpos + idiff];
  idiff += 1;
  len -= 1;
  - if st[pos] == b'\n' as i8 || st[pos] == stream.buf_char {
  + if st[pos] == b'\n' || st[pos] as i8 == stream.buf_char {
  break 'outer;
  }
  }
  stream.read = Some((rpos + idiff, rend));
  + if rend - rpos == 0 {
  + len -= stream.read(&mut st[(len as usize)..]) as i32;
  + break;
  + }
  if len <= 1 {
  break;
  }
  @@ -856,6 +864,7 @@ pub extern "C" fn setvbuf(stream: &mut FILE, buf: *mut c_char, mode: c_int, size
  if mode != _IONBF {
  vec![0u8; 1]
  } else {
  + stream.unget = 0;
  if let Some(_) = stream.write {
  stream.write = Some((0, 0, 0));
  } else if let Some(_) = stream.read {
  