MCPcopy Create free account
hub / github.com/F-Stack/f-stack / kern_getsockopt

Function kern_getsockopt

freebsd/kern/uipc_syscalls.c:1306–1346  ·  view source on GitHub ↗

* Kernel version of getsockopt. * optval can be a userland or userspace. optlen is always a kernel pointer. */

Source from the content-addressed store, hash-verified

1304 * optval can be a userland or userspace. optlen is always a kernel pointer.
1305 */
1306int
1307kern_getsockopt(struct thread *td, int s, int level, int name, void *val,
1308 enum uio_seg valseg, socklen_t *valsize)
1309{
1310 struct socket *so;
1311 struct file *fp;
1312 struct sockopt sopt;
1313 int error;
1314
1315 if (val == NULL)
1316 *valsize = 0;
1317 if ((int)*valsize < 0)
1318 return (EINVAL);
1319
1320 sopt.sopt_dir = SOPT_GET;
1321 sopt.sopt_level = level;
1322 sopt.sopt_name = name;
1323 sopt.sopt_val = val;
1324 sopt.sopt_valsize = (size_t)*valsize; /* checked non-negative above */
1325 switch (valseg) {
1326 case UIO_USERSPACE:
1327 sopt.sopt_td = td;
1328 break;
1329 case UIO_SYSSPACE:
1330 sopt.sopt_td = NULL;
1331 break;
1332 default:
1333 panic("kern_getsockopt called with bad valseg");
1334 }
1335
1336 AUDIT_ARG_FD(s);
1337 error = getsock_cap(td, s, &cap_getsockopt_rights,
1338 &fp, NULL, NULL);
1339 if (error == 0) {
1340 so = fp->f_data;
1341 error = sogetopt(so, &sopt);
1342 *valsize = sopt.sopt_valsize;
1343 fdrop(fp, td);
1344 }
1345 return (error);
1346}
1347
1348/*
1349 * getsockname1() - Get socket name.

Callers 3

sys_getsockoptFunction · 0.85
ff_getsockoptFunction · 0.85
ff_getsockopt_freebsdFunction · 0.85

Calls 3

getsock_capFunction · 0.85
sogetoptFunction · 0.85
panicFunction · 0.70

Tested by

no test coverage detected