mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-07-24 02:32:09 +08:00
Use listen() from FreeBSD
This commit is contained in:
parent
6676de488a
commit
7c3625139f
@ -344,10 +344,14 @@ kern_bind(td, fd, sa)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __rtems__
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
|
#ifndef __rtems__
|
||||||
int
|
int
|
||||||
listen(td, uap)
|
listen(td, uap)
|
||||||
|
#else /* __rtems__ */
|
||||||
|
static int
|
||||||
|
rtems_bsd_listen(td, uap)
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct thread *td;
|
struct thread *td;
|
||||||
struct listen_args /* {
|
struct listen_args /* {
|
||||||
int s;
|
int s;
|
||||||
@ -376,7 +380,28 @@ listen(td, uap)
|
|||||||
}
|
}
|
||||||
return(error);
|
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()
|
* accept1()
|
||||||
*/
|
*/
|
||||||
|
@ -388,10 +388,12 @@ struct setsockopt_args {
|
|||||||
char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
|
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)];
|
char valsize_l_[PADL_(int)]; int valsize; char valsize_r_[PADR_(int)];
|
||||||
};
|
};
|
||||||
|
#endif /* __rtems__ */
|
||||||
struct listen_args {
|
struct listen_args {
|
||||||
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
|
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
|
||||||
char backlog_l_[PADL_(int)]; int backlog; char backlog_r_[PADR_(int)];
|
char backlog_l_[PADL_(int)]; int backlog; char backlog_r_[PADR_(int)];
|
||||||
};
|
};
|
||||||
|
#ifndef __rtems__
|
||||||
struct gettimeofday_args {
|
struct gettimeofday_args {
|
||||||
char tp_l_[PADL_(struct timeval *)]; struct timeval * tp; char tp_r_[PADR_(struct timeval *)];
|
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 *)];
|
char tzp_l_[PADL_(struct timezone *)]; struct timezone * tzp; char tzp_r_[PADR_(struct timezone *)];
|
||||||
|
@ -59,6 +59,8 @@ int bind(int, const struct sockaddr *, socklen_t);
|
|||||||
|
|
||||||
int connect(int, const struct sockaddr *, socklen_t);
|
int connect(int, const struct sockaddr *, socklen_t);
|
||||||
|
|
||||||
|
int listen(int, int);
|
||||||
|
|
||||||
int shutdown(int, int);
|
int shutdown(int, int);
|
||||||
|
|
||||||
int socket(int, int, int);
|
int socket(int, int, int);
|
||||||
|
@ -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
|
int
|
||||||
kern_accept(struct thread *td, int s, struct sockaddr **name, socklen_t *namelen)
|
kern_accept(struct thread *td, int s, struct sockaddr **name, socklen_t *namelen)
|
||||||
{
|
{
|
||||||
|
@ -622,6 +622,60 @@ test_socket_connect(void)
|
|||||||
assert(rtems_resource_snapshot_check(&snapshot));
|
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
|
static void
|
||||||
test_main(void)
|
test_main(void)
|
||||||
{
|
{
|
||||||
@ -633,6 +687,7 @@ test_main(void)
|
|||||||
test_socket_ioctl();
|
test_socket_ioctl();
|
||||||
test_socket_bind();
|
test_socket_bind();
|
||||||
test_socket_connect();
|
test_socket_connect();
|
||||||
|
test_socket_listen();
|
||||||
|
|
||||||
puts("*** END OF " TEST_NAME " TEST ***");
|
puts("*** END OF " TEST_NAME " TEST ***");
|
||||||
exit(0);
|
exit(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user