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 */