* Kernel version of getsockopt. * optval can be a userland or userspace. optlen is always a kernel pointer. */
| 1304 | * optval can be a userland or userspace. optlen is always a kernel pointer. |
| 1305 | */ |
| 1306 | int |
| 1307 | kern_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. |
no test coverage detected