summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-31 17:38:45 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-01-31 17:38:45 +0000
commit16b9e9e0c7e36ab8d14a0a5be3aa10ea40d15fd3 (patch)
tree66c30d1102e63c9c517c695d8feef254c6a5178b
parentd2dfd9fdd6cb1c57375468919c1b37e91b3a8f3e (diff)
downloadnuttx-16b9e9e0c7e36ab8d14a0a5be3aa10ea40d15fd3.tar.gz
nuttx-16b9e9e0c7e36ab8d14a0a5be3aa10ea40d15fd3.tar.bz2
nuttx-16b9e9e0c7e36ab8d14a0a5be3aa10ea40d15fd3.zip
Fix a error the telnet driver read method. Don't return if only protocol stuff is read
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4352 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--apps/netutils/telnetd/telnetd_daemon.c23
-rw-r--r--apps/netutils/telnetd/telnetd_driver.c37
-rw-r--r--nuttx/lib/stdio/lib_fgets.c4
3 files changed, 37 insertions, 27 deletions
diff --git a/apps/netutils/telnetd/telnetd_daemon.c b/apps/netutils/telnetd/telnetd_daemon.c
index 7165ee49d..d43a45e86 100644
--- a/apps/netutils/telnetd/telnetd_daemon.c
+++ b/apps/netutils/telnetd/telnetd_daemon.c
@@ -160,7 +160,10 @@ static int telnetd_daemon(int argc, char *argv[])
goto errout_with_socket;
}
- /* Now go silent */
+ /* Now go silent. Only the lldbg family of debug functions should
+ * be used after this point because these do not depend on stdout
+ * being available.
+ */
#ifndef CONFIG_DEBUG
close(0);
@@ -172,13 +175,13 @@ static int telnetd_daemon(int argc, char *argv[])
for (;;)
{
- nvdbg("Accepting connections on port %d\n", ntohs(daemon->port));
+ nllvdbg("Accepting connections on port %d\n", ntohs(daemon->port));
addrlen = sizeof(struct sockaddr_in);
acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen);
if (acceptsd < 0)
{
- ndbg("accept failed: %d\n", errno);
+ nlldbg("accept failed: %d\n", errno);
goto errout_with_socket;
}
@@ -189,28 +192,28 @@ static int telnetd_daemon(int argc, char *argv[])
ling.l_linger = 30; /* timeout is seconds */
if (setsockopt(acceptsd, SOL_SOCKET, SO_LINGER, &ling, sizeof(struct linger)) < 0)
{
- ndbg("setsockopt failed: %d\n", errno);
+ nlldbg("setsockopt failed: %d\n", errno);
goto errout_with_acceptsd;
}
#endif
/* Create a character device to "wrap" the accepted socket descriptor */
- nvdbg("Creating the telnet driver\n");
+ nllvdbg("Creating the telnet driver\n");
devpath = telnetd_driver(acceptsd, daemon);
if (devpath < 0)
{
- ndbg("telnetd_driver failed\n");
+ nlldbg("telnetd_driver failed\n");
goto errout_with_acceptsd;
}
/* Open the driver */
- nvdbg("Opening the telnet driver\n");
+ nllvdbg("Opening the telnet driver\n");
drvrfd = open(devpath, O_RDWR);
if (drvrfd < 0)
{
- ndbg("Failed to open %s: %d\n", devpath, errno);
+ nlldbg("Failed to open %s: %d\n", devpath, errno);
goto errout_with_acceptsd;
}
@@ -235,12 +238,12 @@ static int telnetd_daemon(int argc, char *argv[])
* will inherit the new stdin, stdout, and stderr.
*/
- nvdbg("Starting the telnet session\n");
+ nllvdbg("Starting the telnet session\n");
pid = TASK_CREATE("Telnet session", daemon->priority, daemon->stacksize,
daemon->entry, NULL);
if (pid < 0)
{
- ndbg("Failed start the telnet session: %d\n", errno);
+ nlldbg("Failed start the telnet session: %d\n", errno);
goto errout_with_acceptsd;
}
diff --git a/apps/netutils/telnetd/telnetd_driver.c b/apps/netutils/telnetd/telnetd_driver.c
index 7507ad1c0..1950c881b 100644
--- a/apps/netutils/telnetd/telnetd_driver.c
+++ b/apps/netutils/telnetd/telnetd_driver.c
@@ -508,29 +508,36 @@ static ssize_t telnetd_read(FAR struct file *filep, FAR char *buffer, size_t len
nllvdbg("len: %d\n", len);
/* First, handle the case where there are still valid bytes left in the
- * I/O buffer from the last time that read was called.
+ * I/O buffer from the last time that read was called. NOTE: Much of
+ * what we read may be protocol stuff and may not correspond to user
+ * data. Hence we need the loop and we need may need to call psock_recv()
+ * multiple times in order to get data that the client is interested in.
*/
- if (priv->td_pending > 0)
+ do
{
- FAR const char *src = &priv->td_rxbuffer[priv->td_offset];
- ret = telnetd_receive(priv, src, priv->td_pending, buffer, len);
- }
+ if (priv->td_pending > 0)
+ {
+ FAR const char *src = &priv->td_rxbuffer[priv->td_offset];
+ ret = telnetd_receive(priv, src, priv->td_pending, buffer, len);
+ }
- /* Read a buffer of data from the telnet client */
+ /* Read a buffer of data from the telnet client */
- else
- {
- ret = psock_recv(&priv->td_psock, priv->td_rxbuffer,
- CONFIG_TELNETD_RXBUFFER_SIZE, 0);
- if (ret > 0)
+ else
{
- /* Process the received telnet data */
+ ret = psock_recv(&priv->td_psock, priv->td_rxbuffer,
+ CONFIG_TELNETD_RXBUFFER_SIZE, 0);
+ if (ret > 0)
+ {
+ /* Process the received telnet data */
- telnetd_dumpbuffer("Received buffer", priv->td_rxbuffer, ret);
- ret = telnetd_receive(priv, priv->td_rxbuffer, ret, buffer, len);
- }
+ telnetd_dumpbuffer("Received buffer", priv->td_rxbuffer, ret);
+ ret = telnetd_receive(priv, priv->td_rxbuffer, ret, buffer, len);
+ }
+ }
}
+ while (ret == 0);
return ret;
}
diff --git a/nuttx/lib/stdio/lib_fgets.c b/nuttx/lib/stdio/lib_fgets.c
index ce2aa9476..f4061b628 100644
--- a/nuttx/lib/stdio/lib_fgets.c
+++ b/nuttx/lib/stdio/lib_fgets.c
@@ -1,8 +1,8 @@
/****************************************************************************
* lib/stdio/lib_fgets.c
*
- * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ * Copyright (C) 2007-2008, 2011-2012 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions