This commit is contained in:
Jack Halford 2017-11-10 19:36:29 +01:00
parent 0c523757c6
commit 8ec4bc4ff8
19 changed files with 104 additions and 95 deletions

View file

@ -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\

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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

View file

@ -6,13 +6,32 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <filename>"));
@ -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));
size = ftp_recvraw(ftp->d_sock, &msg);
write(fd, msg, size);
ft_strdel(&msg);
}
close(fd);
dconn_close(ftp);
return (0);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <filename>"));
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);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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"},

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
tmp = NULL;
size = 0;
while ((ret = recv(sock, buf, 1024, 0)) > 0)
{
buf[ret] = 0;
console_msg(2, "recv size=%i", ret);
console_msg(2, "message '%s'", buf);
*msg = ft_strdup(buf);
return (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;

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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");
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
tmp = NULL;
size = 0;
while ((ret = recv(sock, buf, 1024, 0)) > 0)
{
buf[ret] = 0;
console_msg(2, "%-5i<--- raw msg '%s' (%i)", getpid(), buf, ret);
*msg = ft_strdup(buf);
return (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;

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;