diff --git a/freebsd/sys/kern/uipc_syscalls.c b/freebsd/sys/kern/uipc_syscalls.c index e4ec4baa..a52de3aa 100644 --- a/freebsd/sys/kern/uipc_syscalls.c +++ b/freebsd/sys/kern/uipc_syscalls.c @@ -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() */ diff --git a/freebsd/sys/sys/sysproto.h b/freebsd/sys/sys/sysproto.h index 93aa23b6..69365322 100644 --- a/freebsd/sys/sys/sysproto.h +++ b/freebsd/sys/sys/sysproto.h @@ -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 *)]; diff --git a/rtemsbsd/include/machine/rtems-bsd-syscall-api.h b/rtemsbsd/include/machine/rtems-bsd-syscall-api.h index 01d95894..fc45b7dc 100644 --- a/rtemsbsd/include/machine/rtems-bsd-syscall-api.h +++ b/rtemsbsd/include/machine/rtems-bsd-syscall-api.h @@ -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); diff --git a/rtemsbsd/rtems/rtems-bsd-syscalls.c b/rtemsbsd/rtems/rtems-bsd-syscalls.c index 641e55c3..d9c84afc 100644 --- a/rtemsbsd/rtems/rtems-bsd-syscalls.c +++ b/rtemsbsd/rtems/rtems-bsd-syscalls.c @@ -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) { diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c index b34c5fd5..21bd869b 100644 --- a/testsuite/syscalls01/test_main.c +++ b/testsuite/syscalls01/test_main.c @@ -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);