fix another crash
This commit is contained in:
parent
4a9cbbcfc0
commit
c4c29af38c
1 changed files with 21 additions and 6 deletions
|
@ -6,12 +6,27 @@ use std::{
|
||||||
|
|
||||||
use crate::io_sync;
|
use crate::io_sync;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
enum Broken {
|
||||||
|
OsErr(i32),
|
||||||
|
DirectErr(ErrorKind),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Broken> for Error {
|
||||||
|
fn from(value: Broken) -> Self {
|
||||||
|
match value {
|
||||||
|
Broken::OsErr(x) => Error::from_raw_os_error(x),
|
||||||
|
Broken::DirectErr(x) => Error::from(x),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) struct SocketAdapter {
|
pub(crate) struct SocketAdapter {
|
||||||
pub(crate) internal: TcpStream,
|
pub(crate) internal: TcpStream,
|
||||||
written: usize,
|
written: usize,
|
||||||
to_write: usize,
|
to_write: usize,
|
||||||
write: [u8; 4096],
|
write: [u8; 4096],
|
||||||
broken: Option<i32>,
|
broken: Option<Broken>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SocketAdapter {
|
impl SocketAdapter {
|
||||||
|
@ -27,7 +42,7 @@ impl SocketAdapter {
|
||||||
|
|
||||||
pub fn write_later(&mut self, buf: &[u8]) -> Result<(), Error> {
|
pub fn write_later(&mut self, buf: &[u8]) -> Result<(), Error> {
|
||||||
if let Some(ref x) = self.broken {
|
if let Some(ref x) = self.broken {
|
||||||
return Err(Error::from_raw_os_error(*x));
|
return Err(Error::from(*x));
|
||||||
}
|
}
|
||||||
let lidx = self.to_write + self.written + buf.len();
|
let lidx = self.to_write + self.written + buf.len();
|
||||||
if lidx > self.write.len() && lidx - self.to_write < self.write.len() {
|
if lidx > self.write.len() && lidx - self.to_write < self.write.len() {
|
||||||
|
@ -36,7 +51,7 @@ impl SocketAdapter {
|
||||||
self.written = 0;
|
self.written = 0;
|
||||||
}
|
}
|
||||||
let Some(x) = self.write.get_mut(self.to_write + self.written..self.to_write + self.written + buf.len()) else {
|
let Some(x) = self.write.get_mut(self.to_write + self.written..self.to_write + self.written + buf.len()) else {
|
||||||
self.broken = Some(Error::from(ErrorKind::TimedOut).raw_os_error().unwrap());
|
self.broken = Some(Broken::DirectErr(ErrorKind::TimedOut));
|
||||||
return Err(ErrorKind::TimedOut.into());
|
return Err(ErrorKind::TimedOut.into());
|
||||||
};
|
};
|
||||||
x.copy_from_slice(buf);
|
x.copy_from_slice(buf);
|
||||||
|
@ -47,7 +62,7 @@ impl SocketAdapter {
|
||||||
pub fn write(&mut self, buf: &[u8]) -> Result<(), Error> {
|
pub fn write(&mut self, buf: &[u8]) -> Result<(), Error> {
|
||||||
self.write_later(buf)?;
|
self.write_later(buf)?;
|
||||||
if let Err(x) = self.update() {
|
if let Err(x) = self.update() {
|
||||||
self.broken = Some(x.raw_os_error().unwrap());
|
self.broken = Some(Broken::OsErr(x.raw_os_error().unwrap()));
|
||||||
Err(x)
|
Err(x)
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -56,7 +71,7 @@ impl SocketAdapter {
|
||||||
|
|
||||||
pub fn update(&mut self) -> Result<(), Error> {
|
pub fn update(&mut self) -> Result<(), Error> {
|
||||||
if let Some(ref x) = self.broken {
|
if let Some(ref x) = self.broken {
|
||||||
return Err(Error::from_raw_os_error(*x));
|
return Err(Error::from(*x));
|
||||||
}
|
}
|
||||||
if self.to_write == 0 {
|
if self.to_write == 0 {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
@ -77,7 +92,7 @@ impl SocketAdapter {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Err(x) => {
|
Err(x) => {
|
||||||
self.broken = Some(x.raw_os_error().unwrap());
|
self.broken = Some(Broken::OsErr(x.raw_os_error().unwrap()));
|
||||||
Err(x)
|
Err(x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue