summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2015-01-22 06:51:31 -0600
committerGregory Nutt <gnutt@nuttx.org>2015-01-22 06:51:31 -0600
commit2cae47a7c9bd3520b55ae62efa33b92526ba3e3f (patch)
tree5e4aefcbd615a2887344a8d8710ad7fd930f3741
parent70243edc4a9811caf2c98334ad2a057efeab10f5 (diff)
downloadnuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.tar.gz
nuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.tar.bz2
nuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.zip
Networking: Correct the value returned by accept() in the case where net_lockingwait() is called. It was returning -1 and losing the errno value. Noted by Rony Xln
-rw-r--r--apps/netutils/telnetd/telnetd_daemon.c2
-rw-r--r--nuttx/include/nuttx/net/net.h8
-rw-r--r--nuttx/net/socket/accept.c30
-rw-r--r--nuttx/net/utils/net_lock.c10
4 files changed, 40 insertions, 10 deletions
diff --git a/apps/netutils/telnetd/telnetd_daemon.c b/apps/netutils/telnetd/telnetd_daemon.c
index b90ef3207..41ae7e195 100644
--- a/apps/netutils/telnetd/telnetd_daemon.c
+++ b/apps/netutils/telnetd/telnetd_daemon.c
@@ -108,7 +108,7 @@ static int telnetd_daemon(int argc, char *argv[])
#ifdef CONFIG_SCHED_HAVE_PARENT
struct sigaction sa;
sigset_t blockset;
-#endif
+#endif
socklen_t addrlen;
FAR char *devpath;
pid_t pid;
diff --git a/nuttx/include/nuttx/net/net.h b/nuttx/include/nuttx/net/net.h
index 27a8e2148..2e3206de0 100644
--- a/nuttx/include/nuttx/net/net.h
+++ b/nuttx/include/nuttx/net/net.h
@@ -227,6 +227,14 @@ void net_unlock(net_lock_t flags);
* Description:
* Atomically wait for sem while temporarily releasing g_netlock.
*
+ * Input Parameters:
+ * sem - A reference to the semaphore to be taken.
+ *
+ * Returned value:
+ * The returned value is the same as sem_wait(): Zero (OK) is returned
+ * on success; -1 (ERROR) is returned on a failure with the errno value
+ * set appropriately.
+ *
****************************************************************************/
#ifdef CONFIG_NET_NOINTS
diff --git a/nuttx/net/socket/accept.c b/nuttx/net/socket/accept.c
index f9ba0dc13..46622d318 100644
--- a/nuttx/net/socket/accept.c
+++ b/nuttx/net/socket/accept.c
@@ -301,6 +301,7 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
{
err = EBADF;
}
+
goto errout;
}
@@ -431,12 +432,25 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
conn->accept = accept_interrupt;
/* Wait for the send to complete or an error to occur: NOTES: (1)
- * net_lockedwait will also terminate if a signal is received, (2) interrupts
- * may be disabled! They will be re-enabled while the task sleeps and
- * automatically re-enabled when the task restarts.
+ * net_lockedwait will also terminate if a signal is received, (2)
+ * interrupts may be disabled! They will be re-enabled while the
+ * task sleeps and automatically re-enabled when the task restarts.
*/
ret = net_lockedwait(&state.acpt_sem);
+ if (ret < 0)
+ {
+ /* The value returned by net_lockedwait() the same as the value
+ * returned by sem_wait(): Zero (OK) is returned on success; -1
+ * (ERROR) is returned on a failure with the errno value set
+ * appropriately.
+ *
+ * We have to preserve the errno value here because it may be
+ * altered by intervening operations.
+ */
+
+ err = get_errno();
+ }
/* Make sure that no further interrupts are processed */
@@ -449,7 +463,7 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
psock->s_flags = _SS_SETSTATE(psock->s_flags, _SF_IDLE);
- /* Check for a errors. Errors are signaled by negative errno values
+ /* Check for a errors. Errors are signalled by negative errno values
* for the send length.
*/
@@ -459,13 +473,13 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen)
goto errout_with_lock;
}
- /* If net_lockedwait failed, then we were probably reawakened by a signal. In
- * this case, net_lockedwait will have set errno appropriately.
+ /* If net_lockedwait failed, then we were probably reawakened by a
+ * signal. In this case, logic above will have set 'err' to the
+ * ernno value returned by net_lockedwait().
*/
if (ret < 0)
{
- err = -ret;
goto errout_with_lock;
}
}
@@ -493,7 +507,7 @@ errout_with_socket:
sockfd_release(newfd);
errout:
- errno = err;
+ set_errno(err);
return ERROR;
}
diff --git a/nuttx/net/utils/net_lock.c b/nuttx/net/utils/net_lock.c
index e0446690a..a8ee355ab 100644
--- a/nuttx/net/utils/net_lock.c
+++ b/nuttx/net/utils/net_lock.c
@@ -1,7 +1,7 @@
/****************************************************************************
* net/utils/net_lock.c
*
- * Copyright (C) 2011-2012, 2014 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011-2012, 2014-2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -178,6 +178,14 @@ void net_unlock(net_lock_t flags)
* Description:
* Atomically wait for sem while temporarily releasing g_netlock.
*
+ * Input Parameters:
+ * sem - A reference to the semaphore to be taken.
+ *
+ * Returned value:
+ * The returned value is the same as sem_wait(): Zero (OK) is returned
+ * on success; -1 (ERROR) is returned on a failure with the errno value
+ * set appropriately.
+ *
****************************************************************************/
int net_lockedwait(sem_t *sem)