Use listen() from FreeBSD

This commit is contained in:
Sebastian Huber 2013-10-14 10:04:29 +02:00
parent 6676de488a
commit 7c3625139f
5 changed files with 85 additions and 33 deletions

View File

@ -344,10 +344,14 @@ kern_bind(td, fd, sa)
return (error);
}
#ifndef __rtems__
/* ARGSUSED */
#ifndef __rtems__
int
listen(td, uap)
#else /* __rtems__ */
static int
rtems_bsd_listen(td, uap)
#endif /* __rtems__ */
struct thread *td;
struct listen_args /* {
int s;
@ -376,7 +380,28 @@ listen(td, uap)
}
return(error);
}
#ifdef __rtems__
int
listen(int socket, int backlog)
{
struct thread *td = rtems_bsd_get_curthread_or_null();
struct listen_args ua = {
.s = socket,
.backlog = backlog
};
int error;
if (td != NULL) {
error = rtems_bsd_listen(td, &ua);
} else {
error = ENOMEM;
}
return rtems_bsd_error_to_status_and_errno(error);
}
#endif /* __rtems__ */
#ifndef __rtems__
/*
* accept1()
*/

View File

@ -388,10 +388,12 @@ struct setsockopt_args {
char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
char valsize_l_[PADL_(int)]; int valsize; char valsize_r_[PADR_(int)];
};
#endif /* __rtems__ */
struct listen_args {
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
char backlog_l_[PADL_(int)]; int backlog; char backlog_r_[PADR_(int)];
};
#ifndef __rtems__
struct gettimeofday_args {
char tp_l_[PADL_(struct timeval *)]; struct timeval * tp; char tp_r_[PADR_(struct timeval *)];
char tzp_l_[PADL_(struct timezone *)]; struct timezone * tzp; char tzp_r_[PADR_(struct timezone *)];

View File

@ -59,6 +59,8 @@ int bind(int, const struct sockaddr *, socklen_t);
int connect(int, const struct sockaddr *, socklen_t);
int listen(int, int);
int shutdown(int, int);
int socket(int, int, int);

View File

@ -165,38 +165,6 @@ sockargs(mp, buf, buflen, type)
*********************************************************************
*/
int
listen (int s, int backlog)
{
struct thread *td;
struct socket *so;
int error = 0;
if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
error = EBADF;
}
if( error == 0 )
{
td = curthread;
#ifdef MAC
error = mac_socket_check_listen(td->td_ucred, so);
if (error == 0) {
#endif
CURVNET_SET(so->so_vnet);
error = solisten(so, backlog, td);
CURVNET_RESTORE();
#ifdef MAC
}
#endif
}
if( error == 0 )
{
return error;
}
errno = error;
return -1;
}
int
kern_accept(struct thread *td, int s, struct sockaddr **name, socklen_t *namelen)
{

View File

@ -622,6 +622,60 @@ test_socket_connect(void)
assert(rtems_resource_snapshot_check(&snapshot));
}
static void
no_mem_socket_listen(int fd)
{
int rv;
errno = 0;
rv = listen(fd, 0);
assert(rv == -1);
assert(errno == ENOMEM);
}
static void
test_socket_listen(void)
{
rtems_resource_snapshot snapshot;
int sd;
int rv;
puts("test socket listen");
rtems_resource_snapshot_take(&snapshot);
sd = socket(PF_INET, SOCK_DGRAM, 0);
assert(sd >= 0);
do_no_mem_test(no_mem_socket_listen, sd);
errno = 0;
rv = listen(sd, 0);
assert(rv == -1);
assert(errno == EOPNOTSUPP);
rv = close(sd);
assert(rv == 0);
errno = 0;
rv = listen(sd, 0);
assert(rv == -1);
assert(errno == EBADF);
sd = socket(PF_INET, SOCK_STREAM, 0);
assert(sd >= 0);
errno = 0;
rv = listen(sd, 0);
assert(rv == -1);
assert(errno == EADDRNOTAVAIL);
rv = close(sd);
assert(rv == 0);
assert(rtems_resource_snapshot_check(&snapshot));
}
static void
test_main(void)
{
@ -633,6 +687,7 @@ test_main(void)
test_socket_ioctl();
test_socket_bind();
test_socket_connect();
test_socket_listen();
puts("*** END OF " TEST_NAME " TEST ***");
exit(0);