summaryrefslogtreecommitdiff
path: root/apps/netutils/ftpc/ftpc_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/netutils/ftpc/ftpc_internal.h')
-rw-r--r--apps/netutils/ftpc/ftpc_internal.h263
1 files changed, 263 insertions, 0 deletions
diff --git a/apps/netutils/ftpc/ftpc_internal.h b/apps/netutils/ftpc/ftpc_internal.h
new file mode 100644
index 000000000..4982e1f20
--- /dev/null
+++ b/apps/netutils/ftpc/ftpc_internal.h
@@ -0,0 +1,263 @@
+/****************************************************************************
+ * apps/netutils/ftpc/ftpc_internal.h
+ *
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __APPS_NETUTILS_FTPC_FTPC_INTERNAL_H
+#define __APPS_NETUTILS_FTPC_FTPC_INTERNAL_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <time.h>
+#include <wdog.h>
+
+#include <apps/ftpc.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+/* MISC definitions *********************************************************/
+
+#define ISO_nl 0x0a
+#define ISO_cr 0x0d
+
+/* Telnet-related definitions */
+
+#define TELNET_DM 242
+#define TELNET_IP 244
+#define TELNET_IAC 255
+#define TELNET_WILL 251
+#define TELNET_WONT 252
+#define TELNET_DO 253
+#define TELNET_DONT 254
+
+/* Session flag bits ********************************************************/
+
+#define FTPC_FLAG_CONNECTED (1 << 0) /* Connected to host */
+#define FTPC_FLAG_LOGGEDIN (1 << 1) /* Logged in to host */
+#define FTPC_STATE_FLAGS (0x0003) /* State of connection */
+
+#define FTPC_FLAG_MDTM (1 << 2) /* Host supports MDTM command */
+#define FTPC_FLAG_SIZE (1 << 3) /* Host supports SIZE command */
+#define FTPC_FLAG_PASV (1 << 4) /* Host supports PASV command */
+#define FTPC_FLAG_STOU (1 << 5) /* Host supports STOU command */
+#define FTPC_FLAG_CHMOD (1 << 6) /* Host supports SITE CHMOD command */
+#define FTPC_FLAG_IDLE (1 << 7) /* Host supports SITE IDLE command */
+#define FTPC_HOSTCAP_FLAGS (0x00fc) /* Host capabilities */
+
+#define FTPC_FLAG_INTERRUPT (1 << 8) /* Transfer interrupted */
+#define FTPC_FLAG_PUT (1 << 9) /* Transfer is a PUT operation (upload) */
+#define FTPC_FLAG_PASSIVE (1 << 10) /* Passive mode requested */
+#define FTPC_XFER_FLAGS (0x0700) /* Transfer related */
+
+#define FTPC_FLAGS_INIT FTPC_HOSTCAP_FLAGS
+
+#define FTPC_SET_CONNECTED(s) do { (s)->flags |= FTPC_FLAG_CONNECTED; } while (0)
+#define FTPC_SET_LOGGEDIN(s) do { (s)->flags |= FTPC_FLAG_LOGGEDIN; } while (0)
+#define FTPC_SET_MDTM(s) do { (s)->flags |= FTPC_FLAG_MDTM; } while (0)
+#define FTPC_SET_SIZE(s) do { (s)->flags |= FTPC_FLAG_SIZE; } while (0)
+#define FTPC_SET_PASV(s) do { (s)->flags |= FTPC_FLAG_PASV; } while (0)
+#define FTPC_SET_STOU(s) do { (s)->flags |= FTPC_FLAG_STOU; } while (0)
+#define FTPC_SET_CHMOD(s) do { (s)->flags |= FTPC_FLAG_CHMOD; } while (0)
+#define FTPC_SET_IDLE(s) do { (s)->flags |= FTPC_FLAG_IDLE; } while (0)
+#define FTPC_SET_INTERRUPT(s) do { (s)->flags |= FTPC_FLAG_INTERRUPT; } while (0)
+#define FTPC_SET_PUT(s) do { (s)->flags |= FTPC_FLAG_PUT; } while (0)
+#define FTPC_SET_PASSIVE(s) do { (s)->flags |= FTPC_FLAG_PASSIVE; } while (0)
+
+#define FTPC_CLR_CONNECTED(s) do { (s)->flags &= ~FTPC_FLAG_CONNECTED; } while (0)
+#define FTPC_CLR_LOGGEDIN(s) do { (s)->flags &= ~FTPC_FLAG_LOGGEDIN; } while (0)
+#define FTPC_CLR_MDTM(s) do { (s)->flags &= ~FTPC_FLAG_MDTM; } while (0)
+#define FTPC_CLR_SIZE(s) do { (s)->flags &= ~FTPC_FLAG_SIZE; } while (0)
+#define FTPC_CLR_PASV(s) do { (s)->flags &= ~FTPC_FLAG_PASV; } while (0)
+#define FTPC_CLR_STOU(s) do { (s)->flags &= ~FTPC_FLAG_STOU; } while (0)
+#define FTPC_CLR_CHMOD(s) do { (s)->flags &= ~FTPC_FLAG_CHMOD; } while (0)
+#define FTPC_CLR_IDLE(s) do { (s)->flags &= ~FTPC_FLAG_IDLE; } while (0)
+#define FTPC_CLR_INTERRUPT(s) do { (s)->flags &= ~FTPC_FLAG_INTERRUPT; } while (0)
+#define FTPC_CLR_PUT(s) do { (s)->flags &= ~FTPC_FLAG_PUT; } while (0)
+#define FTPC_CLR_PASSIVE(s) do { (s)->flags &= ~FTPC_FLAG_PASSIVE; } while (0)
+
+#define FTPC_IS_CONNECTED(s) (((s)->flags & FTPC_FLAG_CONNECTED) != 0)
+#define FTPC_IS_LOGGEDIN(s) (((s)->flags & FTPC_FLAG_LOGGEDIN) != 0)
+#define FTPC_HAS_MDTM(s) (((s)->flags & FTPC_FLAG_MDTM) != 0)
+#define FTPC_HAS_SIZE(s) (((s)->flags & FTPC_FLAG_SIZE) != 0)
+#define FTPC_HAS_PASV(s) (((s)->flags & FTPC_FLAG_PASV) != 0)
+#define FTPC_HAS_STOU(s) (((s)->flags & FTPC_FLAG_STOU) != 0)
+#define FTPC_HAS_CHMOD(s) (((s)->flags & FTPC_FLAG_CHMOD) != 0)
+#define FTPC_HAS_IDLE(s) (((s)->flags & FTPC_FLAG_IDLE) != 0)
+#define FTPC_INTERRUPTED(s) (((s)->flags & FTPC_FLAG_INTERRUPT) != 0)
+#define FTPC_IS_PUT(s) (((s)->flags & FTPC_FLAG_PUT) != 0)
+#define FTPC_IS_PASSIVE(s) (((s)->flags & FTPC_FLAG_PASSIVE) != 0)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* This structure represents the state of one socket connection */
+
+struct ftpc_socket_s
+{
+ int sd; /* Socket descriptor */
+ FILE *instream; /* Incoming stream */
+ FILE *outstream; /* Outgoing stream */
+ struct sockaddr_in laddr; /* Local address */
+ struct sockaddr_in raddr; /* Remote address */
+ bool connected; /* True: socket is connected */
+};
+
+/* This structure represents the state of an FTP connection */
+
+struct ftpc_session_s
+{
+ struct in_addr addr; /* Server/proxy IP address */
+ struct ftpc_socket_s cmd; /* FTP command channel */
+ struct ftpc_socket_s data; /* FTP data channel */
+ WDOG_ID wdog; /* Timer */
+ FAR char *uname; /* Login uname */
+ FAR char *pwd; /* Login pwd */
+ FAR char *initdir; /* Initial remote directory */
+ FAR char *homedir; /* Home directory (curdir on startup) */
+ FAR char *curdir; /* Current directory */
+ FAR char *prevdir; /* Previous directory */
+ FAR char *rname; /* Remote file name */
+ FAR char *lname; /* Local file name */
+ 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) */
+ uint16_t code; /* Last 3-digit replay code */
+ uint32_t replytimeo; /* Server replay timeout (ticks) */
+ uint32_t conntimeo; /* Connection timeout (ticks) */
+ off_t filesize; /* Total file size to transfer */
+ off_t offset; /* Transfer file offset */
+ off_t size; /* Number of bytes transferred */
+ off_t rstrsize; /* restart size */
+
+ char reply[CONFIG_FTP_MAXREPLY+1]; /* Last reply string from server */
+};
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Inline Functions/Function-like Macros
+ ****************************************************************************/
+
+#define ftpc_sockconnected(s) \
+ ((s) && (s)->connected)
+#define ftpc_connected(s) \
+ (FTPC_IS_CONNECTED(session) && ftpc_sockconnected(&session->cmd))
+#define ftpc_loggedin(s) \
+ (ftpc_connected(s) && FTPC_IS_LOGGEDIN(s))
+
+#define ftpc_sockgetc(s) \
+ fgetc((s)->instream)
+#define ftpc_sockflush(s) \
+ fflush((s)->outstream)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/* Low-level string management */
+
+EXTERN void ftpc_stripcrlf(FAR char *str);
+EXTERN void ftpc_stripslash(FAR const char *str);
+EXTERN FAR char *ftpc_dequote(FAR const char *hostname);
+
+/* FTP helpers */
+
+EXTERN void ftpc_reset(struct ftpc_session_s *session);
+EXTERN int ftpc_cmd(struct ftpc_session_s *session, const char *cmd, ...);
+EXTERN int fptc_getreply(struct ftpc_session_s *session);
+EXTERN void ftpc_curdir(struct ftpc_session_s *session);
+EXTERN int ftpc_xfrmode(struct ftpc_session_s *session, uint8_t xfrmode);
+
+EXTERN int ftpc_reconnect(FAR struct ftpc_session_s *session);
+EXTERN int ftpc_relogin(FAR struct ftpc_session_s *session);
+
+/* Socket helpers */
+
+EXTERN int ftpc_sockinit(FAR struct ftpc_socket_s *sock);
+EXTERN void ftpc_sockclose(FAR struct ftpc_socket_s *sock);
+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_socklisten(FAR struct ftpc_socket_s *sock);
+EXTERN void ftpc_sockcopy(FAR struct ftpc_socket_s *dest,
+ FAR const struct ftpc_socket_s *src);
+
+/* 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, ...);
+
+/* Transfer helpers */
+
+EXTERN int ftpc_xfrinit(FAR struct ftpc_session_s *session);
+EXTERN int ftpc_recvtext(FAR struct ftpc_session_s *session,
+ FAR FILE *rinstream, FAR FILE *loutstream);
+EXTERN int ftpc_waitdata(FAR struct ftpc_session_s *session,
+ FAR FILE *stream, bool rdwait);
+
+EXTERN void ftpc_xfrreset(struct ftpc_session_s *session);
+EXTERN int ftpc_xfrabort(FAR struct ftpc_session_s *session,
+ FAR FILE *stream);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+#endif /* __APPS_NETUTILS_FTPC_FTPC_INTERNAL_H */