diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-06-01 23:09:29 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-06-01 23:09:29 +0000 |
commit | 67861ab4bc9411a36319f48f9aaad1a129fcde9b (patch) | |
tree | 97e2fb1cca991511cd55c2f7899fc6dcd612a2ab /apps/netutils | |
parent | 17b27f51ace2d8529e6bf5ac5c84d01c08d8dbf5 (diff) | |
download | nuttx-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.txt | 1 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_connect.c | 4 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_getfile.c | 13 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_getreply.c | 2 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_internal.h | 7 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_listdir.c | 2 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_putfile.c | 53 | ||||
-rw-r--r-- | apps/netutils/ftpc/ftpc_transfer.c | 21 |
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); +} |