@@ -253,6 +253,8 @@ sockopt_impl!(Both, IpTransparent, libc::SOL_IP, libc::IP_TRANSPARENT, bool);
253
253
sockopt_impl ! ( Both , BindAny , libc:: SOL_SOCKET , libc:: SO_BINDANY , bool ) ;
254
254
#[ cfg( target_os = "freebsd" ) ]
255
255
sockopt_impl ! ( Both , BindAny , libc:: IPPROTO_IP , libc:: IP_BINDANY , bool ) ;
256
+ #[ cfg( target_os = "linux" ) ]
257
+ sockopt_impl ! ( Both , Mark , libc:: SOL_SOCKET , libc:: SO_MARK , u32 ) ;
256
258
257
259
/*
258
260
*
@@ -527,4 +529,24 @@ mod test {
527
529
assert ! ( s_listening2) ;
528
530
close ( s) . unwrap ( ) ;
529
531
}
532
+
533
+ #[ cfg( target_os = "linux" ) ]
534
+ #[ test]
535
+ fn is_so_mark_functional ( ) {
536
+ use super :: super :: * ;
537
+ use :: unistd:: Uid ;
538
+ use :: std:: io:: { self , Write } ;
539
+
540
+ if !Uid :: current ( ) . is_root ( ) {
541
+ let stderr = io:: stderr ( ) ;
542
+ let mut handle = stderr. lock ( ) ;
543
+ writeln ! ( handle, "SO_MARK requires root privileges. Skipping test." ) . unwrap ( ) ;
544
+ return ;
545
+ }
546
+
547
+ let s = socket ( AddressFamily :: Inet , SockType :: Stream , SockFlag :: empty ( ) , None ) . unwrap ( ) ;
548
+ setsockopt ( s, super :: Mark , & 1337 ) . unwrap ( ) ;
549
+ let mark = getsockopt ( s, super :: Mark ) . unwrap ( ) ;
550
+ assert_eq ! ( mark, 1337 ) ;
551
+ }
530
552
}
0 commit comments