diff --git a/ftp/Makefile b/ftp/Makefile index 2c092047..73c4d186 100644 --- a/ftp/Makefile +++ b/ftp/Makefile @@ -49,6 +49,7 @@ client/crlf.c\ client/dconn.c\ server/cmd_cwd.c\ server/cmd_dele.c\ +server/cmd_epsv.c\ server/cmd_list.c\ server/cmd_mkd.c\ server/cmd_pasv.c\ diff --git a/ftp/includes/ftp_client.h b/ftp/includes/ftp_client.h index 6d6d9c5b..871c8a37 100644 --- a/ftp/includes/ftp_client.h +++ b/ftp/includes/ftp_client.h @@ -6,12 +6,12 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 15:50:56 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:46:45 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:39:39 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef FTP_CLIENT -# define FTP_CLIENT +#ifndef FTP_CLIENT_H +# define FTP_CLIENT_H # include "libft.h" # include @@ -23,68 +23,71 @@ # include # define FTP_CLIENT_USAGE "%s " -# define ftp_cmd(ftp, ...) ftp_send((ftp)->cmd_sock, ##__VA_ARGS__) +# define FTP_CMD(ftp, ...) ftp_send((ftp)->cmd_sock, ##__VA_ARGS__) typedef struct s_cmd_map t_cmd_map; typedef struct s_ftp t_ftp; -struct s_cmd_map +struct s_cmd_map { - char *key; - int (*f)(); - char *help; + char *key; + int (*f)(); + char *help; }; -enum e_dstate +enum e_dstate { DATA_NONE, DATA_PASV, DATA_ACTV, }; -struct s_ftp +union u_conn { - int cmd_sock; - enum e_dstate data_state; - union { - struct sockaddr_in sin; - int sock; - } dconn; - int d_sock; + struct sockaddr_in sin; + int sock; }; -extern t_cmd_map g_cli_cmd[]; -extern int g_debug; +struct s_ftp +{ + int cmd_sock; + enum e_dstate data_state; + union u_conn dconn; + int d_sock; +}; -t_cmd_map *get_cmd(char *cmd); +extern t_cmd_map g_cli_cmd[]; +extern int g_debug; -int ftp_msg(t_ftp *ftp, char **msg); -int ftp_code(t_ftp *ftp); +t_cmd_map *get_cmd(char *cmd); -int ftp_send(int sock, char *msg, ...); -int ftp_recv(int sock, char **msg); -int ftp_recvraw(int sock, char **msg); +int ftp_msg(t_ftp *ftp, char **msg); +int ftp_code(t_ftp *ftp); -int dconn_init(t_ftp *ftp); -int dconn_open(t_ftp *ftp); -int dconn_close(t_ftp *ftp); -int console_msg(int level, char *str, ...); +int ftp_send(int sock, char *msg, ...); +int ftp_recv(int sock, char **msg); +int ftp_recvraw(int sock, char **msg); -int cli_debug(t_ftp *ftp, char **av); -int cli_user(t_ftp *ftp, char **av); -int cli_ls(t_ftp *ftp, char **av); -int cli_pwd(t_ftp *ftp, char **av); -int cli_sh(t_ftp *ftp, char **av); -int cli_get(t_ftp *ftp, char **av); -int cli_put(t_ftp *ftp, char **av); -int cli_cd(t_ftp *ftp, char **av); -int cli_help(t_ftp *ftp, char **av); -int cli_debug(t_ftp *ftp, char **av); -int cli_local(t_ftp *ftp, char **av); -int cli_rmd(t_ftp *ftp, char **av); -int cli_mkd(t_ftp *ftp, char **av); -int cli_dele(t_ftp *ftp, char **av); +int dconn_init(t_ftp *ftp); +int dconn_open(t_ftp *ftp); +int dconn_close(t_ftp *ftp); +int console_msg(int level, char *str, ...); -int cli_pasv(t_ftp *ftp); +int cli_debug(t_ftp *ftp, char **av); +int cli_user(t_ftp *ftp, char **av); +int cli_ls(t_ftp *ftp, char **av); +int cli_pwd(t_ftp *ftp, char **av); +int cli_sh(t_ftp *ftp, char **av); +int cli_get(t_ftp *ftp, char **av); +int cli_put(t_ftp *ftp, char **av); +int cli_cd(t_ftp *ftp, char **av); +int cli_help(t_ftp *ftp, char **av); +int cli_debug(t_ftp *ftp, char **av); +int cli_local(t_ftp *ftp, char **av); +int cli_rmd(t_ftp *ftp, char **av); +int cli_mkd(t_ftp *ftp, char **av); +int cli_dele(t_ftp *ftp, char **av); + +int cli_pasv(t_ftp *ftp); #endif diff --git a/ftp/includes/ftp_server.h b/ftp/includes/ftp_server.h index 4b42f716..dc615039 100644 --- a/ftp/includes/ftp_server.h +++ b/ftp/includes/ftp_server.h @@ -6,12 +6,12 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 15:56:59 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:39:47 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:40:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef FTP_SERVER -# define FTP_SERVER +#ifndef FTP_SERVER_H +# define FTP_SERVER_H # include "libft.h" # include @@ -24,71 +24,76 @@ # define REPOPATH "data/" # define FTP_SERVER_USAGE "%s " -# define ftp_ret(ftp, ...) ftp_send((ftp)->cmd_sock, ##__VA_ARGS__) +# define FTP_RET(ftp, ...) ftp_send((ftp)->cmd_sock, ##__VA_ARGS__) typedef struct s_ftp t_ftp; typedef struct s_ftp_cmd t_ftp_cmd; -enum e_dstate +enum e_dstate { DATA_NONE, DATA_PASV, DATA_ACTV, + DATA_EPSV, + DATA_EACTV, }; -enum e_lstate +enum e_lstate { LOG_NONE, LOG_YES, }; -struct s_ftp +union u_conn { - int cmd_sock; - enum e_lstate log_state; - char username[100]; - char path[100]; - enum e_dstate data_state; - union { - struct sockaddr_in sin; - int sock; - } dconn; - int d_sock; + struct sockaddr_in sin; + int sock; }; -struct s_ftp_cmd +struct s_ftp { - char *name; - int (*f)(); - enum e_lstate statelock; + int cmd_sock; + enum e_lstate log_state; + char username[100]; + char path[100]; + enum e_dstate data_state; + union u_conn dconn; + int d_sock; }; +struct s_ftp_cmd +{ + char *name; + int (*f)(); + enum e_lstate statelock; +}; -extern char **g_av; -extern int g_debug; -extern char g_rootdir[PATH_MAX]; +extern char **g_av; +extern int g_debug; +extern char g_rootdir[PATH_MAX]; -int ftp_send(int sock, char *msg, ...); -int ftp_recv(int sock, char **msg); -int ftp_recvraw(int sock, char **msg); -int dconn_open(t_ftp *ftp); -int dconn_close(t_ftp *ftp); -int console_msg(int level, char *str, ...); +int ftp_send(int sock, char *msg, ...); +int ftp_recv(int sock, char **msg); +int ftp_recvraw(int sock, char **msg); +int dconn_open(t_ftp *ftp); +int dconn_close(t_ftp *ftp); +int console_msg(int level, char *str, ...); -int cmd_user(t_ftp *ftp, char **av); -int cmd_quit(t_ftp *ftp, char **av); -int cmd_retr(t_ftp *ftp, char **av); -int cmd_stor(t_ftp *ftp, char **av); -int cmd_cwd(t_ftp *ftp, char **av); -int cmd_pwd(t_ftp *ftp, char **av); -int cmd_pasv(t_ftp *ftp, char **av); -int cmd_port(t_ftp *ftp, char **av); -int cmd_type(t_ftp *ftp, char **av); -int cmd_list(t_ftp *ftp, char **av); -int cmd_mkd(t_ftp *ftp, char **av); -int cmd_mkd(t_ftp *ftp, char **av); -int cmd_mkd(t_ftp *ftp, char **av); -int cmd_rmd(t_ftp *ftp, char **av); -int cmd_dele(t_ftp *ftp, char **av); +int cmd_user(t_ftp *ftp, char **av); +int cmd_quit(t_ftp *ftp, char **av); +int cmd_retr(t_ftp *ftp, char **av); +int cmd_stor(t_ftp *ftp, char **av); +int cmd_cwd(t_ftp *ftp, char **av); +int cmd_pwd(t_ftp *ftp, char **av); +int cmd_pasv(t_ftp *ftp, char **av); +int cmd_epsv(t_ftp *ftp, char **av); +int cmd_port(t_ftp *ftp, char **av); +int cmd_type(t_ftp *ftp, char **av); +int cmd_list(t_ftp *ftp, char **av); +int cmd_mkd(t_ftp *ftp, char **av); +int cmd_mkd(t_ftp *ftp, char **av); +int cmd_mkd(t_ftp *ftp, char **av); +int cmd_rmd(t_ftp *ftp, char **av); +int cmd_dele(t_ftp *ftp, char **av); #endif diff --git a/ftp/libft/includes/net.h b/ftp/libft/includes/net.h index 768ac0cd..e2177ec1 100644 --- a/ftp/libft/includes/net.h +++ b/ftp/libft/includes/net.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/10/07 18:06:12 by jhalford #+# #+# */ -/* Updated: 2017/10/07 18:14:42 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 12:21:30 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ # include "mytime.h" int create_server(int port, int backlog, char *protoname); -int create_client(char *addr, int port, char *protoname); +int create_tcpclient(char *host, char *port); void listener(int domain, int sock, int proto, void (*handler)(void *buf, int bytes, struct sockaddr_in *addr)); diff --git a/ftp/libft/srcs/net/create_client.c b/ftp/libft/srcs/net/create_client.c index 325b760f..2d24fd20 100644 --- a/ftp/libft/srcs/net/create_client.c +++ b/ftp/libft/srcs/net/create_client.c @@ -6,49 +6,53 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/10/07 17:59:28 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:29:49 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:15:13 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -void resolve_host(struct sockaddr *s, char *hostname) +struct addrinfo *resolve_host(char *hostname, char *port) { struct addrinfo *result; struct addrinfo hints; + int ecode; memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - hints.ai_flags |= AI_CANONNAME; - if (getaddrinfo(hostname, NULL, &hints, &result) != 0) + hints.ai_protocol = IPPROTO_TCP; + if ((ecode = getaddrinfo(hostname, port, &hints, &result)) != 0) { - perror("getaddrinfo"); + ft_dprintf(2, "getaddrinfo: %s\n", gai_strerror(ecode)); exit(1); } - ft_memcpy(((struct sockaddr_in*)s), - result->ai_addr, sizeof(struct sockaddr)); - freeaddrinfo(result); + return (result); } -int create_client(char *host, int port, char *protoname) +int create_tcpclient(char *host, char *port) { + struct addrinfo *ai; int sock; - struct protoent *proto; - struct sockaddr_in sin; - if (!(proto = getprotobyname(protoname))) - return (-1); - sock = socket(PF_INET, SOCK_STREAM, proto->p_proto); - resolve_host((struct sockaddr*)&sin, host); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - if (connect(sock, (const struct sockaddr *)&sin, sizeof(sin)) < 0) - return (-1); + ai = resolve_host(host, port); + while (ai) + { + if ((sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) + < 0) + return (-1); + if (connect(sock, ai->ai_addr, ai->ai_addrlen) == 0) + break ; + close(sock); + sock = -1; + ai = ai->ai_next; + } + freeaddrinfo(ai); return (sock); } -void listener(int domain, int sock, int proto, +void listener(int domain, int sock, int proto, void (*handler)(void *buf, int bytes, struct sockaddr_in *addr)) { int sd; diff --git a/ftp/libft/srcs/net/create_server.c b/ftp/libft/srcs/net/create_server.c index ffba3385..4cc71497 100644 --- a/ftp/libft/srcs/net/create_server.c +++ b/ftp/libft/srcs/net/create_server.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/10/07 18:02:51 by jhalford #+# #+# */ -/* Updated: 2017/10/07 18:02:51 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 11:39:18 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,14 +16,14 @@ int create_server(int port, int backlog, char *protoname) { int sock; struct protoent *proto; - struct sockaddr_in sin; + struct sockaddr_in6 sin; if (!(proto = getprotobyname(protoname))) return (-1); - sock = socket(PF_INET, SOCK_STREAM, proto->p_proto); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = htonl(INADDR_ANY); + sock = socket(PF_INET6, SOCK_STREAM, proto->p_proto); + sin.sin6_family = AF_INET6; + sin.sin6_port = htons(port); + sin.sin6_addr = in6addr_any; if (bind(sock, (const struct sockaddr *)&sin, sizeof(sin)) < 0) return (-1); listen(sock, backlog); diff --git a/ftp/libft/srcs/str/ft_strcspn.c b/ftp/libft/srcs/str/ft_strcspn.c index a045f0d5..2ea9e276 100644 --- a/ftp/libft/srcs/str/ft_strcspn.c +++ b/ftp/libft/srcs/str/ft_strcspn.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/20 15:55:33 by jhalford #+# #+# */ -/* Updated: 2017/11/10 15:52:55 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:15:48 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ /* ** span the complement of a string */ + size_t ft_strcspn(char *s, const char *delim) { char *str; diff --git a/ftp/libft/srcs/str/ft_strpbrk.c b/ftp/libft/srcs/str/ft_strpbrk.c index f8eb1649..97c07d72 100644 --- a/ftp/libft/srcs/str/ft_strpbrk.c +++ b/ftp/libft/srcs/str/ft_strpbrk.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 15:53:38 by jhalford #+# #+# */ -/* Updated: 2017/11/10 16:01:43 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:15:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ /* ** locate multiple characters in a string */ + char *ft_strpbrk(const char *s1, const char *s2) { char *str; diff --git a/ftp/libft/srcs/str/ft_strtok.c b/ftp/libft/srcs/str/ft_strtok.c index c68d3f14..5bd9968b 100644 --- a/ftp/libft/srcs/str/ft_strtok.c +++ b/ftp/libft/srcs/str/ft_strtok.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/07 18:08:31 by jhalford #+# #+# */ -/* Updated: 2017/11/10 15:56:57 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:22 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ /* ** token generator */ + char *ft_strtok(char *s, const char *delim) { static char *lasts; @@ -39,18 +40,21 @@ char *ft_strtok(char *s, const char *delim) /* ** also returns empty strings in the case of multiple delimiters */ + char *ft_strtok_single(char *str, char const *delims) { static char *src = NULL; char *p; - char *ret = 0; + char *ret; + ret = 0; if (str != NULL) src = str; if (src == NULL) - return NULL; - if ((p = strpbrk (src, delims)) != NULL) { - *p = 0; + return (NULL); + if ((p = strpbrk(src, delims)) != NULL) + { + *p = 0; ret = src; src = ++p; } @@ -59,5 +63,5 @@ char *ft_strtok_single(char *str, char const *delims) ret = src; src = NULL; } - return ret; + return (ret); } diff --git a/ftp/srcs/client/cli_cd.c b/ftp/srcs/client/cli_cd.c index da7956f5..fcbf2b01 100644 --- a/ftp/srcs/client/cli_cd.c +++ b/ftp/srcs/client/cli_cd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 12:42:21 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:30:55 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ int cli_cd(t_ftp *ftp, char **av) console_msg(-1, "usage: cd "); return (-1); } - ftp_cmd(ftp, "CWD %s", av[1]); + FTP_CMD(ftp, "CWD %s", av[1]); ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_dele.c b/ftp/srcs/client/cli_dele.c index 834b60bf..54982dca 100644 --- a/ftp/srcs/client/cli_dele.c +++ b/ftp/srcs/client/cli_dele.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:41:33 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:41:33 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ int cli_dele(t_ftp *ftp, char **av) { if (!av[1] || av[2]) return (console_msg(-1, "usage: unlink ")); - ftp_cmd(ftp, "DELE %s", av[1]); + FTP_CMD(ftp, "DELE %s", av[1]); ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_get.c b/ftp/srcs/client/cli_get.c index 09557898..ac74ac59 100644 --- a/ftp/srcs/client/cli_get.c +++ b/ftp/srcs/client/cli_get.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 13:00:28 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:55:01 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 15:02:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ static int cleanup(int fd, char *filename) return (-1); } -int cli_get(t_ftp *ftp, char **av) +int cli_get(t_ftp *ftp, char **av) { char *msg; int fd; @@ -31,7 +31,7 @@ int cli_get(t_ftp *ftp, char **av) return (-1); if (dconn_init(ftp) < 0) return (cleanup(fd, av[1])); - ftp_cmd(ftp, "RETR %s", av[1]); + FTP_CMD(ftp, "RETR %s", av[1]); if (dconn_open(ftp) < 0) return (cleanup(fd, av[1])); size = ftp_recvraw(ftp->d_sock, &msg); diff --git a/ftp/srcs/client/cli_help.c b/ftp/srcs/client/cli_help.c index 90ec6305..3c27963e 100644 --- a/ftp/srcs/client/cli_help.c +++ b/ftp/srcs/client/cli_help.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 14:04:01 by jhalford #+# #+# */ -/* Updated: 2017/11/09 14:12:55 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 15:02:32 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,13 +21,13 @@ int cli_help(t_ftp *ftp, char **av) if (!av[1]) { i = -1; - while (g_cli_cmd[++i].key) + while (g_cli_cmd[++i].key) console_msg(0, "%s:\t%s", g_cli_cmd[i].key, g_cli_cmd[i].help); } else { i = 0; - while (av[++i]) + while (av[++i]) { cmd = get_cmd(av[i]); if (cmd) diff --git a/ftp/srcs/client/cli_ls.c b/ftp/srcs/client/cli_ls.c index dbc8f654..b6933ba8 100644 --- a/ftp/srcs/client/cli_ls.c +++ b/ftp/srcs/client/cli_ls.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 13:43:10 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:39:39 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int cli_ls(t_ftp *ftp, char **av) (void)av; if (dconn_init(ftp) < 0) return (-1); - ftp_cmd(ftp, "LIST -a"); + FTP_CMD(ftp, "LIST -a"); if (dconn_open(ftp) < 0) return (-1); while (1) diff --git a/ftp/srcs/client/cli_mkd.c b/ftp/srcs/client/cli_mkd.c index 1d2082ff..1750cee4 100644 --- a/ftp/srcs/client/cli_mkd.c +++ b/ftp/srcs/client/cli_mkd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:27:35 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:40:44 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ int cli_mkd(t_ftp *ftp, char **av) { if (!av[1] || av[2]) return (console_msg(-1, "usage: mkdir ")); - ftp_cmd(ftp, "MKD %s", av[1]); + FTP_CMD(ftp, "MKD %s", av[1]); ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_pasv.c b/ftp/srcs/client/cli_pasv.c index e17df704..e4659550 100644 --- a/ftp/srcs/client/cli_pasv.c +++ b/ftp/srcs/client/cli_pasv.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 11:19:41 by jhalford #+# #+# */ -/* Updated: 2017/11/10 16:48:51 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 15:01:58 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,18 +16,16 @@ int cli_pasv(t_ftp *ftp) { char *msg; char **hostport; - int code; char buf[INET_ADDRSTRLEN]; - ftp_cmd(ftp, "PASV"); - code = ftp_msg(ftp, &msg); - if (code != 227) + FTP_CMD(ftp, "PASV"); + if (ftp_msg(ftp, &msg) != 227) return (-1); hostport = ft_strsplit(msg + 4, ','); ftp->dconn.sin.sin_family = AF_INET; ftp->dconn.sin.sin_port = htons(256 * ft_atoi(hostport[4]) + ft_atoi(hostport[5])); - ftp->dconn.sin.sin_addr.s_addr = + ftp->dconn.sin.sin_addr.s_addr = htonl( 256 * 256 * 256 * ft_atoi(hostport[0]) + 256 * 256 * ft_atoi(hostport[1]) @@ -35,7 +33,8 @@ int cli_pasv(t_ftp *ftp) + ft_atoi(hostport[3])); ftp->data_state = DATA_PASV; console_msg(1, "remote dconn @ %s:%i", - inet_ntop(AF_INET, &ftp->dconn.sin.sin_addr, buf, sizeof(struct sockaddr_in)), + inet_ntop(AF_INET, &ftp->dconn.sin.sin_addr, + buf, sizeof(struct sockaddr_in)), ntohs(ftp->dconn.sin.sin_port)); ft_strdel(&msg); return (0); diff --git a/ftp/srcs/client/cli_put.c b/ftp/srcs/client/cli_put.c index 7be417f9..74a3d964 100644 --- a/ftp/srcs/client/cli_put.c +++ b/ftp/srcs/client/cli_put.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 16:20:14 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:57:02 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 15:01:06 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,23 +27,13 @@ int cli_put(t_ftp *ftp, char **av) } if (!buf.st_size || (file = mmap(NULL, buf.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED) - { - close(fd); - return (-1); - } + return (close(fd)); close(fd); if (dconn_init(ftp) < 0) - { - munmap(file, buf.st_size); - return (-1); - } - ftp_cmd(ftp, "STOR %s", av[1]); - + return (munmap(file, buf.st_size)); + FTP_CMD(ftp, "STOR %s", av[1]); if (dconn_open(ftp) < 0) - { - munmap(file, buf.st_size); - return (-1); - } + return (munmap(file, buf.st_size)); send(ftp->d_sock, file, buf.st_size, 0); close(ftp->d_sock); dconn_close(ftp); diff --git a/ftp/srcs/client/cli_pwd.c b/ftp/srcs/client/cli_pwd.c index 4d26493f..a4751883 100644 --- a/ftp/srcs/client/cli_pwd.c +++ b/ftp/srcs/client/cli_pwd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 12:33:09 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:27:13 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ int cli_pwd(t_ftp *ftp, char **av) { (void)av; - ftp_cmd(ftp, "PWD"); + FTP_CMD(ftp, "PWD"); ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_rmd.c b/ftp/srcs/client/cli_rmd.c index 528b5e76..af68f701 100644 --- a/ftp/srcs/client/cli_rmd.c +++ b/ftp/srcs/client/cli_rmd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:24:11 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:36:59 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ int cli_rmd(t_ftp *ftp, char **av) { if (!av[1] || av[2]) return (console_msg(-1, "usage: rmdir ")); - ftp_cmd(ftp, "RMD %s", av[1]); + FTP_CMD(ftp, "RMD %s", av[1]); ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_user.c b/ftp/srcs/client/cli_user.c index af21e946..563e0b11 100644 --- a/ftp/srcs/client/cli_user.c +++ b/ftp/srcs/client/cli_user.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 10:17:03 by jhalford #+# #+# */ -/* Updated: 2017/11/09 10:21:45 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:19:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ int cli_user(t_ftp *ftp, char **av) console_msg(-1, "usage: user "); return (-1); } - ftp_cmd(ftp, "USER %s", av[1]); + FTP_CMD(ftp, "USER %s", av[1]); code = ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/client.c b/ftp/srcs/client/client.c index 6874aa5b..bd4fe338 100644 --- a/ftp/srcs/client/client.c +++ b/ftp/srcs/client/client.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/04/02 19:18:31 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:42:00 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:56:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,6 @@ t_cmd_map g_cli_cmd[] = {"?", cli_help, "print local help information"}, {"debug", cli_debug, "set debugging level"}, - /* {"l", cli_do_local, "execute a local command"}, */ {0, 0, 0}, }; int g_debug = 1; @@ -74,14 +73,12 @@ int do_client(t_ftp *ftp) int main(int ac, char **av) { - int port; int sock; t_ftp ftp; if (ac != 3) ft_usage(FTP_CLIENT_USAGE, av[0]); - port = ft_atoi(av[2]); - if ((sock = create_client(av[1], port, "tcp")) < 0) + if ((sock = create_tcpclient(av[1], av[2])) < 0) { perror(av[0]); return (1); diff --git a/ftp/srcs/client/crlf.c b/ftp/srcs/client/crlf.c index 2b32bb9f..2822cd90 100644 --- a/ftp/srcs/client/crlf.c +++ b/ftp/srcs/client/crlf.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:52:09 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:56:15 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ /* ** stream mode with file structure --> raw data no EOF */ + int ftp_recvraw(int sock, char **msg) { int ret; diff --git a/ftp/srcs/client/dconn.c b/ftp/srcs/client/dconn.c index 49dde8ad..9ea92c4d 100644 --- a/ftp/srcs/client/dconn.c +++ b/ftp/srcs/client/dconn.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:20:14 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:58:42 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ static int dconn_open_pasv(t_ftp *ftp) if (connect(sock, (struct sockaddr*)&ftp->dconn.sin, sizeof(struct sockaddr_in)) < 0) { - return(-1); + return (-1); } ftp->d_sock = sock; return (0); @@ -32,7 +32,7 @@ static int dconn_open_actv(t_ftp *ftp) if ((sock = accept(ftp->dconn.sock, NULL, NULL)) < 0) { - return(-1); + return (-1); } ftp->d_sock = sock; return (0); @@ -51,7 +51,7 @@ int dconn_init(t_ftp *ftp) int dconn_open(t_ftp *ftp) { int code; - + code = ftp_code(ftp); if (code == 150) { @@ -61,14 +61,14 @@ int dconn_open(t_ftp *ftp) return (dconn_open_pasv(ftp)); } else if (code == 125) - return (0); + return (0); return (-1); } int dconn_close(t_ftp *ftp) { int code; - + if ((code = ftp_code(ftp)) < 0) return (-1); if (code == 226) diff --git a/ftp/srcs/server/cmd_cwd.c b/ftp/srcs/server/cmd_cwd.c index 9fa06581..2b004181 100644 --- a/ftp/srcs/server/cmd_cwd.c +++ b/ftp/srcs/server/cmd_cwd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 13:36:24 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:34:43 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ int cmd_cwd(t_ftp *ftp, char **av) if (chdir(av[1])) { console_msg(1, "chdir(%s) failed errno=%i", av[1], errno); - ftp_ret(ftp, "550 directory not found"); + FTP_RET(ftp, "550 directory not found"); } else { @@ -30,10 +30,10 @@ int cmd_cwd(t_ftp *ftp, char **av) { console_msg(0, "%s -> %s", buf, ftp->path); chdir(old); - ftp_ret(ftp, "550 unauthorized directory"); + FTP_RET(ftp, "550 unauthorized directory"); } else - ftp_ret(ftp, "200 success"); + FTP_RET(ftp, "200 success"); } return (0); } diff --git a/ftp/srcs/server/cmd_dele.c b/ftp/srcs/server/cmd_dele.c index 977e923d..77230cf6 100644 --- a/ftp/srcs/server/cmd_dele.c +++ b/ftp/srcs/server/cmd_dele.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:38:40 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:39:34 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,8 +16,8 @@ int cmd_dele(t_ftp *ftp, char **av) { (void)av; if (unlink(av[1]) < 0) - return (ftp_ret(ftp, "550 unlink error")); + return (FTP_RET(ftp, "550 unlink error")); else - return (ftp_ret(ftp, "250 file '%s' deleted", av[1])); + return (FTP_RET(ftp, "250 file '%s' deleted", av[1])); return (0); } diff --git a/ftp/srcs/server/cmd_epsv.c b/ftp/srcs/server/cmd_epsv.c new file mode 100644 index 00000000..0a85c602 --- /dev/null +++ b/ftp/srcs/server/cmd_epsv.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmd_epsv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/11/12 11:13:03 by jhalford #+# #+# */ +/* Updated: 2017/11/12 14:37:44 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ftp_server.h" + +int cmd_epsv(t_ftp *ftp, char **av) +{ + uint16_t port; + int sock; + struct sockaddr_in6 sin; + + (void)av; + sin.sin6_family = AF_INET6; + sin.sin6_addr = in6addr_any; + port = 35000; + while (++port < USHRT_MAX) + { + sin.sin6_port = htons(port); + sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); + if (bind(sock, (const struct sockaddr *)&sin, + sizeof(struct sockaddr_in6)) == 0 + && listen(sock, 3) == 0) + { + ftp->data_state = DATA_EPSV; + ftp->dconn.sock = sock; + console_msg(1, "listening on %i (EPSV)", port); + return (FTP_RET(ftp, "229 (|||%hu|)", ntohs(sin.sin6_port))); + } + } + return (FTP_RET(ftp, "500 couldn't find local port")); +} diff --git a/ftp/srcs/server/cmd_list.c b/ftp/srcs/server/cmd_list.c index 67ba60c7..791c329f 100644 --- a/ftp/srcs/server/cmd_list.c +++ b/ftp/srcs/server/cmd_list.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 19:22:12 by jhalford #+# #+# */ -/* Updated: 2017/11/10 12:20:02 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 11:24:47 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ftp/srcs/server/cmd_mkd.c b/ftp/srcs/server/cmd_mkd.c index 6e875acc..fdbd11f6 100644 --- a/ftp/srcs/server/cmd_mkd.c +++ b/ftp/srcs/server/cmd_mkd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:17:53 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:47:06 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,6 @@ int cmd_mkd(t_ftp *ftp, char **av) { if (mkdir(av[1], 0755) < 0) - return (ftp_ret(ftp, "550 mkdir() error")); - return (ftp_ret(ftp, "257 '%s' created", av[1])); + return (FTP_RET(ftp, "550 mkdir() error")); + return (FTP_RET(ftp, "257 '%s' created", av[1])); } diff --git a/ftp/srcs/server/cmd_pasv.c b/ftp/srcs/server/cmd_pasv.c index 0acc92a1..f8b43338 100644 --- a/ftp/srcs/server/cmd_pasv.c +++ b/ftp/srcs/server/cmd_pasv.c @@ -6,16 +6,30 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 13:54:57 by jhalford #+# #+# */ -/* Updated: 2017/11/09 11:19:13 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:56:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "ftp_server.h" -int cmd_pasv(t_ftp *ftp, char **av) +static int pasv_ok(t_ftp *ftp, int sock, struct sockaddr_in sin) { - uint16_t port; - int sock; + ftp->data_state = DATA_PASV; + ftp->dconn.sock = sock; + console_msg(1, "listening on %i (PASV)", ntohs(sin.sin_port)); + return (FTP_RET(ftp, "227 %i,%i,%i,%i,%i,%i", + (ntohl(sin.sin_addr.s_addr) >> (8 * 3)) & 0xff, + (ntohl(sin.sin_addr.s_addr) >> (8 * 2)) & 0xff, + (ntohl(sin.sin_addr.s_addr) >> (8 * 1)) & 0xff, + (ntohl(sin.sin_addr.s_addr) >> (8 * 0)) & 0xff, + (ntohs(sin.sin_port) >> (8 * 1)) & 0xff, + (ntohs(sin.sin_port) >> (8 * 0)) & 0xff)); +} + +int cmd_pasv(t_ftp *ftp, char **av) +{ + uint16_t port; + int sock; struct sockaddr_in sin; (void)av; @@ -28,20 +42,8 @@ int cmd_pasv(t_ftp *ftp, char **av) sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (bind(sock, (const struct sockaddr *)&sin, sizeof(struct sockaddr_in)) == 0 - && listen(sock, 3) == 0) - { - ftp->data_state = DATA_PASV; - ftp->dconn.sock = sock; - console_msg(1, "listening on %i (PASV)", port); - return (ftp_ret(ftp, "227 %i,%i,%i,%i,%i,%i", - (ntohl(sin.sin_addr.s_addr) >> (8*3)) & 0xff, - (ntohl(sin.sin_addr.s_addr) >> (8*2)) & 0xff, - (ntohl(sin.sin_addr.s_addr) >> (8*1)) & 0xff, - (ntohl(sin.sin_addr.s_addr) >> (8*0)) & 0xff, - (ntohs(sin.sin_port) >> (8*1)) & 0xff, - (ntohs(sin.sin_port) >> (8*0)) & 0xff - )); - } + && listen(sock, 3) == 0) + return (pasv_ok(ftp, sock, sin)); } - return (ftp_ret(ftp, "500 couldn't find local port")); + return (FTP_RET(ftp, "500 couldn't find local port")); } diff --git a/ftp/srcs/server/cmd_port.c b/ftp/srcs/server/cmd_port.c index dde9aafa..26e8dec1 100644 --- a/ftp/srcs/server/cmd_port.c +++ b/ftp/srcs/server/cmd_port.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 18:42:50 by jhalford #+# #+# */ -/* Updated: 2017/11/09 13:16:28 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:46:08 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,14 +18,14 @@ int cmd_port(t_ftp *ftp, char **av) char buf[INET_ADDRSTRLEN]; if (!av[1]) - return (ftp_ret(ftp, "501 syntax error in parameter")); + return (FTP_RET(ftp, "501 syntax error in parameter")); if (ftp->data_state == DATA_PASV) close(ftp->dconn.sock); hostport = ft_strsplit(av[1], ','); ftp->dconn.sin.sin_family = AF_INET; ftp->dconn.sin.sin_port = htons(256 * ft_atoi(hostport[4]) + ft_atoi(hostport[5])); - ftp->dconn.sin.sin_addr.s_addr = + ftp->dconn.sin.sin_addr.s_addr = htonl( 256 * 256 * 256 * ft_atoi(hostport[0]) + 256 * 256 * ft_atoi(hostport[1]) @@ -33,7 +33,8 @@ int cmd_port(t_ftp *ftp, char **av) + ft_atoi(hostport[3])); ftp->data_state = DATA_ACTV; console_msg(1, "remote dconn @ %s:%i", - inet_ntop(AF_INET, &ftp->dconn.sin.sin_addr, buf, sizeof(struct sockaddr_in)), + inet_ntop(AF_INET, &ftp->dconn.sin.sin_addr, + buf, sizeof(struct sockaddr_in)), ntohs(ftp->dconn.sin.sin_port)); - return (ftp_ret(ftp, "200 ip/port ok")); + return (FTP_RET(ftp, "200 ip/port ok")); } diff --git a/ftp/srcs/server/cmd_pwd.c b/ftp/srcs/server/cmd_pwd.c index e7d05787..9d11f2d0 100644 --- a/ftp/srcs/server/cmd_pwd.c +++ b/ftp/srcs/server/cmd_pwd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 17:39:01 by jhalford #+# #+# */ -/* Updated: 2017/11/02 14:18:58 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,6 @@ int cmd_pwd(t_ftp *ftp, char **av) (void)av; getcwd(path, 200); - ftp_ret(ftp, "257 \"%s\"", path); + FTP_RET(ftp, "257 \"%s\"", path); return (0); } diff --git a/ftp/srcs/server/cmd_quit.c b/ftp/srcs/server/cmd_quit.c index b36f380d..39c0a031 100644 --- a/ftp/srcs/server/cmd_quit.c +++ b/ftp/srcs/server/cmd_quit.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 15:20:58 by jhalford #+# #+# */ -/* Updated: 2017/11/02 15:31:17 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,6 @@ int cmd_quit(t_ftp *ftp, char **av) (void)av; close(ftp->cmd_sock); ftp->cmd_sock = 0; - ftp_ret(ftp, "221 service closing control connection"); + FTP_RET(ftp, "221 service closing control connection"); return (1); } diff --git a/ftp/srcs/server/cmd_retr.c b/ftp/srcs/server/cmd_retr.c index f7d71ccd..e6eeb894 100644 --- a/ftp/srcs/server/cmd_retr.c +++ b/ftp/srcs/server/cmd_retr.c @@ -6,43 +6,46 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 15:32:28 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:54:04 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:50:38 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "ftp_server.h" -int cmd_retr(t_ftp *ftp, char **av) +static int retr_internal(t_ftp *ftp, struct stat buf, int fd) +{ + char *file; + + if ((file = mmap(NULL, buf.st_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0)) == MAP_FAILED) + { + close(fd); + return (FTP_RET(ftp, "550 mmap failed")); + } + close(fd); + if (dconn_open(ftp) < 0) + { + munmap(file, buf.st_size); + return (-1); + } + send(ftp->d_sock, file, buf.st_size, 0); + dconn_close(ftp); + munmap(file, buf.st_size); + return (0); +} + +int cmd_retr(t_ftp *ftp, char **av) { int fd; struct stat buf; - char *file; if ((fd = open(av[1], O_RDONLY)) < 0 || fstat(fd, &buf) < 0) - return (ftp_ret(ftp, "550 file not found / no access")); + return (FTP_RET(ftp, "550 file not found / no access")); if (buf.st_size) - { - if ((file = mmap(NULL, buf.st_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE, fd, 0)) == MAP_FAILED) - { - close(fd); - return (ftp_ret(ftp, "550 mmap failed")); - } - close(fd); - if (dconn_open(ftp) < 0) - { - munmap(file, buf.st_size); - return (-1); - } - send(ftp->d_sock, file, buf.st_size, 0); - dconn_close(ftp); - munmap(file, buf.st_size); - } - else - { - if (dconn_open(ftp) < 0) - return (-1); - dconn_close(ftp); - } + return (retr_internal(ftp, buf, fd)); + close(fd); + if (dconn_open(ftp) < 0) + return (-1); + dconn_close(ftp); return (0); } diff --git a/ftp/srcs/server/cmd_rmd.c b/ftp/srcs/server/cmd_rmd.c index 665138df..747bdd34 100644 --- a/ftp/srcs/server/cmd_rmd.c +++ b/ftp/srcs/server/cmd_rmd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 19:21:10 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:48:53 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,6 @@ int cmd_rmd(t_ftp *ftp, char **av) { if (remove(av[1]) < 0) - return (ftp_ret(ftp, "550 remove(3) error")); - return (ftp_ret(ftp, "257 '%s' deleted", av[1])); + return (FTP_RET(ftp, "550 remove(3) error")); + return (FTP_RET(ftp, "257 '%s' deleted", av[1])); } diff --git a/ftp/srcs/server/cmd_stor.c b/ftp/srcs/server/cmd_stor.c index bca6d647..ba9429d7 100644 --- a/ftp/srcs/server/cmd_stor.c +++ b/ftp/srcs/server/cmd_stor.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 16:01:54 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:17:46 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ int cmd_stor(t_ftp *ftp, char **av) if (dconn_open(ftp) < 0) return (-1); if ((fd = open(av[1], O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) - return (ftp_ret(ftp, "550 couldn't open/create file")); + return (FTP_RET(ftp, "550 couldn't open/create file")); size = ftp_recvraw(ftp->d_sock, &msg); write(fd, msg, size); ft_strdel(&msg); diff --git a/ftp/srcs/server/cmd_type.c b/ftp/srcs/server/cmd_type.c index 794089d7..f8bc67ce 100644 --- a/ftp/srcs/server/cmd_type.c +++ b/ftp/srcs/server/cmd_type.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 18:14:51 by jhalford #+# #+# */ -/* Updated: 2017/11/10 13:29:46 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,16 +15,16 @@ int cmd_type(t_ftp *ftp, char **av) { if (!av[1]) - ftp_ret(ftp, "501 syntax error in parameter"); + FTP_RET(ftp, "501 syntax error in parameter"); if (av[1][0] == 'A') { - ftp_ret(ftp, "200 type A ok"); + FTP_RET(ftp, "200 type A ok"); } else if (av[1][0] == 'I') { - ftp_ret(ftp, "200 type I ok"); + FTP_RET(ftp, "200 type I ok"); } else - ftp_ret(ftp, "500 parameter unrecognized"); + FTP_RET(ftp, "500 parameter unrecognized"); return (1); } diff --git a/ftp/srcs/server/cmd_user.c b/ftp/srcs/server/cmd_user.c index d879114c..9c7a304f 100644 --- a/ftp/srcs/server/cmd_user.c +++ b/ftp/srcs/server/cmd_user.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 14:20:46 by jhalford #+# #+# */ -/* Updated: 2017/11/09 12:31:01 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:37:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ int cmd_user(t_ftp *ftp, char **av) { if (ftp->log_state == LOG_YES) { - ftp_ret(ftp, "230 user '%s' logged in, proceed", ftp->username); + FTP_RET(ftp, "230 user '%s' logged in, proceed", ftp->username); return (0); } ft_strcpy(ftp->username, av[1]); @@ -24,10 +24,10 @@ int cmd_user(t_ftp *ftp, char **av) ft_strcat(ftp->path, av[1]); if (mkdir(ftp->path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0 && chdir(ftp->path) < 0) - return (ftp_ret(ftp, "530 mkdir/chdir")); + return (FTP_RET(ftp, "530 mkdir/chdir")); if (getcwd(ftp->path, 100) < 0) - return (ftp_ret(ftp, "530 getcwd")); - ftp_ret(ftp, "230 user '%s' logged in, proceed", ftp->username); + return (FTP_RET(ftp, "530 getcwd")); + FTP_RET(ftp, "230 user '%s' logged in, proceed", ftp->username); console_msg(1, "logon: %s@ftp://%s", ftp->username, ftp->path); ftp->log_state = LOG_YES; return (0); diff --git a/ftp/srcs/server/crlf.c b/ftp/srcs/server/crlf.c index 0803828b..9d7897b4 100644 --- a/ftp/srcs/server/crlf.c +++ b/ftp/srcs/server/crlf.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */ -/* Updated: 2017/11/10 18:55:45 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:45:09 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ /* ** stream mode with file structure --> raw data no EOF */ + int ftp_recvraw(int sock, char **msg) { int ret; diff --git a/ftp/srcs/server/dconn.c b/ftp/srcs/server/dconn.c index 337bcba5..ce13703b 100644 --- a/ftp/srcs/server/dconn.c +++ b/ftp/srcs/server/dconn.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */ -/* Updated: 2017/11/10 17:45:13 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:44:50 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,13 +16,13 @@ static int dconn_open_actv(t_ftp *ftp) { int sock; - ftp_ret(ftp, "150 about to open data connection"); + FTP_RET(ftp, "150 about to open data connection"); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (connect(sock, (struct sockaddr*)&ftp->dconn.sin, sizeof(struct sockaddr_in)) < 0) { - ftp_ret(ftp, "425 can't open data conn"); - return(-1); + FTP_RET(ftp, "425 can't open data conn"); + return (-1); } ftp->d_sock = sock; return (0); @@ -32,11 +32,11 @@ static int dconn_open_pasv(t_ftp *ftp) { int sock; - ftp_ret(ftp, "150 about to accept"); + FTP_RET(ftp, "150 about to accept"); if ((sock = accept(ftp->dconn.sock, NULL, NULL)) < 0) { - ftp_ret(ftp, "425 can't open data conn"); - return(-1); + FTP_RET(ftp, "425 can't open data conn"); + return (-1); } ftp->d_sock = sock; return (0); @@ -46,16 +46,16 @@ int dconn_open(t_ftp *ftp) { if (ftp->d_sock) { - ftp_ret(ftp, "125 data connection already open; transfer starting"); + FTP_RET(ftp, "125 data connection already open; transfer starting"); return (0); } else if (ftp->data_state == DATA_ACTV) return (dconn_open_actv(ftp)); - else if (ftp->data_state == DATA_PASV) + else if (ftp->data_state == DATA_PASV || ftp->data_state == DATA_EPSV) return (dconn_open_pasv(ftp)); else { - ftp_ret(ftp, "425 can't establish data connection"); + FTP_RET(ftp, "425 can't establish data connection"); console_msg(1, "dconn_open() called but no dconn available"); return (-1); } @@ -63,7 +63,7 @@ int dconn_open(t_ftp *ftp) int dconn_close(t_ftp *ftp) { - ftp_ret(ftp, "226 closing dataconn"); + FTP_RET(ftp, "226 closing dataconn"); if (ftp->data_state == DATA_PASV) { close(ftp->dconn.sock); diff --git a/ftp/srcs/server/server.c b/ftp/srcs/server/server.c index 6a31cf6f..0a14ff96 100644 --- a/ftp/srcs/server/server.c +++ b/ftp/srcs/server/server.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/04/02 15:02:48 by jhalford #+# #+# */ -/* Updated: 2017/11/10 19:57:20 by jhalford ### ########.fr */ +/* Updated: 2017/11/12 14:44:33 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,6 +25,7 @@ t_ftp_cmd g_ftp_cmd[] = {"STOR", cmd_stor, LOG_YES}, {"CWD", cmd_cwd, LOG_YES}, {"PASV", cmd_pasv, LOG_YES}, + {"EPSV", cmd_epsv, LOG_YES}, {"PORT", cmd_port, LOG_YES}, {"PWD", cmd_pwd, LOG_YES}, {"TYPE", cmd_type, LOG_YES}, @@ -36,23 +37,19 @@ t_ftp_cmd g_ftp_cmd[] = }; int g_debug = 2; -int ftp_cmd(t_ftp *ftp) +int ftp_cmd(t_ftp *ftp, char *msg) { int i; - char *msg; char **av; - ftp_recv(ftp->cmd_sock, &msg); i = -1; while (g_ftp_cmd[++i].name) { - if (ft_strncmp(msg, g_ftp_cmd[i].name, + if (ft_strncmp(msg, g_ftp_cmd[i].name, ft_strlen(g_ftp_cmd[i].name)) == 0) { if (ftp->log_state < g_ftp_cmd[i].statelock) - { - return (ftp_ret(ftp, "530 not logged in")); - } + return (FTP_RET(ftp, "530 not logged in")); if (!(g_ftp_cmd[i].f)) break ; else @@ -64,22 +61,26 @@ int ftp_cmd(t_ftp *ftp) return (0); } } - ftp_ret(ftp, "502 command not implemented"); - ft_strdel(&msg); + FTP_RET(ftp, "502 command not implemented"); return (1); } int ftp_spawn(int sock) { t_ftp ftp; + char *msg; ftp.cmd_sock = sock; ftp.log_state = LOG_NONE; ftp.d_sock = 0; ftp.data_state = DATA_NONE; - ftp_ret(&ftp, "220 ready for user"); + FTP_RET(&ftp, "220 ready for user"); while (ftp.cmd_sock) - ftp_cmd(&ftp); + { + ftp_recv(ftp.cmd_sock, &msg); + ftp_cmd(&ftp, msg); + ft_strdel(&msg); + } close(ftp.cmd_sock); return (0); }