summaryrefslogtreecommitdiff
path: root/apps/netutils/telnetd/telnetd_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/netutils/telnetd/telnetd_driver.c')
-rw-r--r--apps/netutils/telnetd/telnetd_driver.c37
1 files changed, 22 insertions, 15 deletions
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;
}