diff --git a/bsd/sys/compat/linux/linux_socket.c b/bsd/sys/compat/linux/linux_socket.c index 5846a053e0807fa7751bc6fd72b1fb05703a468d..a48b700e0a08b00c35ed62c367a202f717df6373 100644 --- a/bsd/sys/compat/linux/linux_socket.c +++ b/bsd/sys/compat/linux/linux_socket.c @@ -787,38 +787,23 @@ linux_accept4(int s, struct sockaddr * name, return (linux_accept_common(s, name, namelen, out_fd, flags)); } -/* FIXME: OSv - few functions have not been ported */ -#if 0 -struct linux_getsockname_args { - int s; - l_uintptr_t addr; - l_uintptr_t namelen; -}; - -static int -linux_getsockname(struct thread *td, struct linux_getsockname_args *args) +int +linux_getsockname(int s, struct sockaddr *addr, socklen_t *addrlen) { - struct getsockname_args /* { - int fdes; - struct sockaddr * __restrict asa; - socklen_t * __restrict alen; - } */ bsd_args; int error; - bsd_args.fdes = args->s; - /* XXX: */ - bsd_args.asa = (struct sockaddr * __restrict)PTRIN(args->addr); - bsd_args.alen = PTRIN(args->namelen); /* XXX */ - error = sys_getsockname(td, &bsd_args); - bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.asa); + error = sys_getsockname(s, addr, addrlen); + bsd_to_linux_sockaddr(addr); if (error) return (error); - error = linux_sa_put(PTRIN(args->addr)); + error = linux_sa_put((struct osockaddr *)addr); if (error) return (error); return (0); } +/* FIXME: OSv - few functions have not been ported */ +#if 0 struct linux_getpeername_args { int s; l_uintptr_t addr; diff --git a/bsd/sys/kern/uipc_syscalls.c b/bsd/sys/kern/uipc_syscalls.c index ec3a263d655f1f17b80ece067ba940f14ff9f84c..42f7e5b09569336578bcaf3c66bbc3aaffdef20a 100644 --- a/bsd/sys/kern/uipc_syscalls.c +++ b/bsd/sys/kern/uipc_syscalls.c @@ -859,50 +859,33 @@ kern_getsockopt(int s, return (error); } -/* FIXME: OSv - Implement getsockopt... */ -#if 0 /* * getsockname1() - Get socket name. */ /* ARGSUSED */ -static int -getsockname1(td, uap, compat) - struct thread *td; - struct getsockname_args /* { - int fdes; - struct sockaddr * __restrict asa; - socklen_t * __restrict alen; - } */ *uap; - int compat; +int +getsockname1(int fdes, struct sockaddr * __restrict asa, socklen_t * __restrict alen) { struct sockaddr *sa; socklen_t len; int error; - error = copyin(uap->alen, &len, sizeof(len)); - if (error) - return (error); - - error = kern_getsockname(td, uap->fdes, &sa, &len); - if (error) + error = kern_getsockname(fdes, &sa, &len); + if (error) { + *alen = 0; return (error); + } + *alen = len; if (len != 0) { -#ifdef COMPAT_OLDSOCK - if (compat) - ((struct osockaddr *)sa)->sa_family = sa->sa_family; -#endif - error = copyout(sa, uap->asa, (u_int)len); + bcopy(sa, asa, len); } - free(sa, M_SONAME); - if (error == 0) - error = copyout(&len, uap->alen, sizeof(len)); + free(sa); return (error); } int -kern_getsockname(struct thread *td, int fd, struct sockaddr **sa, - socklen_t *alen) +kern_getsockname(int fd, struct sockaddr **sa, socklen_t *alen) { struct socket *so; struct file *fp; @@ -912,8 +895,7 @@ kern_getsockname(struct thread *td, int fd, struct sockaddr **sa, if (*alen < 0) return (EINVAL); - AUDIT_ARG_FD(fd); - error = getsock_cap(td->td_proc->p_fd, fd, CAP_GETSOCKNAME, &fp, NULL); + error = getsock_cap(fd, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -933,23 +915,24 @@ kern_getsockname(struct thread *td, int fd, struct sockaddr **sa, ktrsockaddr(*sa); #endif bad: - fdrop(fp, td); + fdrop(fp); if (error && *sa) { - free(*sa, M_SONAME); + free(*sa); *sa = NULL; } return (error); } int -sys_getsockname(td, uap) - struct thread *td; - struct getsockname_args *uap; +sys_getsockname(int fdes, struct sockaddr * __restrict asa, socklen_t * __restrict alen) { - return (getsockname1(td, uap, 0)); + return (getsockname1(fdes, asa, alen)); } +/* FIXME: OSv - Implement getsockopt... */ +#if 0 + #ifdef COMPAT_OLDSOCK int ogetsockname(td, uap) diff --git a/bsd/sys/kern/uipc_syscalls_wrap.c b/bsd/sys/kern/uipc_syscalls_wrap.c index 8f50ec85cd2ec5b5604416ecb6dddfe874db6540..a4effd7ef63820d0b2642af7a0babadb6573edc8 100644 --- a/bsd/sys/kern/uipc_syscalls_wrap.c +++ b/bsd/sys/kern/uipc_syscalls_wrap.c @@ -20,6 +20,18 @@ int socketpair(int domain, int type, int protocol, int sv[2]) return 0; } +int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen) +{ + int error; + + error = linux_getsockname(sockfd, addr, addrlen); + if (error) { + errno = error; + return -1; + } + + return 0; +} int accept4(int fd, struct sockaddr *restrict addr, socklen_t *restrict len, int flg) { diff --git a/bsd/uipc_syscalls.h b/bsd/uipc_syscalls.h index 111c80bf701e2b42f378296fbb14d878b8f6b6cc..ad6aed3685ec0c506b6adcbb00290dda93ec43e1 100644 --- a/bsd/uipc_syscalls.h +++ b/bsd/uipc_syscalls.h @@ -16,6 +16,7 @@ int kern_recvit(int s, struct msghdr *mp, struct mbuf **controlp, ssize_t* bytes int kern_setsockopt(int s, int level, int name, void *val, socklen_t valsize); int kern_getsockopt(int s, int level, int name, void *val, socklen_t *valsize); int kern_socketpair(int domain, int type, int protocol, int *rsv); +int kern_getsockname(int fd, struct sockaddr **sa, socklen_t *alen); /* FreeBSD Interface */ int sys_socket(int domain, int type, int protocol, int *out_fd); @@ -35,6 +36,7 @@ int sys_shutdown(int s, int how); int sys_setsockopt(int s, int level, int name, caddr_t val, int valsize); int sys_getsockopt(int s, int level, int name, void * __restrict val, socklen_t * __restrict avalsize); +int sys_getsockname(int fdes, struct sockaddr * __restrict asa, socklen_t * __restrict alen); /* Linux Interface */ int linux_socket(int domain, int type, int protocol, int *out_fd); @@ -54,5 +56,7 @@ int linux_shutdown(int s, int how); int linux_setsockopt(int s, int level, int name, caddr_t val, int valsize); int linux_getsockopt(int s, int level, int name, void *val, socklen_t *valsize); int linux_socketpair(int domain, int type, int protocol, int* rsv); +int linux_getsockname(int s, struct sockaddr *addr, socklen_t *addrlen); + #endif /* !UIPC_SYSCALLS_H */