upload/download for big files is much more consistent

This commit is contained in:
Jack Halford 2017-11-15 13:30:02 +01:00
parent 8922e82aae
commit fe4d06be47
13 changed files with 68 additions and 47 deletions

View file

@ -1 +0,0 @@
Hello ftp world

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/10 13:00:28 by jhalford #+# #+# */ /* Created: 2017/11/10 13:00:28 by jhalford #+# #+# */
/* Updated: 2017/11/12 15:02:03 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:23:32 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -34,9 +34,15 @@ int cli_get(t_ftp *ftp, char **av)
FTP_CMD(ftp, "RETR %s", av[1]); FTP_CMD(ftp, "RETR %s", av[1]);
if (dconn_open(ftp) < 0) if (dconn_open(ftp) < 0)
return (cleanup(fd, av[1])); return (cleanup(fd, av[1]));
size = ftp_recvraw(ftp->d_sock, &msg); console_msg(0, "download in progress... please wait");
write(fd, msg, size); if ((size = ftp_recvraw(ftp->d_sock, &msg)) < 0)
ft_strdel(&msg); console_msg(0, "download FAIL");
else
{
console_msg(0, "download SUCCESS");
write(fd, msg, size);
ft_strdel(&msg);
}
close(fd); close(fd);
dconn_close(ftp); dconn_close(ftp);
return (0); return (0);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/10 16:20:14 by jhalford #+# #+# */ /* Created: 2017/11/10 16:20:14 by jhalford #+# #+# */
/* Updated: 2017/11/12 19:19:47 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:22:33 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -44,13 +44,17 @@ int cli_put(t_ftp *ftp, char **av)
return (munmap(file, buf.st_size)); return (munmap(file, buf.st_size));
FTP_CMD(ftp, "STOR %s", fname(av[1])); FTP_CMD(ftp, "STOR %s", fname(av[1]));
if (dconn_open(ftp) < 0) if (dconn_open(ftp) < 0)
{
console_msg(0, "Upload FAIL");
return (munmap(file, buf.st_size)); return (munmap(file, buf.st_size));
console_msg(0, "Upload in progess, please wait... %i", buf.st_size); }
/* ftp_sendraw(ftp->d_sock, file, buf.st_size); */ console_msg(0, "upload in progess, please wait... (%i bytes)", buf.st_size);
send(ftp->d_sock, file, buf.st_size, 0); if (send(ftp->d_sock, file, buf.st_size, 0) < 0)
console_msg(0, "upload FAIL");
else
console_msg(0, "upload SUCCESS");
close(ftp->d_sock); close(ftp->d_sock);
ftp->d_sock = 0; ftp->d_sock = 0;
dconn_close(ftp);
munmap(file, buf.st_size); munmap(file, buf.st_size);
return (0); return (dconn_close(ftp));
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/10/08 12:05:23 by jhalford #+# #+# */ /* Created: 2017/10/08 12:05:23 by jhalford #+# #+# */
/* Updated: 2017/11/10 16:17:59 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:00:38 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */ /* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */
/* Updated: 2017/11/12 19:11:18 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:26:43 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,19 +16,21 @@
** stream mode with file structure --> raw data no EOF ** stream mode with file structure --> raw data no EOF
*/ */
#define M (1024 * 1024) #define M (1024 * 1024)
#define CHUNK (M)
int ftp_recvraw(int sock, char **msg) int ftp_recvraw(int sock, char **msg)
{ {
int ret; int ret;
char buf[1024]; char buf[CHUNK];
void *tmp; void *tmp;
int size; int size;
tmp = NULL; tmp = NULL;
size = 0; size = 0;
while ((ret = recv(sock, buf, 1024, 0)) > 0) while ((ret = recv(sock, buf, CHUNK, 0)) > 0)
{ {
console_msg(2, "recv size=%i", ret);
buf[ret] = 0; buf[ret] = 0;
*msg = ft_strnew(size + ret); *msg = ft_strnew(size + ret);
ft_memcpy(*msg, tmp, size); ft_memcpy(*msg, tmp, size);
@ -71,19 +73,15 @@ int ftp_sendraw(int sock, char *file, off_t size)
sent = 0; sent = 0;
chunk = M / 512; chunk = M / 512;
DG("size=%zu", size);
while (sent < size) while (sent < size)
{ {
if (size - sent < chunk) if (size - sent < chunk)
chunk = size - sent; chunk = size - sent;
DG("sent=%zu", sent);
ret = send(sock, file, chunk, 0); ret = send(sock, file, chunk, 0);
DG("ret=%i", ret);
console_msg(2, "---> sendraw error"); console_msg(2, "---> sendraw error");
file += chunk; file += chunk;
sent += chunk; sent += chunk;
} }
DG("sent=%zu", sent);
console_msg(1, "---> rawsend done size %zu", size); console_msg(1, "---> rawsend done size %zu", size);
return (0); return (0);
} }
@ -115,8 +113,8 @@ int ftp_msg(t_ftp *ftp, char **msg)
if (ftp_recv(ftp->cmd_sock, msg) < 0) if (ftp_recv(ftp->cmd_sock, msg) < 0)
return (-1); return (-1);
console_msg(0, "<--- %s", *msg);
code = ft_atoi(*msg); code = ft_atoi(*msg);
console_msg(0, "<--- %s (%i)", *msg, code);
return (code); return (code);
} }
@ -125,7 +123,8 @@ int ftp_code(t_ftp *ftp)
char *msg; char *msg;
int code; int code;
code = ftp_msg(ftp, &msg); if ((code = ftp_msg(ftp, &msg)) < 0)
return (-1);
ft_strdel(&msg); ft_strdel(&msg);
return (code); return (code);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */ /* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */
/* Updated: 2017/11/12 18:48:44 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:11:45 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -52,7 +52,11 @@ int dconn_open(t_ftp *ftp)
{ {
int code; int code;
code = ftp_code(ftp); if ((code = ftp_code(ftp)) < 0)
{
console_msg(1, "code=%i", code);
return (-1);
}
if (code == 150) if (code == 150)
{ {
if (ftp->data_state == DATA_ACTV) if (ftp->data_state == DATA_ACTV)
@ -69,10 +73,8 @@ int dconn_close(t_ftp *ftp)
{ {
int code; int code;
DG("check");
if ((code = ftp_code(ftp)) < 0) if ((code = ftp_code(ftp)) < 0)
return (-1); return (-1);
DG("check");
if (code == 226) if (code == 226)
{ {
if (ftp->d_sock != 0) if (ftp->d_sock != 0)

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/02 15:32:28 by jhalford #+# #+# */ /* Created: 2017/11/02 15:32:28 by jhalford #+# #+# */
/* Updated: 2017/11/12 14:50:38 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:23:28 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -28,7 +28,11 @@ static int retr_internal(t_ftp *ftp, struct stat buf, int fd)
munmap(file, buf.st_size); munmap(file, buf.st_size);
return (-1); return (-1);
} }
console_msg(1, "starting upload");
send(ftp->d_sock, file, buf.st_size, 0); send(ftp->d_sock, file, buf.st_size, 0);
console_msg(1, "upload done");
close(ftp->d_sock);
ftp->d_sock = 0;
dconn_close(ftp); dconn_close(ftp);
munmap(file, buf.st_size); munmap(file, buf.st_size);
return (0); return (0);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/02 16:01:54 by jhalford #+# #+# */ /* Created: 2017/11/02 16:01:54 by jhalford #+# #+# */
/* Updated: 2017/11/12 18:35:55 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:01:47 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -25,7 +25,9 @@ int cmd_stor(t_ftp *ftp, char **av)
dconn_close(ftp); dconn_close(ftp);
return (FTP_RET(ftp, "550 couldn't open/create file")); return (FTP_RET(ftp, "550 couldn't open/create file"));
} }
console_msg(2, "recvraw() now");
size = ftp_recvraw(ftp->d_sock, &msg); size = ftp_recvraw(ftp->d_sock, &msg);
console_msg(2, "recvraw() done");
write(fd, msg, size); write(fd, msg, size);
ft_strdel(&msg); ft_strdel(&msg);
close(fd); close(fd);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/10/08 12:05:23 by jhalford #+# #+# */ /* Created: 2017/10/08 12:05:23 by jhalford #+# #+# */
/* Updated: 2017/11/08 19:57:41 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:28:07 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,16 +17,19 @@ int console_msg(int level, char *str, ...)
va_list ap; va_list ap;
va_start(ap, str); va_start(ap, str);
ft_dprintf(2, "|%-5d| ", getpid());
if (g_debug >= level) if (g_debug >= level)
{ {
if (level == -1) if (level == -1)
ft_printf("{red}"); ft_dprintf(2, "{red}");
if (level == 0) else if (level == 0)
ft_printf("{blu}"); ft_dprintf(2, "{blu}");
else if (level == 1)
ft_dprintf(2, "{gre}");
else else
ft_printf("{mag}"); ft_dprintf(2, "{yel}");
ft_vdprintf(1, str, ap); ft_vdprintf(2, str, ap);
ft_printf("{eoc}\n"); ft_dprintf(2, "{eoc}\n");
} }
return (level); return (level);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */ /* Created: 2017/11/08 19:52:07 by jhalford #+# #+# */
/* Updated: 2017/11/12 19:02:56 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:27:59 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,18 +16,20 @@
** stream mode with file structure --> raw data no EOF ** stream mode with file structure --> raw data no EOF
*/ */
#define M (1024 * 1024) #define M (1024 * 1024)
#define CHUNK (M)
int ftp_recvraw(int sock, char **msg) int ftp_recvraw(int sock, char **msg)
{ {
int ret; int ret;
char buf[10 * M]; char buf[CHUNK];
void *tmp; void *tmp;
int size; int size;
size = 0; size = 0;
tmp = NULL; tmp = NULL;
while ((ret = recv(sock, buf, 10 * M, 0)) > 0) console_msg(0, "starting download...");
while ((ret = recv(sock, buf, CHUNK, 0)) > 0)
{ {
buf[ret] = 0; buf[ret] = 0;
*msg = ft_strnew(size + ret); *msg = ft_strnew(size + ret);
@ -37,7 +39,7 @@ int ftp_recvraw(int sock, char **msg)
tmp = *msg; tmp = *msg;
size += ret; size += ret;
} }
console_msg(2, "%-5i<--- raw msg size %i", getpid(), size); console_msg(2, "<--- raw msg size %i", size);
return (size); return (size);
} }
@ -50,7 +52,7 @@ int ftp_recv(int sock, char **msg)
return (ret); return (ret);
if (ret == 0) if (ret == 0)
{ {
console_msg(0, "%-5i client terminated", getpid()); console_msg(0, "client terminated");
exit(0); exit(0);
} }
buf[ret] = 0; buf[ret] = 0;
@ -64,7 +66,7 @@ int ftp_recv(int sock, char **msg)
return (1); return (1);
} }
*msg = ft_strdup(buf); *msg = ft_strdup(buf);
console_msg(0, "%-5i<--- %s", getpid(), buf); console_msg(0, "<--- %s", buf);
return (0); return (0);
} }
@ -80,10 +82,10 @@ int ftp_send(int sock, char *msg, ...)
crlf_msg = ft_strjoin(crlf_tmp, "\r\n"); crlf_msg = ft_strjoin(crlf_tmp, "\r\n");
if ((err = send(sock, crlf_msg, ft_strlen(crlf_msg), 0)) < 0) if ((err = send(sock, crlf_msg, ft_strlen(crlf_msg), 0)) < 0)
{ {
console_msg(1, "%-5i---> send error '%s'", getpid(), crlf_tmp); console_msg(1, "---> send error '%s'", crlf_tmp);
return (err); return (err);
} }
console_msg(0, "%-5i---> %s", getpid(), crlf_tmp); console_msg(0, "---> %s", crlf_tmp);
ft_strdel(&crlf_tmp); ft_strdel(&crlf_tmp);
ft_strdel(&crlf_msg); ft_strdel(&crlf_msg);
return (ft_atoi(msg)); return (ft_atoi(msg));

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */ /* Created: 2017/11/08 14:55:15 by jhalford #+# #+# */
/* Updated: 2017/11/12 14:44:50 by jhalford ### ########.fr */ /* Updated: 2017/11/15 13:11:03 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/02 15:02:48 by jhalford #+# #+# */ /* Created: 2017/04/02 15:02:48 by jhalford #+# #+# */
/* Updated: 2017/11/12 17:59:25 by jhalford ### ########.fr */ /* Updated: 2017/11/15 12:47:20 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -35,7 +35,7 @@ t_ftp_cmd g_ftp_cmd[] =
{"DELE", cmd_dele, LOG_YES}, {"DELE", cmd_dele, LOG_YES},
{0, 0, 0}, {0, 0, 0},
}; };
int g_debug = 2; int g_debug = 10;
int ftp_cmd(t_ftp *ftp, char *msg) int ftp_cmd(t_ftp *ftp, char *msg)
{ {