summaryrefslogtreecommitdiff
path: root/apps/netutils
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-06-01 23:09:29 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-06-01 23:09:29 +0000
commit67861ab4bc9411a36319f48f9aaad1a129fcde9b (patch)
tree97e2fb1cca991511cd55c2f7899fc6dcd612a2ab /apps/netutils
parent17b27f51ace2d8529e6bf5ac5c84d01c08d8dbf5 (diff)
downloadnuttx-67861ab4bc9411a36319f48f9aaad1a129fcde9b.tar.gz
nuttx-67861ab4bc9411a36319f48f9aaad1a129fcde9b.tar.bz2
nuttx-67861ab4bc9411a36319f48f9aaad1a129fcde9b.zip
Add a simple shell and configuration to verify the FTP client library
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3656 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/netutils')
-rw-r--r--apps/netutils/README.txt1
-rw-r--r--apps/netutils/ftpc/ftpc_connect.c4
-rw-r--r--apps/netutils/ftpc/ftpc_getfile.c13
-rw-r--r--apps/netutils/ftpc/ftpc_getreply.c2
-rw-r--r--apps/netutils/ftpc/ftpc_internal.h7
-rw-r--r--apps/netutils/ftpc/ftpc_listdir.c2
-rw-r--r--apps/netutils/ftpc/ftpc_putfile.c53
-rw-r--r--apps/netutils/ftpc/ftpc_transfer.c21
8 files changed, 67 insertions, 36 deletions
diff --git a/apps/netutils/README.txt b/apps/netutils/README.txt
index e4b05eb21..2059b569e 100644
--- a/apps/netutils/README.txt
+++ b/apps/netutils/README.txt
@@ -21,6 +21,7 @@ highly influenced by uIP) include:
dhcpd - Dynamic Host Configuration Protocol (DHCP) server
tftpc - TFTP client
+ ftpc - FTP client
thttpd - This is a port of Jef Poskanzer's THTTPD HTPPD server.
See http://acme.com/software/thttpd/.
diff --git a/apps/netutils/ftpc/ftpc_connect.c b/apps/netutils/ftpc/ftpc_connect.c
index 94add3d54..b0a5919df 100644
--- a/apps/netutils/ftpc/ftpc_connect.c
+++ b/apps/netutils/ftpc/ftpc_connect.c
@@ -40,6 +40,7 @@
#include <nuttx/config.h>
#include <stdlib.h>
+#include <unistd.h>
#include <errno.h>
#include <debug.h>
@@ -98,6 +99,7 @@ SESSION ftpc_connect(FAR struct ftpc_connect_s *server)
session->addr.s_addr = server->addr.s_addr;
session->port = server->port;
+ session->pid = getpid();
/* Create up a timer to prevent hangs */
@@ -143,7 +145,7 @@ int ftpc_reconnect(FAR struct ftpc_session_s *session)
/* Set up a timer to prevent hangs */
- ret = wd_start(session->wdog, session->conntimeo, ftpc_conntimeo, 1, session);
+ ret = wd_start(session->wdog, session->conntimeo, ftpc_timeout, 1, session);
if (ret != OK)
{
ndbg("wd_start() failed\n");
diff --git a/apps/netutils/ftpc/ftpc_getfile.c b/apps/netutils/ftpc/ftpc_getfile.c
index a3ea5008d..095bf2414 100644
--- a/apps/netutils/ftpc/ftpc_getfile.c
+++ b/apps/netutils/ftpc/ftpc_getfile.c
@@ -188,8 +188,8 @@ static int ftpc_recvbinary(FAR struct ftpc_session_s *session,
err = ENOMEM;
goto errout_with_err;
}
-
- while (!feof(rinstream))
+
+ for (;;)
{
if (ftpc_waitinput(session) != 0)
{
@@ -201,8 +201,13 @@ static int ftpc_recvbinary(FAR struct ftpc_session_s *session,
nread = fread(buf, sizeof(char), CONFIG_FTP_BUFSIZE, rinstream);
if (nread <= 0)
{
- (void)ftpc_xfrabort(session, rinstream);
- ret = ERROR;
+ /* nread == 0 means end of file */
+
+ if (nread < 0)
+ {
+ (void)ftpc_xfrabort(session, rinstream);
+ ret = ERROR;
+ }
break;
}
diff --git a/apps/netutils/ftpc/ftpc_getreply.c b/apps/netutils/ftpc/ftpc_getreply.c
index 86f1c7bfa..89dab6e81 100644
--- a/apps/netutils/ftpc/ftpc_getreply.c
+++ b/apps/netutils/ftpc/ftpc_getreply.c
@@ -189,7 +189,7 @@ int fptc_getreply(struct ftpc_session_s *session)
if (session->replytimeo)
{
- ret = wd_start(session->wdog, session->replytimeo, ftpc_replytimeo, 1, session);
+ ret = wd_start(session->wdog, session->replytimeo, ftpc_timeout, 1, session);
}
/* Get the next line from the server */
diff --git a/apps/netutils/ftpc/ftpc_internal.h b/apps/netutils/ftpc/ftpc_internal.h
index 244a7cfcc..3efac6184 100644
--- a/apps/netutils/ftpc/ftpc_internal.h
+++ b/apps/netutils/ftpc/ftpc_internal.h
@@ -160,6 +160,7 @@ struct ftpc_session_s
FAR char *prevdir; /* Previous directory */
FAR char *rname; /* Remote file name */
FAR char *lname; /* Local file name */
+ pid_t pid; /* Task ID of FTP client */
uint8_t xfrmode; /* Previous data transfer type (See FTPC_XFRMODE_* defines) */
uint16_t port; /* Server/proxy port number (probably 21) */
uint16_t flags; /* Connection flags (see FTPC_FLAGS_* defines) */
@@ -238,11 +239,7 @@ EXTERN void ftpc_sockcopy(FAR struct ftpc_socket_s *dest,
/* Socket I/O helpers */
EXTERN int ftpc_sockprintf(FAR struct ftpc_socket_s *sock, const char *str, ...);
-
-/* Timeout handlers */
-
-EXTERN void ftpc_replytimeo(int argc, uint32_t arg1, ...);
-EXTERN void ftpc_conntimeo(int argc, uint32_t arg1, ...);
+EXTERN void ftpc_timeout(int argc, uint32_t arg1, ...);
/* Transfer helpers */
diff --git a/apps/netutils/ftpc/ftpc_listdir.c b/apps/netutils/ftpc/ftpc_listdir.c
index 6ec70a0d9..09fad57ff 100644
--- a/apps/netutils/ftpc/ftpc_listdir.c
+++ b/apps/netutils/ftpc/ftpc_listdir.c
@@ -198,7 +198,7 @@ static void ftpc_nlstparse(FAR FILE *instream, callback_t callback,
/* Read every filename from the temporary file */
- while (!feof(instream))
+ for (;;)
{
/* Read the next line from the file */
diff --git a/apps/netutils/ftpc/ftpc_putfile.c b/apps/netutils/ftpc/ftpc_putfile.c
index c05112402..6993169d9 100644
--- a/apps/netutils/ftpc/ftpc_putfile.c
+++ b/apps/netutils/ftpc/ftpc_putfile.c
@@ -111,32 +111,37 @@ static int ftpc_sendbinary(FAR struct ftpc_session_s *session,
int ret = OK;
buf = (char *)malloc(CONFIG_FTP_BUFSIZE);
- while (!feof(linstream))
+ for (;;)
{
nread = fread(buf, sizeof(char), CONFIG_FTP_BUFSIZE, linstream);
- if (nread <= 0)
- {
- (void)ftpc_xfrabort(session, linstream);
- ret = ERROR;
- break;
- }
-
- if (ftpc_waitoutput(session) != 0)
- {
- ret = ERROR;
- break;
- }
-
- nwritten = fwrite(buf, sizeof(char), nread, routstream);
- if (nwritten != nread)
- {
- (void)ftpc_xfrabort(session, routstream);
- ret = ERROR;
- break;
- }
-
- session->size += nread;
- }
+ if (nread <= 0)
+ {
+ /* nread == 0 is just EOF */
+
+ if (nread < 0)
+ {
+ (void)ftpc_xfrabort(session, linstream);
+ ret = ERROR;
+ }
+ break;
+ }
+
+ if (ftpc_waitoutput(session) != 0)
+ {
+ ret = ERROR;
+ break;
+ }
+
+ nwritten = fwrite(buf, sizeof(char), nread, routstream);
+ if (nwritten != nread)
+ {
+ (void)ftpc_xfrabort(session, routstream);
+ ret = ERROR;
+ break;
+ }
+
+ session->size += nread;
+ }
free(buf);
return ret;
diff --git a/apps/netutils/ftpc/ftpc_transfer.c b/apps/netutils/ftpc/ftpc_transfer.c
index bce30e302..640e92276 100644
--- a/apps/netutils/ftpc/ftpc_transfer.c
+++ b/apps/netutils/ftpc/ftpc_transfer.c
@@ -44,11 +44,14 @@
#include <unistd.h>
#include <string.h>
#include <poll.h>
+#include <signal.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <debug.h>
+#include <apps/ftpc.h>
+
#include "ftpc_internal.h"
/****************************************************************************
@@ -396,5 +399,23 @@ int ftpc_waitdata(FAR struct ftpc_session_s *session, FAR FILE *stream, bool rdw
return ret;
}
+/****************************************************************************
+ * Name: ftpc_timeout
+ *
+ * Description:
+ * A timeout occurred -- either on a specific command or while waiting
+ * for a reply.
+ *
+ * NOTE:
+ * This function executes in the context of a timer interrupt handler.
+ *
+ ****************************************************************************/
+void ftpc_timeout(int argc, uint32_t arg1, ...)
+{
+ FAR struct ftpc_session_s *session = (FAR struct ftpc_session_s *)arg1;
+ nlldbg("Timeout!\n");
+ DEBUGASSERT(argc == 1 && session);
+ kill(session->pid, CONFIG_FTP_SIGNAL);
+}