diff --git a/Cargo.toml b/Cargo.toml index c29a186b3e..16aa9d1275 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,5 +25,5 @@ path = "src/icmpd/main.rs" [dependencies] netutils = { git = "https://github.com/redox-os/netutils.git" } rand = "0.3" -redox_event = { path = "../event" } +redox_event = { git = "https://github.com/redox-os/event.git" } redox_syscall = "0.1" diff --git a/src/icmpd/packet.rs b/src/icmpd/packet.rs index ade4f6e4a0..0426d61d90 100644 --- a/src/icmpd/packet.rs +++ b/src/icmpd/packet.rs @@ -2,6 +2,15 @@ use error::{PacketResult, PacketError}; use netutils::Checksum; use std::mem; +const ECHO_REQUEST_TYPE: u8 = 8; +const ECHO_REQUEST_CODE: u8 = 0; +const ECHO_RESPONSE_TYPE: u8 = 0; +const ECHO_RESPONSE_CODE: u8 = 0; +const UNREACHABLE_TYPE: u8 = 3; +const UNREACHABLE_HOST_CODE: u8 = 1; +const UNREACHABLE_PROTO_CODE: u8 = 2; +const UNREACHABLE_PORT_CODE: u8 = 3; + #[repr(packed)] pub struct Header { icmp_type: u8, @@ -44,9 +53,7 @@ pub enum PacketKind { impl EchoHeader { pub fn new(id: u16) -> EchoHeader { - EchoHeader { - id: id.to_be(), - } + EchoHeader { id: id.to_be() } } pub fn get_id(&self) -> u16 { @@ -72,7 +79,7 @@ impl<'a> Packet<'a> { } else { let (header_bytes, payload_bytes) = bytes.split_at(mem::size_of::
()); let mut packet = Packet { - header: unsafe { mem::transmute(header_bytes.as_ptr()) }, + header: unsafe { &*(header_bytes.as_ptr() as *const Header) }, payload: payload_bytes, subheader: SubHeader::None, }; @@ -86,8 +93,10 @@ impl<'a> Packet<'a> { } let (echo_header_payload, payload) = packet.payload.split_at(mem::size_of::()); - packet.subheader = - SubHeader::Echo(unsafe { mem::transmute(echo_header_payload.as_ptr()) }); + packet.subheader = SubHeader::Echo(unsafe { + &*(echo_header_payload.as_ptr() as + *const EchoHeader) + }); packet.payload = payload; Ok(packet) } @@ -138,7 +147,7 @@ impl<'a> MutPacket<'a> { } else { let (header_bytes, payload_bytes) = bytes.split_at_mut(mem::size_of::
()); Ok(MutPacket { - header: unsafe { mem::transmute(header_bytes.as_ptr()) }, + header: unsafe { &mut *(header_bytes.as_ptr() as *mut Header) }, payload: payload_bytes, subheader: SubHeader::None, }) @@ -159,8 +168,8 @@ impl<'a> MutPacket<'a> { let new_subheader = match *subheader { SubHeader::Echo(echo_sub_header) => { let echo_sub_header_mut: &mut EchoHeader = - unsafe { mem::transmute(subheader_bytes.as_ptr()) }; - *echo_sub_header_mut = echo_sub_header.clone(); + unsafe { &mut *(subheader_bytes.as_ptr() as *mut EchoHeader) }; + *echo_sub_header_mut = *echo_sub_header; SubHeader::Echo(echo_sub_header_mut) } SubHeader::None => SubHeader::None, @@ -201,12 +210,3 @@ impl<'a> MutPacket<'a> { mem::size_of::
() + subheader.get_size() } } - -const ECHO_REQUEST_TYPE: u8 = 8; -const ECHO_REQUEST_CODE: u8 = 0; -const ECHO_RESPONSE_TYPE: u8 = 0; -const ECHO_RESPONSE_CODE: u8 = 0; -const UNREACHABLE_TYPE: u8 = 3; -const UNREACHABLE_HOST_CODE: u8 = 1; -const UNREACHABLE_PROTO_CODE: u8 = 2; -const UNREACHABLE_PORT_CODE: u8 = 3; diff --git a/src/icmpd/scheme.rs b/src/icmpd/scheme.rs index 1360ea345e..4f42e9a47f 100644 --- a/src/icmpd/scheme.rs +++ b/src/icmpd/scheme.rs @@ -64,7 +64,7 @@ impl Icmpd { break; } self.handle(&mut packet); - self.scheme_file.write(&packet)?; + self.scheme_file.write_all(&packet)?; } Ok(None) } @@ -80,8 +80,10 @@ impl Icmpd { break; } let ip_packet = Ipv4::from_bytes(&packet_buffer[..bytes_readed]) - .ok_or(Error::from_parsing_error(PacketError::NotEnoughData, - "failed to parse ip header"))?; + .ok_or_else(|| { + Error::from_parsing_error(PacketError::NotEnoughData, + "failed to parse ip header") + })?; let icmp_packet = Packet::from_bytes(&ip_packet.data) .map_err(|e| Error::from_parsing_error(e, "failed to parse ICMP packet"))?; @@ -107,7 +109,7 @@ impl Icmpd { } fn on_echo_response(&mut self, ip_packet: &Ipv4, icmp_packet: &Packet) -> Result<()> { - if let &SubHeader::Echo(echo_subheader) = icmp_packet.get_subheader() { + if let SubHeader::Echo(echo_subheader) = *icmp_packet.get_subheader() { if let Some(fd_set) = self.echo_ips .get_mut(&Ipv4Addr::from(ip_packet.header.src.bytes)) { for fd in fd_set.iter() { @@ -138,7 +140,7 @@ impl Icmpd { self.handles.insert(fd, handle); self.echo_ips .entry(ip_addr) - .or_insert_with(|| HashSet::new()) + .or_insert_with(HashSet::new) .insert(fd); Ok(fd) } @@ -164,13 +166,17 @@ impl SchemeMut for Icmpd { use std::str::FromStr; let path = str::from_utf8(url) - .or(Err(syscall::Error::new(syscall::EINVAL)))?; - let mut parts = path.split("/"); - let method = parts.next().ok_or(syscall::Error::new(syscall::EINVAL))?; + .or_else(|_| Err(syscall::Error::new(syscall::EINVAL)))?; + let mut parts = path.split('/'); + let method = parts + .next() + .ok_or_else(|| syscall::Error::new(syscall::EINVAL))?; match method { "echo" => { - let addr = parts.next().ok_or(syscall::Error::new(syscall::EINVAL))?; - let addr = Ipv4Addr::from_str(&addr) + let addr = parts + .next() + .ok_or_else(|| syscall::Error::new(syscall::EINVAL))?; + let addr = Ipv4Addr::from_str(addr) .map_err(|_| syscall::Error::new(syscall::EINVAL))?; self.open_echo(addr, flags) } @@ -182,7 +188,7 @@ impl SchemeMut for Icmpd { let (ip, ip_set) = { let handle = self.handles .get_mut(&fd) - .ok_or(syscall::Error::new(syscall::EBADF))?; + .ok_or_else(|| syscall::Error::new(syscall::EBADF))?; match handle.handle_type { HandleType::Echo => (handle.ip_addr, &mut self.echo_ips), } @@ -208,15 +214,15 @@ impl SchemeMut for Icmpd { } let handle = self.handles .get_mut(&fd) - .ok_or(syscall::Error::new(syscall::EBADF))?; + .ok_or_else(|| syscall::Error::new(syscall::EBADF))?; match handle.handle_type { HandleType::Echo => { - let echo_request = - produce_icmp_packet(handle.ip_addr, - PacketKind::EchoRequest, - &SubHeader::Echo(&EchoHeader::new(fd as u16)), - buf) - .map_err(|_| syscall::Error::new(syscall::EPROTO))?; + let echo_request = produce_icmp_packet(handle.ip_addr, + PacketKind::EchoRequest, + &SubHeader::Echo(&EchoHeader::new(fd as + u16)), + buf) + .map_err(|_| syscall::Error::new(syscall::EPROTO))?; self.icmp_file .write(&echo_request) .map_err(|_| syscall::Error::new(syscall::EPROTO)) @@ -227,7 +233,7 @@ impl SchemeMut for Icmpd { fn read(&mut self, fd: usize, buf: &mut [u8]) -> syscall::Result { let handle = self.handles .get_mut(&fd) - .ok_or(syscall::Error::new(syscall::EBADF))?; + .ok_or_else(|| syscall::Error::new(syscall::EBADF))?; match handle.handle_type { HandleType::Echo => Icmpd::read_echo(handle, buf), } @@ -236,7 +242,7 @@ impl SchemeMut for Icmpd { fn fevent(&mut self, fd: usize, events: usize) -> syscall::Result { let handle = self.handles .get_mut(&fd) - .ok_or(syscall::Error::new(syscall::EBADF))?; + .ok_or_else(|| syscall::Error::new(syscall::EBADF))?; handle.events = events; Ok(fd) }