Use getsockname() from FreeBSD

This commit is contained in:
Sebastian Huber
2013-10-14 13:24:10 +02:00
parent 0beab1e86a
commit 8989c110f5
5 changed files with 86 additions and 89 deletions

View File

@@ -63,6 +63,8 @@ int connect(int, const struct sockaddr *, socklen_t);
int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
int listen(int, int);

View File

@@ -619,93 +619,6 @@ done2:
return -1;
}
int
kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
socklen_t *alen)
{
struct socket *so;
socklen_t len;
int error;
if (*alen < 0)
return (EINVAL);
if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
error = EBADF;
return error;
}
*sa = NULL;
CURVNET_SET(so->so_vnet);
error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, sa);
CURVNET_RESTORE();
if (error)
goto bad;
if (*sa == NULL)
len = 0;
else
len = MIN(*alen, (*sa)->sa_len);
*alen = len;
#ifdef KTRACE
if (KTRPOINT(td, KTR_STRUCT))
ktrsockaddr(*sa);
#endif
bad:
if (error && *sa) {
free(*sa, M_SONAME);
*sa = NULL;
}
return (error);
}
static int
getsockname1(td, fdes, asa, alen, compat)
struct thread *td;
int fdes;
struct sockaddr * asa;
socklen_t * alen;
int compat;
{
struct sockaddr *sa;
socklen_t len;
int error;
error = copyin(alen, &len, sizeof(len));
if (error)
return (error);
error = kern_getsockname(td, fdes, &sa, &len);
if (error)
return (error);
if (len != 0) {
#ifdef COMPAT_OLDSOCK
if (compat)
((struct osockaddr *)sa)->sa_family = sa->sa_family;
#endif
error = copyout(sa, asa, (u_int)len);
}
free(sa, M_SONAME);
if (error == 0)
error = copyout(&len, alen, sizeof(len));
return (error);
}
int
getsockname (int s, struct sockaddr *name, socklen_t *namelen)
{
struct thread *td;
int error;
td = curthread;
error = getsockname1(td, s, name, namelen, 0);
if( error == 0 )
{
return error;
}
errno = error;
return -1;
}
/*
************************************************************************
* RTEMS I/O HANDLER ROUTINES *