Squashed commit of the following:
net/: psock_recvfrom() is an internal interface and should not set the errno nor should it be a cancellation point. net/: psock_accept() is not a cancellation point. net/: psock_getsockopt() and psock_socket*9 are an internal interfaces and should not set the errno. net/: psock_getsockopt() is an internal interface and should not set the errno. net/: psock_listen() is an internal interface and should not set the errno. net/: psock_connect(( is an internal interface and should not set the errno nor should it be a cancellation point. net/: psock_bind() is an internal interface and should not set the errno. net/: psock_accept() is an internal interface and should not set the errno.
This commit is contained in:
parent
054b147114
commit
2c2aa94b7d
@ -203,7 +203,7 @@ static int rpcclnt_receive(FAR struct rpcclnt *rpc, FAR struct sockaddr *aname,
|
||||
nbytes = psock_recvfrom(rpc->rc_so, reply, resplen, 0, aname, &fromlen);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
error = get_errno();
|
||||
error = (int)-nbytes;
|
||||
ferr("ERROR: psock_recvfrom failed: %d\n", error);
|
||||
}
|
||||
|
||||
@ -403,9 +403,9 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
error = psock_socket(saddr->sa_family, rpc->rc_sotype, IPPROTO_UDP, so);
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_socket failed: %d", errval);
|
||||
return error;
|
||||
return errval;
|
||||
}
|
||||
|
||||
so->s_crefs = 1;
|
||||
@ -422,7 +422,7 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
(const void *)&tv, sizeof(tv));
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_setsockopt failed: %d\n", errval);
|
||||
goto bad;
|
||||
}
|
||||
@ -441,10 +441,11 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
{
|
||||
tport--;
|
||||
sin.sin_port = htons(tport);
|
||||
|
||||
error = psock_bind(rpc->rc_so, (struct sockaddr *)&sin, sizeof(sin));
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_bind failed: %d\n", errval);
|
||||
}
|
||||
}
|
||||
@ -464,7 +465,7 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
error = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_connect to PMAP port failed: %d", errval);
|
||||
goto bad;
|
||||
}
|
||||
@ -493,7 +494,7 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
error = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_connect MOUNTD port failed: %d\n", errval);
|
||||
goto bad;
|
||||
}
|
||||
@ -530,7 +531,7 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
error = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (error < 0)
|
||||
{
|
||||
errval = get_errno();
|
||||
errval = -error;
|
||||
ferr("ERROR: psock_connect PMAP port failed: %d\n", errval);
|
||||
goto bad;
|
||||
}
|
||||
@ -552,8 +553,9 @@ int rpcclnt_connect(struct rpcclnt *rpc)
|
||||
sa->sin_port = htons(fxdr_unsigned(uint32_t, response.rdata.pmap.port));
|
||||
|
||||
error = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (error)
|
||||
if (error < 0)
|
||||
{
|
||||
error = -error;
|
||||
ferr("ERROR: psock_connect NFS port returns %d\n", error);
|
||||
goto bad;
|
||||
}
|
||||
@ -621,7 +623,7 @@ int rpcclnt_umount(struct rpcclnt *rpc)
|
||||
ret = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (ret < 0)
|
||||
{
|
||||
error = get_errno();
|
||||
error = -ret;
|
||||
ferr("ERROR: psock_connect failed [port=%d]: %d\n",
|
||||
ntohs(sa->sin_port), error);
|
||||
goto bad;
|
||||
@ -646,7 +648,7 @@ int rpcclnt_umount(struct rpcclnt *rpc)
|
||||
ret = psock_connect(rpc->rc_so, saddr, sizeof(*saddr));
|
||||
if (ret < 0)
|
||||
{
|
||||
error = get_errno();
|
||||
error = -ret;
|
||||
ferr("ERROR: psock_connect failed [port=%d]: %d\n",
|
||||
ntohs(sa->sin_port), error);
|
||||
goto bad;
|
||||
|
@ -127,14 +127,13 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
|
||||
|
||||
tv.tv_sec = 5;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
ret = psock_setsockopt(&session->connect, SOL_SOCKET, SO_RCVTIMEO,
|
||||
&tv, sizeof(struct timeval));
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = get_errno();
|
||||
gerr("ERROR: Failed to set receive timeout: %d\n", errcode);
|
||||
DEBUGASSERT(errcode > 0);
|
||||
return -errcode;
|
||||
gerr("ERROR: Failed to set receive timeout: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* graphics/vnc/vnc_server.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2016=-2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -176,7 +176,6 @@ static int vnc_connect(FAR struct vnc_session_s *session, int port)
|
||||
ret = psock_socket(AF_INET, SOCK_STREAM, 0, &session->listen);
|
||||
if (ret < 0)
|
||||
{
|
||||
ret = -get_errno();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -186,7 +185,6 @@ static int vnc_connect(FAR struct vnc_session_s *session, int port)
|
||||
sizeof(struct sockaddr_in));
|
||||
if (ret < 0)
|
||||
{
|
||||
ret = -get_errno();
|
||||
goto errout_with_listener;
|
||||
}
|
||||
|
||||
@ -195,7 +193,6 @@ static int vnc_connect(FAR struct vnc_session_s *session, int port)
|
||||
ret = psock_listen(&session->listen, 5);
|
||||
if (ret < 0)
|
||||
{
|
||||
ret = -get_errno();
|
||||
goto errout_with_listener;
|
||||
}
|
||||
|
||||
@ -206,7 +203,6 @@ static int vnc_connect(FAR struct vnc_session_s *session, int port)
|
||||
ret = psock_accept(&session->listen, NULL, NULL, &session->connect);
|
||||
if (ret < 0)
|
||||
{
|
||||
ret = -get_errno();
|
||||
goto errout_with_listener;
|
||||
}
|
||||
|
||||
|
@ -422,7 +422,8 @@ FAR struct socket *sockfd_socket(int sockfd);
|
||||
* psock A pointer to a user allocated socket structure to be initialized.
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error:
|
||||
*
|
||||
* EACCES
|
||||
* Permission to create a socket of the specified type and/or protocol
|
||||
@ -499,7 +500,8 @@ int psock_close(FAR struct socket *psock);
|
||||
* addrlen Length of 'addr'
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EACCES
|
||||
* The address is protected, and the user is not the superuser.
|
||||
@ -537,8 +539,8 @@ int psock_bind(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
* may be ignored so that retries succeed.
|
||||
*
|
||||
* Returned Value:
|
||||
* On success, zero is returned. On error, -1 is returned, and errno is set
|
||||
* appropriately.
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EADDRINUSE
|
||||
* Another socket is already listening on the same port.
|
||||
@ -584,8 +586,8 @@ int psock_listen(FAR struct socket *psock, int backlog);
|
||||
* newsock Location to return the accepted socket information.
|
||||
*
|
||||
* Returned Value:
|
||||
* Returns 0 (OK) on success. On failure, it returns -1 (ERROR) with the
|
||||
* errno variable set to indicate the nature of the error.
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EAGAIN or EWOULDBLOCK
|
||||
* The socket is marked non-blocking and no connections are present to
|
||||
@ -645,7 +647,8 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
|
||||
* addrlen Length of actual 'addr'
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EACCES, EPERM
|
||||
* The user tried to connect to a broadcast address without having the
|
||||
@ -847,8 +850,8 @@ ssize_t psock_sendto(FAR struct socket *psock, FAR const void *buf,
|
||||
* Returned Value:
|
||||
* On success, returns the number of characters sent. If no data is
|
||||
* available to be received and the peer has performed an orderly shutdown,
|
||||
* recv() will return 0. Otherwise, on errors, -1 is returned, and errno
|
||||
* is set appropriately:
|
||||
* recv() will return 0. Otherwise, on any failure, a negated errno value
|
||||
* is returned. One of:
|
||||
*
|
||||
* EAGAIN
|
||||
* The socket is marked non-blocking and the receive operation would block,
|
||||
@ -874,8 +877,6 @@ ssize_t psock_sendto(FAR struct socket *psock, FAR const void *buf,
|
||||
* ENOTSOCK
|
||||
* The argument sockfd does not refer to a socket.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
@ -912,6 +913,8 @@ ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
* value_len The length of the argument value
|
||||
*
|
||||
* Returned Value:
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error:
|
||||
*
|
||||
* EINVAL
|
||||
* The specified option is invalid at the specified socket 'level' or the
|
||||
@ -924,8 +927,6 @@ ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
* Insufficient resources are available in the system to complete the
|
||||
* call.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
@ -952,7 +953,8 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
* value_len The length of the argument value
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on failure
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error:
|
||||
*
|
||||
* EDOM
|
||||
* The send and receive timeout values are too big to fit into the
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/socket/accept.c
|
||||
*
|
||||
* Copyright (C) 2007-2012, 2015-2016 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2012, 2015-2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -92,8 +92,8 @@
|
||||
* newsock Location to return the accepted socket information.
|
||||
*
|
||||
* Returned Value:
|
||||
* Returns 0 (OK) on success. On failure, it returns -1 (ERROR) with the
|
||||
* errno variable set to indicate the nature of the error.
|
||||
* Returns 0 (OK) on success. On failure, it returns a negated errno value
|
||||
* to indicate the nature of the error.
|
||||
*
|
||||
* EAGAIN or EWOULDBLOCK
|
||||
* The socket is marked non-blocking and no connections are present to
|
||||
@ -125,22 +125,16 @@
|
||||
int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
|
||||
FAR socklen_t *addrlen, FAR struct socket *newsock)
|
||||
{
|
||||
int errcode;
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(psock != NULL && psock->s_conn != NULL && newsock != NULL);
|
||||
|
||||
/* Treat as a cancellation point */
|
||||
|
||||
(void)enter_cancellation_point();
|
||||
|
||||
/* May sure that the socket has been opened with socket() */
|
||||
|
||||
if (psock == NULL || psock->s_conn == NULL)
|
||||
{
|
||||
nerr("ERROR: Socket invalid or not opened\n");
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Is the socket listening for a connection? */
|
||||
@ -148,8 +142,7 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
|
||||
if (!_SS_ISLISTENING(psock->s_flags))
|
||||
{
|
||||
nerr("ERROR: Socket is not listening for a connection.\n");
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Let the address family's accept() method handle the operation */
|
||||
@ -161,7 +154,6 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: si_accept failed: %d\n", ret);
|
||||
errcode = -ret;
|
||||
goto errout_with_lock;
|
||||
}
|
||||
|
||||
@ -169,18 +161,12 @@ int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
|
||||
|
||||
newsock->s_flags |= _SF_CONNECTED;
|
||||
newsock->s_flags &= ~_SF_CLOSED;
|
||||
net_unlock();
|
||||
|
||||
leave_cancellation_point();
|
||||
return OK;
|
||||
ret = OK;
|
||||
|
||||
errout_with_lock:
|
||||
net_unlock();
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
leave_cancellation_point();
|
||||
return ERROR;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -307,11 +293,8 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
|
||||
ret = psock_accept(psock, addr, addrlen, newsock);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* The errno value has already been set */
|
||||
|
||||
sockfd_release(newfd);
|
||||
leave_cancellation_point();
|
||||
return ERROR;
|
||||
errcode = -ret;
|
||||
goto errout_with_socket;
|
||||
}
|
||||
|
||||
leave_cancellation_point();
|
||||
@ -321,8 +304,9 @@ errout_with_socket:
|
||||
sockfd_release(newfd);
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
leave_cancellation_point();
|
||||
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,8 @@
|
||||
* addrlen Length of 'addr'
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EACCES
|
||||
* The address is protected, and the user is not the superuser.
|
||||
@ -85,22 +86,18 @@
|
||||
* ENOTSOCK
|
||||
* psock is a descriptor for a file, not a socket.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_bind(FAR struct socket *psock, const struct sockaddr *addr,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
int errcode;
|
||||
int ret = OK;
|
||||
|
||||
/* Verify that the psock corresponds to valid, allocated socket */
|
||||
|
||||
if (!psock || psock->s_crefs <= 0)
|
||||
{
|
||||
errcode = ENOTSOCK;
|
||||
goto errout;
|
||||
return -ENOTSOCK;
|
||||
}
|
||||
|
||||
/* Let the address family's connect() method handle the operation */
|
||||
@ -112,15 +109,10 @@ int psock_bind(FAR struct socket *psock, const struct sockaddr *addr,
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -151,19 +143,27 @@ errout:
|
||||
* ENOTSOCK
|
||||
* sockfd is a descriptor for a file, not a socket.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
||||
{
|
||||
/* Make the socket descriptor to the underlying socket structure */
|
||||
FAR struct socket *psock;
|
||||
int ret;
|
||||
|
||||
FAR struct socket *psock = sockfd_socket(sockfd);
|
||||
/* Use the socket descriptor to get the underlying socket structure */
|
||||
|
||||
psock = sockfd_socket(sockfd);
|
||||
|
||||
/* Then let psock_bind do all of the work */
|
||||
|
||||
return psock_bind(psock, addr, addrlen);
|
||||
ret = psock_bind(psock, addr, addrlen);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET */
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/socket/connect.c
|
||||
*
|
||||
* Copyright (C) 2007-2012, 2015-2016 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2012, 2015-2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -85,7 +85,8 @@
|
||||
* addrlen Length of actual 'addr'
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EACCES, EPERM
|
||||
* The user tried to connect to a broadcast address without having the
|
||||
@ -130,27 +131,20 @@
|
||||
int psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
int errcode;
|
||||
int ret;
|
||||
|
||||
/* Treat as a cancellation point */
|
||||
|
||||
(void)enter_cancellation_point();
|
||||
|
||||
/* Verify that the psock corresponds to valid, allocated socket */
|
||||
|
||||
if (psock == NULL || psock->s_crefs <= 0)
|
||||
{
|
||||
errcode = EBADF;
|
||||
goto errout;
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
/* Make sure that an address was provided */
|
||||
|
||||
if (addr == NULL)
|
||||
{
|
||||
errcode = EFAULT;
|
||||
goto errout;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* Let the address family's connect() method handle the operation */
|
||||
@ -159,17 +153,10 @@ int psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
ret = psock->s_sockif->si_connect(psock, addr, addrlen);
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
return ret;
|
||||
}
|
||||
|
||||
leave_cancellation_point();
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
leave_cancellation_point();
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -243,6 +230,7 @@ errout:
|
||||
|
||||
int connect(int sockfd, FAR const struct sockaddr *addr, socklen_t addrlen)
|
||||
{
|
||||
FAR struct socket *psock;
|
||||
int ret;
|
||||
|
||||
/* accept() is a cancellation point */
|
||||
@ -251,11 +239,17 @@ int connect(int sockfd, FAR const struct sockaddr *addr, socklen_t addrlen)
|
||||
|
||||
/* Get the underlying socket structure */
|
||||
|
||||
FAR struct socket *psock = sockfd_socket(sockfd);
|
||||
psock = sockfd_socket(sockfd);
|
||||
|
||||
/* Then let psock_connect() do all of the work */
|
||||
|
||||
ret = psock_connect(psock, addr, addrlen);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
ret = ERROR;
|
||||
}
|
||||
|
||||
leave_cancellation_point();
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/socket/getsockopt.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2012, 2014 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2009, 2012, 2014, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -80,6 +80,8 @@
|
||||
* value_len The length of the argument value
|
||||
*
|
||||
* Returned Value:
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EINVAL
|
||||
* The specified option is invalid at the specified socket 'level' or the
|
||||
@ -92,21 +94,16 @@
|
||||
* Insufficient resources are available in the system to complete the
|
||||
* call.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
FAR void *value, FAR socklen_t *value_len)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
/* Verify that the socket option if valid (but might not be supported ) */
|
||||
|
||||
if (!_SO_GETVALID(option) || !value || !value_len)
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_USRSOCK
|
||||
@ -130,14 +127,7 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
default: /* Other options are passed to usrsock daemon. */
|
||||
{
|
||||
ret = usrsock_getsockopt(conn, level, option, value, value_len);
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
return OK;
|
||||
return usrsock_getsockopt(conn, level, option, value, value_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -168,8 +158,7 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (*value_len < sizeof(int))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Sample the current options. This is atomic operation and so
|
||||
@ -192,8 +181,7 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (*value_len < sizeof(int))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_USRSOCK
|
||||
@ -230,8 +218,7 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (*value_len < sizeof(struct timeval))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Get the timeout value. This is a atomic operation and should
|
||||
@ -265,15 +252,10 @@ int psock_getsockopt(FAR struct socket *psock, int level, int option,
|
||||
case SO_SNDLOWAT: /* Sets the minimum number of bytes to output */
|
||||
|
||||
default:
|
||||
errcode = ENOPROTOOPT;
|
||||
goto errout;
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -301,6 +283,8 @@ errout:
|
||||
* value_len The length of the argument value
|
||||
*
|
||||
* Returned Value:
|
||||
* Returns zero (OK) on success. On failure, -1 (ERROR) is returned and th
|
||||
* errno variable is set appropriately:
|
||||
*
|
||||
* EBADF
|
||||
* The 'sockfd' argument is not a valid socket descriptor.
|
||||
@ -315,13 +299,12 @@ errout:
|
||||
* Insufficient resources are available in the system to complete the
|
||||
* call.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int getsockopt(int sockfd, int level, int option, void *value, socklen_t *value_len)
|
||||
{
|
||||
FAR struct socket *psock;
|
||||
int ret;
|
||||
|
||||
/* Get the underlying socket structure */
|
||||
/* Verify that the sockfd corresponds to valid, allocated socket */
|
||||
@ -335,7 +318,14 @@ int getsockopt(int sockfd, int level, int option, void *value, socklen_t *value_
|
||||
|
||||
/* Then let psock_getsockopt() do all of the work */
|
||||
|
||||
return psock_getsockopt(psock, level, option, value, value_len);
|
||||
ret = psock_getsockopt(psock, level, option, value, value_len);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET && CONFIG_NET_SOCKOPTS */
|
||||
|
@ -71,8 +71,8 @@
|
||||
* may be ignored so that retries succeed.
|
||||
*
|
||||
* Returned Value:
|
||||
* On success, zero is returned. On error, -1 is returned, and errno is set
|
||||
* appropriately.
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error.
|
||||
*
|
||||
* EADDRINUSE
|
||||
* Another socket is already listening on the same port.
|
||||
@ -83,7 +83,6 @@
|
||||
|
||||
int psock_listen(FAR struct socket *psock, int backlog)
|
||||
{
|
||||
int errcode;
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(psock != NULL);
|
||||
@ -93,8 +92,7 @@ int psock_listen(FAR struct socket *psock, int backlog)
|
||||
if (psock == NULL || psock->s_conn == NULL)
|
||||
{
|
||||
nerr("ERROR: Invalid or unconnected socket\n");
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Let the address family's listen() method handle the operation */
|
||||
@ -104,16 +102,11 @@ int psock_listen(FAR struct socket *psock, int backlog)
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: si_listen failed: %d\n", ret);
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
return ret;
|
||||
}
|
||||
|
||||
psock->s_flags |= _SF_LISTENING;
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -153,6 +146,7 @@ int listen(int sockfd, int backlog)
|
||||
{
|
||||
FAR struct socket *psock = sockfd_socket(sockfd);
|
||||
int errcode;
|
||||
int ret;
|
||||
|
||||
/* Verify that the sockfd corresponds to valid, allocated socket */
|
||||
|
||||
@ -182,7 +176,14 @@ int listen(int sockfd, int backlog)
|
||||
* set the errno variable.
|
||||
*/
|
||||
|
||||
return psock_listen(psock, backlog);
|
||||
ret = psock_listen(psock, backlog);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
|
||||
|
@ -74,10 +74,10 @@
|
||||
* fromlen The length of the address structure
|
||||
*
|
||||
* Returned Value:
|
||||
* On success, returns the number of characters received. If no data is
|
||||
* On success, returns the number of characters sent. If no data is
|
||||
* available to be received and the peer has performed an orderly shutdown,
|
||||
* recv() will return 0. Otherwise, on errors, -1 is returned, and errno
|
||||
* is set appropriately:
|
||||
* recv() will return 0. Otherwise, on any failure, a negated errno value
|
||||
* is returned. One of:
|
||||
*
|
||||
* EAGAIN
|
||||
* The socket is marked non-blocking and the receive operation would block,
|
||||
@ -103,8 +103,6 @@
|
||||
* ENOTSOCK
|
||||
* The argument sockfd does not refer to a socket.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
@ -112,34 +110,26 @@ ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
FAR socklen_t *fromlen)
|
||||
{
|
||||
ssize_t ret;
|
||||
int errcode;
|
||||
|
||||
/* Treat as a cancellation point */
|
||||
|
||||
(void)enter_cancellation_point();
|
||||
|
||||
/* Verify that non-NULL pointers were passed */
|
||||
|
||||
#ifdef CONFIG_DEBUG_FEATURES
|
||||
if (!buf)
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (from != NULL && fromlen != NULL && *fromlen <= 0)
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Verify that the sockfd corresponds to valid, allocated socket */
|
||||
|
||||
if (psock == NULL || psock->s_crefs <= 0)
|
||||
{
|
||||
errcode = EBADF;
|
||||
goto errout;
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
/* Set the socket state to receiving */
|
||||
@ -158,20 +148,7 @@ ssize_t psock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len,
|
||||
/* Set the socket state to idle */
|
||||
|
||||
psock->s_flags = _SS_SETSTATE(psock->s_flags, _SF_IDLE);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
leave_cancellation_point();
|
||||
return ret;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
leave_cancellation_point();
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -222,8 +199,6 @@ errout:
|
||||
* ENOTSOCK
|
||||
* The argument sockfd does not refer to a socket.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
ssize_t recvfrom(int sockfd, FAR void *buf, size_t len, int flags,
|
||||
@ -243,6 +218,12 @@ ssize_t recvfrom(int sockfd, FAR void *buf, size_t len, int flags,
|
||||
/* Then let psock_recvfrom() do all of the work */
|
||||
|
||||
ret = psock_recvfrom(psock, buf, len, flags, from, fromlen);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
ret = ERROR;
|
||||
}
|
||||
|
||||
leave_cancellation_point();
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
/****************************************************************************
|
||||
* net/socket/setsockopt.c
|
||||
*
|
||||
* Copyright (C) 2007, 2008, 2011-2012, 2014-2015 Gregory Nutt. All rights
|
||||
* reserved.
|
||||
* Copyright (C) 2007, 2008, 2011-2012, 2014-2015, 2017 Gregory Nutt. All
|
||||
* rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -80,7 +80,8 @@
|
||||
* value_len The length of the argument value
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on failure
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error:
|
||||
*
|
||||
* EDOM
|
||||
* The send and receive timeout values are too big to fit into the
|
||||
@ -108,14 +109,11 @@
|
||||
int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
FAR const void *value, socklen_t value_len)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
/* Verify that the socket option if valid (but might not be supported ) */
|
||||
|
||||
if (!_SO_SETVALID(option) || !value)
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_USRSOCK
|
||||
@ -138,14 +136,7 @@ int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
default: /* Other options are passed to usrsock daemon. */
|
||||
{
|
||||
ret = usrsock_setsockopt(conn, level, option, value, value_len);
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
return OK;
|
||||
return usrsock_setsockopt(conn, level, option, value, value_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -176,8 +167,7 @@ int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (value_len != sizeof(int))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Get the value. Is the option being set or cleared? */
|
||||
@ -215,8 +205,7 @@ int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (tv == NULL || value_len != sizeof(struct timeval))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Get the timeout value. Any microsecond remainder will be
|
||||
@ -258,8 +247,7 @@ int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
|
||||
if (value_len < sizeof(FAR struct linger))
|
||||
{
|
||||
errcode = EINVAL;
|
||||
goto errout;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Get the value. Is the option being set or cleared? */
|
||||
@ -303,15 +291,10 @@ int psock_setsockopt(FAR struct socket *psock, int level, int option,
|
||||
case SO_TYPE: /* Reports the socket type */
|
||||
|
||||
default:
|
||||
errcode = ENOPROTOOPT;
|
||||
goto errout;
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -366,6 +349,7 @@ errout:
|
||||
int setsockopt(int sockfd, int level, int option, const void *value, socklen_t value_len)
|
||||
{
|
||||
FAR struct socket *psock;
|
||||
int ret;
|
||||
|
||||
/* Get the underlying socket structure */
|
||||
/* Verify that the sockfd corresponds to valid, allocated socket */
|
||||
@ -379,7 +363,14 @@ int setsockopt(int sockfd, int level, int option, const void *value, socklen_t v
|
||||
|
||||
/* Then let psock_setockopt() do all of the work */
|
||||
|
||||
return psock_setsockopt(psock, level, option, value, value_len);
|
||||
ret = psock_setsockopt(psock, level, option, value, value_len);
|
||||
if (ret < 0)
|
||||
{
|
||||
set_errno(-ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET && CONFIG_NET_SOCKOPTS */
|
||||
|
@ -67,7 +67,8 @@
|
||||
* psock A pointer to a user allocated socket structure to be initialized.
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 on success; -1 on error with errno set appropriately
|
||||
* Returns zero (OK) on success. On failure, it returns a negated errno
|
||||
* value to indicate the nature of the error:
|
||||
*
|
||||
* EACCES
|
||||
* Permission to create a socket of the specified type and/or protocol
|
||||
@ -87,14 +88,11 @@
|
||||
* The protocol type or the specified protocol is not supported within
|
||||
* this domain.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_socket(int domain, int type, int protocol, FAR struct socket *psock)
|
||||
{
|
||||
FAR const struct sock_intf_s *sockif = NULL;
|
||||
int errcode;
|
||||
int ret;
|
||||
|
||||
/* Initialize the socket structure */
|
||||
@ -126,8 +124,7 @@ int psock_socket(int domain, int type, int protocol, FAR struct socket *psock)
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -141,8 +138,7 @@ int psock_socket(int domain, int type, int protocol, FAR struct socket *psock)
|
||||
if (sockif == NULL)
|
||||
{
|
||||
nerr("ERROR: socket address family unsupported: %d\n", domain);
|
||||
errcode = EAFNOSUPPORT;
|
||||
goto errout;
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
/* The remaining of the socket initialization depends on the address
|
||||
@ -156,15 +152,10 @@ int psock_socket(int domain, int type, int protocol, FAR struct socket *psock)
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: socket si_setup() failed: %d\n", ret);
|
||||
errcode = -ret;
|
||||
goto errout;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -207,6 +198,7 @@ errout:
|
||||
int socket(int domain, int type, int protocol)
|
||||
{
|
||||
FAR struct socket *psock;
|
||||
int errcode;
|
||||
int sockfd;
|
||||
int ret;
|
||||
|
||||
@ -216,8 +208,8 @@ int socket(int domain, int type, int protocol)
|
||||
if (sockfd < 0)
|
||||
{
|
||||
nerr("ERROR: Failed to allodate a socket descriptor\n");
|
||||
set_errno(ENFILE);
|
||||
return ERROR;
|
||||
errcode = ENFILE;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Get the underlying socket structure */
|
||||
@ -225,8 +217,8 @@ int socket(int domain, int type, int protocol)
|
||||
psock = sockfd_socket(sockfd);
|
||||
if (!psock)
|
||||
{
|
||||
set_errno(ENOSYS); /* should not happen */
|
||||
goto errout;
|
||||
errcode = ENOSYS; /* should not happen */
|
||||
goto errout_with_sockfd;
|
||||
}
|
||||
|
||||
/* Initialize the socket structure */
|
||||
@ -234,16 +226,18 @@ int socket(int domain, int type, int protocol)
|
||||
ret = psock_socket(domain, type, protocol, psock);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* errno already set by psock_socket() */
|
||||
|
||||
nerr("ERROR: psock_socket() failed: %d\n", ret);
|
||||
goto errout;
|
||||
errcode = -ret;
|
||||
goto errout_with_sockfd;
|
||||
}
|
||||
|
||||
return sockfd;
|
||||
|
||||
errout:
|
||||
errout_with_sockfd:
|
||||
sockfd_release(sockfd);
|
||||
|
||||
errout:
|
||||
set_errno(errcode);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user