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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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]);
if (dconn_open(ftp) < 0)
return (cleanup(fd, av[1]));
size = ftp_recvraw(ftp->d_sock, &msg);
write(fd, msg, size);
ft_strdel(&msg);
console_msg(0, "download in progress... please wait");
if ((size = ftp_recvraw(ftp->d_sock, &msg)) < 0)
console_msg(0, "download FAIL");
else
{
console_msg(0, "download SUCCESS");
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/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));
FTP_CMD(ftp, "STOR %s", fname(av[1]));
if (dconn_open(ftp) < 0)
{
console_msg(0, "Upload FAIL");
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); */
send(ftp->d_sock, file, buf.st_size, 0);
}
console_msg(0, "upload in progess, please wait... (%i bytes)", buf.st_size);
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);
ftp->d_sock = 0;
dconn_close(ftp);
munmap(file, buf.st_size);
return (0);
return (dconn_close(ftp));
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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
*/
#define M (1024 * 1024)
#define M (1024 * 1024)
#define CHUNK (M)
int ftp_recvraw(int sock, char **msg)
{
int ret;
char buf[1024];
char buf[CHUNK];
void *tmp;
int size;
tmp = NULL;
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;
*msg = ft_strnew(size + ret);
ft_memcpy(*msg, tmp, size);
@ -71,19 +73,15 @@ int ftp_sendraw(int sock, char *file, off_t size)
sent = 0;
chunk = M / 512;
DG("size=%zu", size);
while (sent < size)
{
if (size - sent < chunk)
chunk = size - sent;
DG("sent=%zu", sent);
ret = send(sock, file, chunk, 0);
DG("ret=%i", ret);
console_msg(2, "---> sendraw error");
file += chunk;
sent += chunk;
}
DG("sent=%zu", sent);
console_msg(1, "---> rawsend done size %zu", size);
return (0);
}
@ -115,8 +113,8 @@ int ftp_msg(t_ftp *ftp, char **msg)
if (ftp_recv(ftp->cmd_sock, msg) < 0)
return (-1);
console_msg(0, "<--- %s", *msg);
code = ft_atoi(*msg);
console_msg(0, "<--- %s (%i)", *msg, code);
return (code);
}
@ -125,7 +123,8 @@ int ftp_code(t_ftp *ftp)
char *msg;
int code;
code = ftp_msg(ftp, &msg);
if ((code = ftp_msg(ftp, &msg)) < 0)
return (-1);
ft_strdel(&msg);
return (code);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
code = ftp_code(ftp);
if ((code = ftp_code(ftp)) < 0)
{
console_msg(1, "code=%i", code);
return (-1);
}
if (code == 150)
{
if (ftp->data_state == DATA_ACTV)
@ -69,10 +73,8 @@ int dconn_close(t_ftp *ftp)
{
int code;
DG("check");
if ((code = ftp_code(ftp)) < 0)
return (-1);
DG("check");
if (code == 226)
{
if (ftp->d_sock != 0)

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
return (-1);
}
console_msg(1, "starting upload");
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);
munmap(file, buf.st_size);
return (0);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
return (FTP_RET(ftp, "550 couldn't open/create file"));
}
console_msg(2, "recvraw() now");
size = ftp_recvraw(ftp->d_sock, &msg);
console_msg(2, "recvraw() done");
write(fd, msg, size);
ft_strdel(&msg);
close(fd);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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_start(ap, str);
ft_dprintf(2, "|%-5d| ", getpid());
if (g_debug >= level)
{
if (level == -1)
ft_printf("{red}");
if (level == 0)
ft_printf("{blu}");
ft_dprintf(2, "{red}");
else if (level == 0)
ft_dprintf(2, "{blu}");
else if (level == 1)
ft_dprintf(2, "{gre}");
else
ft_printf("{mag}");
ft_vdprintf(1, str, ap);
ft_printf("{eoc}\n");
ft_dprintf(2, "{yel}");
ft_vdprintf(2, str, ap);
ft_dprintf(2, "{eoc}\n");
}
return (level);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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
*/
#define M (1024 * 1024)
#define M (1024 * 1024)
#define CHUNK (M)
int ftp_recvraw(int sock, char **msg)
{
int ret;
char buf[10 * M];
char buf[CHUNK];
void *tmp;
int size;
size = 0;
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;
*msg = ft_strnew(size + ret);
@ -37,7 +39,7 @@ int ftp_recvraw(int sock, char **msg)
tmp = *msg;
size += ret;
}
console_msg(2, "%-5i<--- raw msg size %i", getpid(), size);
console_msg(2, "<--- raw msg size %i", size);
return (size);
}
@ -50,7 +52,7 @@ int ftp_recv(int sock, char **msg)
return (ret);
if (ret == 0)
{
console_msg(0, "%-5i client terminated", getpid());
console_msg(0, "client terminated");
exit(0);
}
buf[ret] = 0;
@ -64,7 +66,7 @@ int ftp_recv(int sock, char **msg)
return (1);
}
*msg = ft_strdup(buf);
console_msg(0, "%-5i<--- %s", getpid(), buf);
console_msg(0, "<--- %s", buf);
return (0);
}
@ -80,10 +82,10 @@ int ftp_send(int sock, char *msg, ...)
crlf_msg = ft_strjoin(crlf_tmp, "\r\n");
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);
}
console_msg(0, "%-5i---> %s", getpid(), crlf_tmp);
console_msg(0, "---> %s", crlf_tmp);
ft_strdel(&crlf_tmp);
ft_strdel(&crlf_msg);
return (ft_atoi(msg));

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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},
{0, 0, 0},
};
int g_debug = 2;
int g_debug = 10;
int ftp_cmd(t_ftp *ftp, char *msg)
{