MCPcopy Create free account
hub / github.com/Starry-OS/StarryOS / sys_getsockopt

Function sys_getsockopt

api/src/syscall/net/opt.rs:115–154  ·  view source on GitHub ↗
(
    fd: i32,
    level: u32,
    optname: u32,
    optval: UserPtr<u8>,
    optlen: UserPtr<socklen_t>,
)

Source from the content-addressed store, hash-verified

113}
114
115pub 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
156pub fn sys_setsockopt(
157 fd: i32,

Callers 1

handle_syscallFunction · 0.85

Calls 1

get_as_mutMethod · 0.80

Tested by

no test coverage detected