Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_socket.c
Show First 20 Lines • Show All 864 Lines • ▼ Show 20 Lines | static const char *linux_netlink_names[] = { | ||||
[LINUX_NETLINK_FIB_LOOKUP] = "FIB_LOOKUP", | [LINUX_NETLINK_FIB_LOOKUP] = "FIB_LOOKUP", | ||||
[LINUX_NETLINK_NETFILTER] = "NETFILTER", | [LINUX_NETLINK_NETFILTER] = "NETFILTER", | ||||
[LINUX_NETLINK_KOBJECT_UEVENT] = "KOBJECT_UEVENT", | [LINUX_NETLINK_KOBJECT_UEVENT] = "KOBJECT_UEVENT", | ||||
}; | }; | ||||
int | int | ||||
linux_socket(struct thread *td, struct linux_socket_args *args) | linux_socket(struct thread *td, struct linux_socket_args *args) | ||||
{ | { | ||||
int domain, retval_socket, type; | int retval_socket, type; | ||||
sa_family_t domain; | |||||
type = args->type & LINUX_SOCK_TYPE_MASK; | type = args->type & LINUX_SOCK_TYPE_MASK; | ||||
if (type < 0 || type > LINUX_SOCK_MAX) | if (type < 0 || type > LINUX_SOCK_MAX) | ||||
return (EINVAL); | return (EINVAL); | ||||
retval_socket = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK, | retval_socket = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK, | ||||
&type); | &type); | ||||
if (retval_socket != 0) | if (retval_socket != 0) | ||||
return (retval_socket); | return (retval_socket); | ||||
domain = linux_to_bsd_domain(args->domain); | domain = linux_to_bsd_domain(args->domain); | ||||
if (domain == -1) { | if (domain == AF_UNKNOWN) { | ||||
/* Mask off SOCK_NONBLOCK / CLOEXEC for error messages. */ | /* Mask off SOCK_NONBLOCK / CLOEXEC for error messages. */ | ||||
type = args->type & LINUX_SOCK_TYPE_MASK; | type = args->type & LINUX_SOCK_TYPE_MASK; | ||||
if (args->domain == LINUX_AF_NETLINK && | if (args->domain == LINUX_AF_NETLINK && | ||||
args->protocol == LINUX_NETLINK_AUDIT) { | args->protocol == LINUX_NETLINK_AUDIT) { | ||||
; /* Do nothing, quietly. */ | ; /* Do nothing, quietly. */ | ||||
} else if (args->domain == LINUX_AF_NETLINK) { | } else if (args->domain == LINUX_AF_NETLINK) { | ||||
const char *nl_name; | const char *nl_name; | ||||
▲ Show 20 Lines • Show All 1,412 Lines • ▼ Show 20 Lines | case SO_ERROR: | ||||
len, args)); | len, args)); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
case SO_DOMAIN: | case SO_DOMAIN: | ||||
len = sizeof(newval); | len = sizeof(newval); | ||||
error = kern_getsockopt(td, args->s, level, | error = kern_getsockopt(td, args->s, level, | ||||
name, &newval, UIO_SYSSPACE, &len); | name, &newval, UIO_SYSSPACE, &len); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
newval = bsd_to_linux_domain(newval); | newval = bsd_to_linux_domain((sa_family_t)newval); | ||||
if (newval == -1) | if (newval == AF_UNKNOWN) | ||||
return (ENOPROTOOPT); | return (ENOPROTOOPT); | ||||
return (linux_sockopt_copyout(td, &newval, | return (linux_sockopt_copyout(td, &newval, | ||||
len, args)); | len, args)); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
case SO_LINGER: | case SO_LINGER: | ||||
return (linux_getsockopt_so_linger(td, args)); | return (linux_getsockopt_so_linger(td, args)); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
default: | default: | ||||
▲ Show 20 Lines • Show All 420 Lines • Show Last 20 Lines |