diff --git a/ftp/Makefile b/ftp/Makefile index 82efdc58..27ce2df0 100644 --- a/ftp/Makefile +++ b/ftp/Makefile @@ -36,9 +36,11 @@ client/cli_debug.c\ client/cli_get.c\ client/cli_help.c\ client/cli_ls.c\ +client/cli_mkd.c\ client/cli_pasv.c\ client/cli_put.c\ client/cli_pwd.c\ +client/cli_rmd.c\ client/cli_user.c\ client/client.c\ client/console_msg.c\ @@ -46,11 +48,13 @@ client/crlf.c\ client/dconn.c\ server/cmd_cwd.c\ server/cmd_list.c\ +server/cmd_mkd.c\ server/cmd_pasv.c\ server/cmd_port.c\ server/cmd_pwd.c\ server/cmd_quit.c\ server/cmd_retr.c\ +server/cmd_rmd.c\ server/cmd_stor.c\ server/cmd_type.c\ server/cmd_user.c\ diff --git a/ftp/includes/ftp_client.h b/ftp/includes/ftp_client.h index b3f60857..5af3593b 100644 --- a/ftp/includes/ftp_client.h +++ b/ftp/includes/ftp_client.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 15:50:56 by jhalford #+# #+# */ -/* Updated: 2017/11/10 17:25:37 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:28:43 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -62,7 +62,6 @@ int ftp_msg(t_ftp *ftp, char **msg); int ftp_code(t_ftp *ftp); int ftp_send(int sock, char *msg, ...); -int ftp_sendraw(int sock, char *msg, ...); int ftp_recv(int sock, char **msg); int ftp_recvraw(int sock, char **msg); @@ -79,10 +78,11 @@ 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_pasv(t_ftp *ftp); diff --git a/ftp/includes/ftp_server.h b/ftp/includes/ftp_server.h index c6ef8745..08bd81b5 100644 --- a/ftp/includes/ftp_server.h +++ b/ftp/includes/ftp_server.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/01 15:56:59 by jhalford #+# #+# */ -/* Updated: 2017/11/10 17:41:01 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:21:00 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -69,7 +69,6 @@ extern int g_debug; extern char g_rootdir[PATH_MAX]; int ftp_send(int sock, char *msg, ...); -int ftp_sendraw(int sock, char *msg, ...); int ftp_recv(int sock, char **msg); int ftp_recvraw(int sock, char **msg); int dconn_open(t_ftp *ftp); @@ -86,5 +85,9 @@ 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); #endif diff --git a/ftp/libft/srcs/net/create_client.c b/ftp/libft/srcs/net/create_client.c index 3cbd1730..325b760f 100644 --- a/ftp/libft/srcs/net/create_client.c +++ b/ftp/libft/srcs/net/create_client.c @@ -6,13 +6,32 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/10/07 17:59:28 by jhalford #+# #+# */ -/* Updated: 2017/10/07 18:02:25 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:29:49 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -int create_client(char *addr, int port, char *protoname) +void resolve_host(struct sockaddr *s, char *hostname) +{ + struct addrinfo *result; + struct addrinfo hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags |= AI_CANONNAME; + if (getaddrinfo(hostname, NULL, &hints, &result) != 0) + { + perror("getaddrinfo"); + exit(1); + } + ft_memcpy(((struct sockaddr_in*)s), + result->ai_addr, sizeof(struct sockaddr)); + freeaddrinfo(result); +} + +int create_client(char *host, int port, char *protoname) { int sock; struct protoent *proto; @@ -21,9 +40,9 @@ int create_client(char *addr, int port, char *protoname) 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); - sin.sin_addr.s_addr = inet_addr(addr); if (connect(sock, (const struct sockaddr *)&sin, sizeof(sin)) < 0) return (-1); return (sock); diff --git a/ftp/libft/srcs/printing/hexdump.c b/ftp/libft/srcs/printing/hexdump.c index de933085..b27c1223 100644 --- a/ftp/libft/srcs/printing/hexdump.c +++ b/ftp/libft/srcs/printing/hexdump.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/10/07 17:56:14 by jhalford #+# #+# */ -/* Updated: 2017/10/07 17:56:40 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:39:31 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ftp/libft/srcs/str/ft_strjoin.c b/ftp/libft/srcs/str/ft_strjoin.c index 2c064f33..46ae7a3b 100644 --- a/ftp/libft/srcs/str/ft_strjoin.c +++ b/ftp/libft/srcs/str/ft_strjoin.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/03 14:58:18 by jhalford #+# #+# */ -/* Updated: 2017/02/19 05:50:20 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:03:04 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ftp/srcs/client/cli_cd.c b/ftp/srcs/client/cli_cd.c index d6989755..da7956f5 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 12:43:44 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:30:55 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,6 @@ int cli_cd(t_ftp *ftp, char **av) { - char *msg; - (void)av; if (!av[1] || av[2]) { @@ -23,7 +21,6 @@ int cli_cd(t_ftp *ftp, char **av) return (-1); } ftp_cmd(ftp, "CWD %s", av[1]); - ftp_recv(ftp->cmd_sock, &msg); - ft_strdel(&msg); + ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/cli_get.c b/ftp/srcs/client/cli_get.c index df1ed418..09557898 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 17:20:22 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:55:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,7 @@ int cli_get(t_ftp *ftp, char **av) { char *msg; int fd; + int size; if (!av[1] || av[2]) return (console_msg(-1, "usage: get ")); @@ -33,13 +34,9 @@ int cli_get(t_ftp *ftp, char **av) ftp_cmd(ftp, "RETR %s", av[1]); if (dconn_open(ftp) < 0) return (cleanup(fd, av[1])); - while (1) - { - if (ftp_recvraw(ftp->d_sock, &msg)) - break ; - write(fd, msg, ft_strlen(msg)); - ft_strdel(&msg); - } + size = ftp_recvraw(ftp->d_sock, &msg); + write(fd, msg, size); + ft_strdel(&msg); close(fd); dconn_close(ftp); return (0); diff --git a/ftp/srcs/client/cli_ls.c b/ftp/srcs/client/cli_ls.c index e1b128c6..dbc8f654 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 13:00:22 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:39:39 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ftp/srcs/client/cli_put.c b/ftp/srcs/client/cli_put.c index be1799b8..7be417f9 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 17:27:50 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:57:02 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,11 @@ int cli_put(t_ftp *ftp, char **av) if (!av[1] || av[2]) return (console_msg(-1, "usage: put ")); - if ((fd = open(av[1], O_RDONLY)) < 0 || fstat(fd, &buf) < 0) + { + console_msg(0, "no such file or directory"); return (-1); + } if (!buf.st_size || (file = mmap(NULL, buf.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED) { @@ -42,7 +44,8 @@ int cli_put(t_ftp *ftp, char **av) munmap(file, buf.st_size); return (-1); } - ftp_sendraw(ftp->d_sock, file); + send(ftp->d_sock, file, buf.st_size, 0); + close(ftp->d_sock); dconn_close(ftp); munmap(file, buf.st_size); return (0); diff --git a/ftp/srcs/client/cli_pwd.c b/ftp/srcs/client/cli_pwd.c index 5908926b..4d26493f 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 12:42:11 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:27:13 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,11 +14,8 @@ int cli_pwd(t_ftp *ftp, char **av) { - char *msg; - (void)av; ftp_cmd(ftp, "PWD"); - ftp_recv(ftp->cmd_sock, &msg); - ft_strdel(&msg); + ftp_code(ftp); return (0); } diff --git a/ftp/srcs/client/client.c b/ftp/srcs/client/client.c index 8f2bb4d5..253ca143 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 16:34:57 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:28:27 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,8 @@ t_cmd_map g_cli_cmd[] = {"get", cli_get, "receive file"}, {"put", cli_put, "send one file"}, {"pwd", cli_pwd, "print working directory on remote machine"}, + {"mkdir", cli_mkd, "create a directory on remote machine"}, + {"rmdir", cli_rmd, "remove a directory from remote machine"}, {"quit", NULL, "terminate ftp session and exit"}, {"?", cli_help, "print local help information"}, diff --git a/ftp/srcs/client/crlf.c b/ftp/srcs/client/crlf.c index 17ebd525..2b32bb9f 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 17:35:44 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:52:09 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,14 +19,23 @@ int ftp_recvraw(int sock, char **msg) { int ret; char buf[1024]; + void *tmp; + int size; - if ((ret = recv(sock, buf, 1024, 0)) <= 0) - return (-1); - buf[ret] = 0; - console_msg(2, "recv size=%i", ret); - console_msg(2, "message '%s'", buf); - *msg = ft_strdup(buf); - return (0); + tmp = NULL; + size = 0; + while ((ret = recv(sock, buf, 1024, 0)) > 0) + { + buf[ret] = 0; + *msg = ft_strnew(size + ret); + ft_memcpy(*msg, tmp, size); + ft_memcpy(*msg + size, buf, ret); + ft_memdel(&tmp); + tmp = *msg; + size += ret; + } + console_msg(2, "raw msg size %i", size); + return (size); } int ftp_recv(int sock, char **msg) @@ -51,23 +60,6 @@ int ftp_recv(int sock, char **msg) return (0); } -int ftp_sendraw(int sock, char *msg, ...) -{ - int err; - char *tmp; - va_list ap; - - va_start(ap, msg); - ft_vasprintf(&tmp, msg, ap); - console_msg(1, "---> %s", tmp); - if ((err = send(sock, tmp, ft_strlen(tmp), 0)) < 0) - { - return (err); - } - ft_strdel(&tmp); - return (ft_atoi(msg)); -} - int ftp_send(int sock, char *msg, ...) { int err; diff --git a/ftp/srcs/client/dconn.c b/ftp/srcs/client/dconn.c index 83f3e284..49dde8ad 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 16:40:24 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:20:14 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ftp/srcs/server/cmd_cwd.c b/ftp/srcs/server/cmd_cwd.c index a2c6a9af..9fa06581 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 13:00:01 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:34:43 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,8 @@ int cmd_cwd(t_ftp *ftp, char **av) { - char old[1024]; char buf[1024]; + char old[1024]; getcwd(old, 1024); if (chdir(av[1])) @@ -26,9 +26,9 @@ int cmd_cwd(t_ftp *ftp, char **av) else { getcwd(buf, 1024); - if (!ft_strstr(buf, old)) + if (!ft_strstr(buf, ftp->path)) { - console_msg(0, "%s -> %s", buf, old); + console_msg(0, "%s -> %s", buf, ftp->path); chdir(old); ftp_ret(ftp, "550 unauthorized directory"); } diff --git a/ftp/srcs/server/cmd_retr.c b/ftp/srcs/server/cmd_retr.c index 99501249..f7d71ccd 100644 --- a/ftp/srcs/server/cmd_retr.c +++ b/ftp/srcs/server/cmd_retr.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/02 15:32:28 by jhalford #+# #+# */ -/* Updated: 2017/11/10 17:32:16 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:54:04 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,7 @@ int cmd_retr(t_ftp *ftp, char **av) munmap(file, buf.st_size); return (-1); } - ftp_sendraw(ftp->d_sock, file); + send(ftp->d_sock, file, buf.st_size, 0); dconn_close(ftp); munmap(file, buf.st_size); } diff --git a/ftp/srcs/server/cmd_stor.c b/ftp/srcs/server/cmd_stor.c index b864e7a7..bca6d647 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 17:51:39 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:17:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,13 +16,14 @@ int cmd_stor(t_ftp *ftp, char **av) { int fd; char *msg; + int size; 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")); - ftp_recvraw(ftp->d_sock, &msg); - write(fd, msg, ft_strlen(msg)); + size = ftp_recvraw(ftp->d_sock, &msg); + write(fd, msg, size); ft_strdel(&msg); close(fd); dconn_close(ftp); diff --git a/ftp/srcs/server/crlf.c b/ftp/srcs/server/crlf.c index dc2aa296..0803828b 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 17:51:32 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 18:55:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,13 +19,23 @@ int ftp_recvraw(int sock, char **msg) { int ret; char buf[1024]; + void *tmp; + int size; - if ((ret = recv(sock, buf, 1024, 0)) <= 0) - return (-1); - buf[ret] = 0; - console_msg(2, "%-5i<--- raw msg '%s' (%i)", getpid(), buf, ret); - *msg = ft_strdup(buf); - return (0); + tmp = NULL; + size = 0; + while ((ret = recv(sock, buf, 1024, 0)) > 0) + { + buf[ret] = 0; + *msg = ft_strnew(size + ret); + ft_memcpy(*msg, tmp, size); + ft_memcpy(*msg + size, buf, ret); + ft_memdel(&tmp); + tmp = *msg; + size += ret; + } + console_msg(2, "%-5i<--- raw msg size %i", getpid(), size); + return (size); } int ftp_recv(int sock, char **msg) @@ -53,24 +63,6 @@ int ftp_recv(int sock, char **msg) return (0); } -int ftp_sendraw(int sock, char *msg, ...) -{ - int err; - char *tmp; - va_list ap; - - va_start(ap, msg); - ft_vasprintf(&tmp, msg, ap); - if ((err = send(sock, tmp, ft_strlen(tmp), 0)) < 0) - { - console_msg(1, "%-5i---> send error '%s'", getpid(), tmp); - return (err); - } - console_msg(0, "%-5i---> %s", getpid(), tmp); - ft_strdel(&tmp); - return (ft_atoi(msg)); -} - int ftp_send(int sock, char *msg, ...) { int err; diff --git a/ftp/srcs/server/server.c b/ftp/srcs/server/server.c index 11ce26a2..6c69ef23 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/09 10:25:33 by jhalford ### ########.fr */ +/* Updated: 2017/11/10 19:23:13 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ char g_rootdir[PATH_MAX]; t_ftp_cmd g_ftp_cmd[] = { {"USER", cmd_user, 0}, - {"QUIT", cmd_quit, 0}, + {"QUIT", cmd_quit, LOG_YES}, {"RETR", cmd_retr, LOG_YES}, {"STOR", cmd_stor, LOG_YES}, {"CWD", cmd_cwd, LOG_YES}, @@ -29,6 +29,8 @@ t_ftp_cmd g_ftp_cmd[] = {"PWD", cmd_pwd, LOG_YES}, {"TYPE", cmd_type, LOG_YES}, {"LIST", cmd_list, LOG_YES}, + {"MKD", cmd_mkd, LOG_YES}, + {"RMD", cmd_rmd, LOG_YES}, {0, 0, 0}, }; int g_debug = 2;