(
fd: i32,
level: u32,
optname: u32,
optval: UserPtr<u8>,
optlen: UserPtr<socklen_t>,
)
| 113 | } |
| 114 | |
| 115 | pub fn sys_getsockopt( |
| 116 | fd: i32, |
| 117 | level: u32, |
| 118 | optname: u32, |
| 119 | optval: UserPtr<u8>, |
| 120 | optlen: UserPtr<socklen_t>, |
| 121 | ) -> AxResult<isize> { |
| 122 | let optlen = optlen.get_as_mut()?; |
| 123 | debug!( |
| 124 | "sys_getsockopt <= fd: {}, level: {}, optname: {}, optval: {:?}, optlen: {}", |
| 125 | fd, |
| 126 | level, |
| 127 | optname, |
| 128 | optval.address(), |
| 129 | optlen, |
| 130 | ); |
| 131 | |
| 132 | fn get<'a, T: 'static>(val: UserPtr<u8>, len: &mut socklen_t) -> AxResult<&'a mut T> { |
| 133 | if (*len as usize) < size_of::<T>() { |
| 134 | return Err(AxError::InvalidInput); |
| 135 | } |
| 136 | *len = size_of::<T>() as socklen_t; |
| 137 | val.cast().get_as_mut() |
| 138 | } |
| 139 | |
| 140 | let socket = Socket::from_fd(fd)?; |
| 141 | macro_rules! dispatch { |
| 142 | ($which:ident) => { |
| 143 | socket.get_option(GetSocketOption::$which(get(optval, optlen)?))?; |
| 144 | }; |
| 145 | ($which:ident as $conv:ty) => { |
| 146 | let mut val = Default::default(); |
| 147 | socket.get_option(GetSocketOption::$which(&mut val))?; |
| 148 | *get(optval, optlen)? = <$conv>::rust_to_sys(val)?; |
| 149 | }; |
| 150 | } |
| 151 | call_dispatch!(dispatch, (level, optname)); |
| 152 | |
| 153 | Ok(0) |
| 154 | } |
| 155 | |
| 156 | pub fn sys_setsockopt( |
| 157 | fd: i32, |
no test coverage detected