summaryrefslogtreecommitdiff
path: root/src/sys
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-03-08 15:49:39 +0000
committerJake McGinty <me@jake.su>2018-03-21 13:52:57 -0600
commit3be575a7a1ca14ebcec43fdee6dba836cedcfae1 (patch)
treea6004e6b4b155982917caacbc3e3bf38f902deb2 /src/sys
parentfdc5b834b6c93a9c8b459e48be7dfc6965a77112 (diff)
downloadnix-3be575a7a1ca14ebcec43fdee6dba836cedcfae1.zip
add SO_MARK SetSockOpt for Linux
Diffstat (limited to 'src/sys')
-rw-r--r--src/sys/socket/sockopt.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/sys/socket/sockopt.rs b/src/sys/socket/sockopt.rs
index 424d7557..cbfd9249 100644
--- a/src/sys/socket/sockopt.rs
+++ b/src/sys/socket/sockopt.rs
@@ -253,6 +253,8 @@ sockopt_impl!(Both, IpTransparent, libc::SOL_IP, libc::IP_TRANSPARENT, bool);
sockopt_impl!(Both, BindAny, libc::SOL_SOCKET, libc::SO_BINDANY, bool);
#[cfg(target_os = "freebsd")]
sockopt_impl!(Both, BindAny, libc::IPPROTO_IP, libc::IP_BINDANY, bool);
+#[cfg(target_os = "linux")]
+sockopt_impl!(Both, Mark, libc::SOL_SOCKET, libc::SO_MARK, u32);
/*
*
@@ -527,4 +529,24 @@ mod test {
assert!(s_listening2);
close(s).unwrap();
}
+
+ #[cfg(target_os = "linux")]
+ #[test]
+ fn is_so_mark_functional() {
+ use super::super::*;
+ use ::unistd::Uid;
+ use ::std::io::{self, Write};
+
+ if !Uid::current().is_root() {
+ let stderr = io::stderr();
+ let mut handle = stderr.lock();
+ writeln!(handle, "SO_MARK requires root privileges. Skipping test.").unwrap();
+ return;
+ }
+
+ let s = socket(AddressFamily::Inet, SockType::Stream, SockFlag::empty(), None).unwrap();
+ setsockopt(s, super::Mark, &1337).unwrap();
+ let mark = getsockopt(s, super::Mark).unwrap();
+ assert_eq!(mark, 1337);
+ }
}