Changeset View
Changeset View
Standalone View
Standalone View
head/sys/compat/linux/linux_socket.c
Show First 20 Lines • Show All 747 Lines • ▼ Show 20 Lines | linux_getpeername(struct thread *td, struct linux_getpeername_args *args) | ||||
if (error == 0) | if (error == 0) | ||||
error = copyout(&len, PTRIN(args->namelen), sizeof(len)); | error = copyout(&len, PTRIN(args->namelen), sizeof(len)); | ||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
linux_socketpair(struct thread *td, struct linux_socketpair_args *args) | linux_socketpair(struct thread *td, struct linux_socketpair_args *args) | ||||
{ | { | ||||
struct socketpair_args /* { | int domain, error, sv[2], type; | ||||
int domain; | |||||
int type; | |||||
int protocol; | |||||
int *rsv; | |||||
} */ bsd_args; | |||||
int error; | |||||
bsd_args.domain = linux_to_bsd_domain(args->domain); | domain = linux_to_bsd_domain(args->domain); | ||||
if (bsd_args.domain != PF_LOCAL) | if (domain != PF_LOCAL) | ||||
return (EAFNOSUPPORT); | return (EAFNOSUPPORT); | ||||
bsd_args.type = args->type & LINUX_SOCK_TYPE_MASK; | type = args->type & LINUX_SOCK_TYPE_MASK; | ||||
if (bsd_args.type < 0 || bsd_args.type > LINUX_SOCK_MAX) | if (type < 0 || type > LINUX_SOCK_MAX) | ||||
return (EINVAL); | return (EINVAL); | ||||
error = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK, | error = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK, | ||||
&bsd_args.type); | &type); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
if (args->protocol != 0 && args->protocol != PF_UNIX) | if (args->protocol != 0 && args->protocol != PF_UNIX) { | ||||
/* | /* | ||||
* Use of PF_UNIX as protocol argument is not right, | * Use of PF_UNIX as protocol argument is not right, | ||||
* but Linux does it. | * but Linux does it. | ||||
* Do not map PF_UNIX as its Linux value is identical | * Do not map PF_UNIX as its Linux value is identical | ||||
* to FreeBSD one. | * to FreeBSD one. | ||||
*/ | */ | ||||
return (EPROTONOSUPPORT); | return (EPROTONOSUPPORT); | ||||
else | } | ||||
bsd_args.protocol = 0; | error = kern_socketpair(td, domain, type, 0, sv); | ||||
bsd_args.rsv = (int *)PTRIN(args->rsv); | if (error != 0) | ||||
return (sys_socketpair(td, &bsd_args)); | return (error); | ||||
error = copyout(sv, PTRIN(args->rsv), 2 * sizeof(int)); | |||||
if (error != 0) { | |||||
(void)kern_close(td, sv[0]); | |||||
(void)kern_close(td, sv[1]); | |||||
} | |||||
return (error); | |||||
} | } | ||||
#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) | #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) | ||||
struct linux_send_args { | struct linux_send_args { | ||||
register_t s; | register_t s; | ||||
register_t msg; | register_t msg; | ||||
register_t len; | register_t len; | ||||
register_t flags; | register_t flags; | ||||
▲ Show 20 Lines • Show All 1,011 Lines • Show Last 20 Lines |