Skip to content
Snippets Groups Projects
Commit cf92f205 authored by Guy Zana's avatar Guy Zana
Browse files

net: complete port of getsockname() and implement it

parent ca7df8bc
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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)
......
......@@ -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)
{
......
......@@ -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 */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment