mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 03:45:50 +08:00
net_socket: add accept4 function
Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
This commit is contained in:
+55
-8
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user