net_socket: add accept4 function

Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
This commit is contained in:
zhanghongyu
2022-11-18 18:16:19 +08:00
committed by Xiang Xiao
parent 47d628d22e
commit 48c9d10336
8 changed files with 69 additions and 16 deletions
+55 -8
View File
@@ -78,6 +78,7 @@
* addrlen Input: allocated size of 'addr', Return: returned size
* of 'addr'
* newsock Location to return the accepted socket information.
* flags The flags used for initialization
*
* Returned Value:
* Returns 0 (OK) on success. On failure, it returns a negated errno value
@@ -111,7 +112,8 @@
****************************************************************************/
int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
FAR socklen_t *addrlen, FAR struct socket *newsock)
FAR socklen_t *addrlen, FAR struct socket *newsock,
int flags)
{
FAR struct socket_conn_s *conn;
int ret;
@@ -148,6 +150,10 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
conn = newsock->s_conn;
conn->s_flags |= _SF_CONNECTED;
conn->s_flags &= ~_SF_CLOSED;
if (flags & SOCK_NONBLOCK)
{
conn->s_flags |= _SF_NONBLOCK;
}
}
else
{
@@ -159,10 +165,10 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
}
/****************************************************************************
* Name: accept
* Name: accept4
*
* Description:
* The accept function is used with connection-based socket types
* The accept4 function is used with connection-based socket types
* (SOCK_STREAM, SOCK_SEQPACKET and SOCK_RDM). It extracts the first
* connection request on the queue of pending connections, creates a new
* connected socket with mostly the same properties as 'sockfd', and
@@ -190,6 +196,7 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
* addr Receives the address of the connecting client
* addrlen Input: allocated size of 'addr',
* Return: returned size of 'addr'
* flags The flags used for initialization
*
* Returned Value:
* Returns -1 on error. If it succeeds, it returns a non-negative integer
@@ -227,18 +234,26 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
*
****************************************************************************/
int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
int accept4(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen,
int flags)
{
FAR struct socket *psock;
FAR struct socket *psock = NULL;
FAR struct socket *newsock;
int oflags = O_RDWR;
int errcode;
int newfd;
int ret;
/* accept() is a cancellation point */
/* accept4() is a cancellation point */
enter_cancellation_point();
if (flags & ~(SOCK_NONBLOCK | SOCK_CLOEXEC))
{
errcode = EINVAL;
goto errout;
}
/* Get the underlying socket structure */
ret = sockfd_socket(sockfd, &psock);
@@ -258,7 +273,7 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
goto errout;
}
ret = psock_accept(psock, addr, addrlen, newsock);
ret = psock_accept(psock, addr, addrlen, newsock, flags);
if (ret < 0)
{
errcode = -ret;
@@ -269,7 +284,17 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
* cannot fail later)
*/
newfd = sockfd_allocate(newsock, O_RDWR);
if (flags & SOCK_CLOEXEC)
{
oflags |= O_CLOEXEC;
}
if (flags & SOCK_NONBLOCK)
{
oflags |= O_NONBLOCK;
}
newfd = sockfd_allocate(newsock, oflags);
if (newfd < 0)
{
errcode = ENFILE;
@@ -291,3 +316,25 @@ errout:
_SO_SETERRNO(psock, errcode);
return ERROR;
}
/****************************************************************************
* Name: accept
*
* Description:
* The accept() call is identical to accept4() with a zero flags.
*
* Input Parameters:
* sockfd The listening socket descriptor
* addr Receives the address of the connecting client
* addrlen Input: allocated size of 'addr',
* Return: returned size of 'addr'
*
* Returned Value:
* (see accept4)
*
****************************************************************************/
int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
{
return accept4(sockfd, addr, addrlen, 0);
}