summary refs log tree commit diff
path: root/net_util
diff options
context:
space:
mode:
authorStephen Barber <smbarber@chromium.org>2017-08-07 16:15:10 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-08-09 11:47:55 -0700
commit604d989d7e8f7a159e160b86302d41aa2ddd4f35 (patch)
tree9d040689c1f2bf18e4f86d761751efe365bbe24d /net_util
parent2fb1969902f8b81466c21df02dfc283732998bbf (diff)
downloadcrosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar.gz
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar.bz2
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar.lz
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar.xz
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.tar.zst
crosvm-604d989d7e8f7a159e160b86302d41aa2ddd4f35.zip
net_util: implement Read, Write, and Pollable for Tap
BUG=none
TEST=none

Change-Id: I1baf242a605ee6ff8e3bcc26e49042c3c2dd8cbb
Signed-off-by: Stephen Barber <smbarber@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/604935
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'net_util')
-rw-r--r--net_util/src/lib.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/net_util/src/lib.rs b/net_util/src/lib.rs
index 5ef4cd9..41ca236 100644
--- a/net_util/src/lib.rs
+++ b/net_util/src/lib.rs
@@ -7,11 +7,13 @@ extern crate net_sys;
 extern crate sys_util;
 
 use std::fs::File;
+use std::io::{Read, Write, Result as IoResult};
 use std::mem;
 use std::net;
 use std::os::raw::*;
 use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
 
+use sys_util::Pollable;
 use sys_util::{ioctl_with_val, ioctl_with_ref, ioctl_with_mut_ref};
 
 #[derive(Debug)]
@@ -212,12 +214,36 @@ impl Tap {
     }
 }
 
+impl Read for Tap {
+    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
+        self.tap_file.read(buf)
+    }
+}
+
+impl Write for Tap {
+    fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
+        self.tap_file.write(&buf)
+    }
+
+    fn flush(&mut self) -> IoResult<()> {
+        Ok(())
+    }
+}
+
 impl AsRawFd for Tap {
     fn as_raw_fd(&self) -> RawFd {
         self.tap_file.as_raw_fd()
     }
 }
 
+// Safe since the tap fd's lifetime lasts as long as this trait object, and the
+// tap fd is pollable.
+unsafe impl Pollable for Tap {
+    fn pollable_fd(&self) -> RawFd {
+        self.tap_file.as_raw_fd()
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;