Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_socket.c
Show First 20 Lines • Show All 1,858 Lines • ▼ Show 20 Lines | if (name == IPV6_NEXTHOP) { | ||||
error = kern_setsockopt(td, args->s, level, | error = kern_setsockopt(td, args->s, level, | ||||
name, PTRIN(args->optval), UIO_USERSPACE, args->optlen); | name, PTRIN(args->optval), UIO_USERSPACE, args->optlen); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
linux_getsockopt_so_peergroups(struct thread *td, | |||||
struct linux_getsockopt_args *args) | |||||
{ | |||||
struct xucred xu; | |||||
socklen_t xulen, len; | |||||
int error, i; | |||||
xulen = sizeof(xu); | |||||
error = kern_getsockopt(td, args->s, 0, | |||||
LOCAL_PEERCRED, &xu, UIO_SYSSPACE, &xulen); | |||||
if (error != 0) | |||||
return (error); | |||||
len = xu.cr_ngroups * sizeof(l_gid_t); | |||||
if (args->optlen < len) { | |||||
error = copyout(&len, PTRIN(args->optlen), sizeof(len)); | |||||
if (error == 0) | |||||
error = ERANGE; | |||||
return (error); | |||||
} | |||||
/* | |||||
* "- 1" to skip the primary group. | |||||
*/ | |||||
for (i = 0; i < xu.cr_ngroups - 1; i++) { | |||||
error = copyout(xu.cr_groups + i + 1, | |||||
(void *)(args->optval + i * sizeof(l_gid_t)), | |||||
sizeof(l_gid_t)); | |||||
if (error != 0) | |||||
return (error); | |||||
} | |||||
error = copyout(&len, PTRIN(args->optlen), sizeof(len)); | |||||
return (error); | |||||
} | |||||
static int | |||||
linux_getsockopt_so_peersec(struct thread *td, | linux_getsockopt_so_peersec(struct thread *td, | ||||
struct linux_getsockopt_args *args) | struct linux_getsockopt_args *args) | ||||
{ | { | ||||
socklen_t len; | socklen_t len; | ||||
int error; | int error; | ||||
len = sizeof(SECURITY_CONTEXT_STRING); | len = sizeof(SECURITY_CONTEXT_STRING); | ||||
if (args->optlen < len) { | if (args->optlen < len) { | ||||
Show All 19 Lines | linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) | ||||
struct sockaddr *sa; | struct sockaddr *sa; | ||||
struct xucred xu; | struct xucred xu; | ||||
struct l_ucred lxu; | struct l_ucred lxu; | ||||
int error, level, name, newval; | int error, level, name, newval; | ||||
level = linux_to_bsd_sockopt_level(args->level); | level = linux_to_bsd_sockopt_level(args->level); | ||||
switch (level) { | switch (level) { | ||||
case SOL_SOCKET: | case SOL_SOCKET: | ||||
if (args->optname == LINUX_SO_PEERSEC) | switch (args->optname) { | ||||
case LINUX_SO_PEERGROUPS: | |||||
return (linux_getsockopt_so_peergroups(td, args)); | |||||
case LINUX_SO_PEERSEC: | |||||
return (linux_getsockopt_so_peersec(td, args)); | return (linux_getsockopt_so_peersec(td, args)); | ||||
default: | |||||
break; | |||||
} | |||||
name = linux_to_bsd_so_sockopt(args->optname); | name = linux_to_bsd_so_sockopt(args->optname); | ||||
switch (name) { | switch (name) { | ||||
case LOCAL_CREDS_PERSISTENT: | case LOCAL_CREDS_PERSISTENT: | ||||
level = SOL_LOCAL; | level = SOL_LOCAL; | ||||
break; | break; | ||||
case SO_RCVTIMEO: | case SO_RCVTIMEO: | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case SO_SNDTIMEO: | case SO_SNDTIMEO: | ||||
▲ Show 20 Lines • Show All 313 Lines • Show Last 20 Lines |