summaryrefslogtreecommitdiff
path: root/apps/netutils/ftpc
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-06-03 22:53:36 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-06-03 22:53:36 +0000
commitad9530eeb839266cc6fa940624dce885f5693a2e (patch)
tree4c9555e7ee46c211847759affee04a7737ce6d4f /apps/netutils/ftpc
parent92fd8f5221ca528c2def13897c712d558adf1675 (diff)
downloadnuttx-ad9530eeb839266cc6fa940624dce885f5693a2e.tar.gz
nuttx-ad9530eeb839266cc6fa940624dce885f5693a2e.tar.bz2
nuttx-ad9530eeb839266cc6fa940624dce885f5693a2e.zip
More FTP fixes
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3666 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/netutils/ftpc')
-rw-r--r--apps/netutils/ftpc/ftpc_getfile.c15
-rw-r--r--apps/netutils/ftpc/ftpc_internal.h3
-rw-r--r--apps/netutils/ftpc/ftpc_listdir.c2
-rw-r--r--apps/netutils/ftpc/ftpc_putfile.c15
-rw-r--r--apps/netutils/ftpc/ftpc_socket.c15
-rw-r--r--apps/netutils/ftpc/ftpc_transfer.c22
6 files changed, 51 insertions, 21 deletions
diff --git a/apps/netutils/ftpc/ftpc_getfile.c b/apps/netutils/ftpc/ftpc_getfile.c
index bf9fc69ea..9df827c6e 100644
--- a/apps/netutils/ftpc/ftpc_getfile.c
+++ b/apps/netutils/ftpc/ftpc_getfile.c
@@ -151,7 +151,7 @@ static int ftpc_recvinit(struct ftpc_session_s *session, FAR const char *path,
/* Accept a connection on the data socket */
- ret = ftpc_sockaccept(&session->data, "r", FTPC_IS_PASSIVE(session));
+ ret = ftpc_sockaccept(&session->data, FTPC_IS_PASSIVE(session));
if (ret != OK)
{
ndbg("data connection not accepted\n");
@@ -274,6 +274,19 @@ int ftpc_getfile(SESSION handle, FAR const char *rname, FAR const char *lname,
off_t offset;
int ret;
+ /* Don't call this with a NULL remote file name */
+
+ DEBUGASSERT(rname);
+
+ /* If the local name is not specified, then it is assumed to the same as
+ * the remote file name.
+ */
+
+ if (!lname)
+ {
+ lname = rname;
+ }
+
/* Get the full path to the local file */
abslpath = ftpc_abslpath(session, lname);
diff --git a/apps/netutils/ftpc/ftpc_internal.h b/apps/netutils/ftpc/ftpc_internal.h
index 6eab632a5..a59e4fdc1 100644
--- a/apps/netutils/ftpc/ftpc_internal.h
+++ b/apps/netutils/ftpc/ftpc_internal.h
@@ -246,8 +246,7 @@ EXTERN int ftpc_sockconnect(FAR struct ftpc_socket_s *sock,
FAR struct sockaddr_in *addr);
EXTERN int ftpc_sockgetsockname(FAR struct ftpc_socket_s *sock,
FAR struct sockaddr_in *sa);
-EXTERN int ftpc_sockaccept(FAR struct ftpc_socket_s *sock,
- FAR const char *mode, bool passive);
+EXTERN int ftpc_sockaccept(FAR struct ftpc_socket_s *sock, bool passive);
EXTERN int ftpc_socklisten(FAR struct ftpc_socket_s *sock);
EXTERN void ftpc_sockcopy(FAR struct ftpc_socket_s *dest,
FAR const struct ftpc_socket_s *src);
diff --git a/apps/netutils/ftpc/ftpc_listdir.c b/apps/netutils/ftpc/ftpc_listdir.c
index e5309daed..d5de10ec3 100644
--- a/apps/netutils/ftpc/ftpc_listdir.c
+++ b/apps/netutils/ftpc/ftpc_listdir.c
@@ -201,7 +201,7 @@ static int ftpc_recvdir(FAR struct ftpc_session_s *session,
/* Accept the connection from the server */
- ret = ftpc_sockaccept(&session->data, "r", FTPC_IS_PASSIVE(session));
+ ret = ftpc_sockaccept(&session->data, FTPC_IS_PASSIVE(session));
if (ret != OK)
{
ndbg("ftpc_sockaccept() failed: %d\n", errno);
diff --git a/apps/netutils/ftpc/ftpc_putfile.c b/apps/netutils/ftpc/ftpc_putfile.c
index c465cc66d..94942edba 100644
--- a/apps/netutils/ftpc/ftpc_putfile.c
+++ b/apps/netutils/ftpc/ftpc_putfile.c
@@ -340,7 +340,7 @@ static int ftpc_sendfile(struct ftpc_session_s *session, const char *path,
* with a mark.
*/
- ret = ftpc_sockaccept(&session->data, "w", FTPC_IS_PASSIVE(session));
+ ret = ftpc_sockaccept(&session->data, FTPC_IS_PASSIVE(session));
if (ret != OK)
{
ndbg("Data connection not accepted\n");
@@ -388,6 +388,19 @@ int ftp_putfile(SESSION handle, const char *lname, const char *rname,
FILE *finstream;
int ret;
+ /* Don't call this with a NULL local file name */
+
+ DEBUGASSERT(lname);
+
+ /* If the remote name is not specified, then it is assumed to the same as
+ * the local file name.
+ */
+
+ if (!rname)
+ {
+ rname = lname;
+ }
+
/* Get the full path to the local file */
abslpath = ftpc_abslpath(session, lname);
diff --git a/apps/netutils/ftpc/ftpc_socket.c b/apps/netutils/ftpc/ftpc_socket.c
index d70bf1d63..6d917cf36 100644
--- a/apps/netutils/ftpc/ftpc_socket.c
+++ b/apps/netutils/ftpc/ftpc_socket.c
@@ -212,16 +212,20 @@ void ftpc_sockcopy(FAR struct ftpc_socket_s *dest,
*
****************************************************************************/
-int ftpc_sockaccept(struct ftpc_socket_s *sock, const char *mode, bool passive)
+int ftpc_sockaccept(struct ftpc_socket_s *sock, bool passive)
{
struct sockaddr addr;
socklen_t addrlen;
/* Any previous socket should have been uninitialized (0) or explicitly
- * closed (-1).
+ * closed (-1). But the path to this function may include a call to
+ * ftpc_sockinit().
*/
- DEBUGASSERT(sock->sd == 0 || sock->sd == -1);
+ if (sock->sd > 0)
+ {
+ ftpc_sockclose(sock);
+ }
/* In active mode FTP the client connects from a random port (N>1023) to the
* FTP server's command port, port 21. Then, the client starts listening to
@@ -249,6 +253,7 @@ int ftpc_sockaccept(struct ftpc_socket_s *sock, const char *mode, bool passive)
ndbg("accept() failed: %d\n", errno);
return ERROR;
}
+
memcpy(&sock->laddr, &addr, sizeof(sock->laddr));
}
@@ -256,7 +261,7 @@ int ftpc_sockaccept(struct ftpc_socket_s *sock, const char *mode, bool passive)
* the incoming buffered stream.
*/
- sock->instream = fdopen(sock->sd, mode);
+ sock->instream = fdopen(sock->sd, "r");
if (!sock->instream)
{
ndbg("fdopen() failed: %d\n", errno);
@@ -265,7 +270,7 @@ int ftpc_sockaccept(struct ftpc_socket_s *sock, const char *mode, bool passive)
/* Create the outgoing stream */
- sock->outstream = fdopen(sock->sd, mode);
+ sock->outstream = fdopen(sock->sd, "w");
if (!sock->outstream)
{
ndbg("fdopen() failed: %d\n", errno);
diff --git a/apps/netutils/ftpc/ftpc_transfer.c b/apps/netutils/ftpc/ftpc_transfer.c
index 8d1a577e9..4dfa6d47b 100644
--- a/apps/netutils/ftpc/ftpc_transfer.c
+++ b/apps/netutils/ftpc/ftpc_transfer.c
@@ -285,21 +285,21 @@ int ftpc_xfrinit(FAR struct ftpc_session_s *session)
ndbg("ftp_pasvmode() failed: %d\n", errno);
goto errout_with_data;
}
- }
- /* Configure the data socket */
+ /* Configure the data socket */
- ftpc_sockgetsockname(&session->cmd, &addr);
- memcpy(&addr.sin_addr, addrport, (size_t)4);
- memcpy(&addr.sin_port, addrport+4, (size_t)2);
+ ftpc_sockgetsockname(&session->cmd, &addr);
+ memcpy(&addr.sin_addr, addrport, (size_t)4);
+ memcpy(&addr.sin_port, addrport+4, (size_t)2);
- /* Connect the data socket */
+ /* Connect the data socket */
- ret = ftpc_sockconnect(&session->data, &addr);
- if (ret < 0)
- {
- ndbg("ftpc_sockconnect() failed: %d\n", errno);
- goto errout_with_data;
+ ret = ftpc_sockconnect(&session->data, &addr);
+ if (ret < 0)
+ {
+ ndbg("ftpc_sockconnect() failed: %d\n", errno);
+ goto errout_with_data;
+ }
}
else
{