Mercurial > gftp.yaz
changeset 862:885038cb945b
2006-11-30 Brian Masney <masneyb@gftp.org>
* lib/gftp.h src/uicommon/gftpui.c - when a file transfer is restarted,
get the file size of the destination file. This is so that the file is
restarted at the proper position (closes #160239).
(_gftpui_common_do_transfer_file) - split this function into a smaller
function: _do_transfer_block().
* src/gtk/transfer.c - removed debugging statement
author | masneyb |
---|---|
date | Sat, 23 Dec 2006 16:12:21 +0000 |
parents | 5aae5b877544 |
children | 9f10d3c835cb |
files | ChangeLog lib/gftp.h src/gtk/transfer.c src/uicommon/gftpui.c |
diffstat | 4 files changed, 70 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sat Dec 23 15:56:22 2006 +0000 +++ b/ChangeLog Sat Dec 23 16:12:21 2006 +0000 @@ -1,4 +1,12 @@ 2006-11-30 Brian Masney <masneyb@gftp.org> + * lib/gftp.h src/uicommon/gftpui.c - when a file transfer is restarted, + get the file size of the destination file. This is so that the file is + restarted at the proper position (closes #160239). + (_gftpui_common_do_transfer_file) - split this function into a smaller + function: _do_transfer_block(). + + * src/gtk/transfer.c - removed debugging statement + * lib/rfc959.c lib/sshv2.c src/uicommon/gftpui.c - don't abort the entire file transfer if there is a permission denied at some point during the file transfer. Give the user an error at the very end if @@ -3745,7 +3753,7 @@ * cvsclean - added this script - * *.[ch] - added $Id: ChangeLog,v 1.505 2006/12/01 00:57:49 masneyb Exp $ tags + * *.[ch] - added $Id: ChangeLog,v 1.506 2006/12/23 16:12:17 masneyb Exp $ tags * debian/* - updated files from Debian maintainer
--- a/lib/gftp.h Sat Dec 23 15:56:22 2006 +0000 +++ b/lib/gftp.h Sat Dec 23 16:12:21 2006 +0000 @@ -256,6 +256,7 @@ done_edit : 1, /* Edit the file when done transfering? */ done_rm : 1, /* Remove the file when done */ transfer_done : 1, /* Is current file transfer done? */ + retry_transfer : 1, /* Is current file transfer done? */ is_fd : 1, /* Is this a file descriptor? */ exists_other_side; /* The file exists on the other side during the file transfer */
--- a/src/gtk/transfer.c Sat Dec 23 15:56:22 2006 +0000 +++ b/src/gtk/transfer.c Sat Dec 23 16:12:21 2006 +0000 @@ -442,7 +442,6 @@ gftpui_common_child_process_done = 0; while ((pid = waitpid (-1, &ret, WNOHANG)) > 0) { -printf ("FIXME - PID %d returned %d\n", pid, ret); do_check_done_process (pid, ret); } }
--- a/src/uicommon/gftpui.c Sat Dec 23 15:56:22 2006 +0000 +++ b/src/uicommon/gftpui.c Sat Dec 23 16:12:21 2006 +0000 @@ -1280,13 +1280,41 @@ } +static ssize_t +_do_transfer_block (gftp_transfer * tdata, gftp_file * curfle, char *buf, + size_t trans_blksize) +{ + ssize_t num_read, num_wrote, ret; + char *bufpos; + + num_read = gftp_get_next_file_chunk (tdata->fromreq, buf, trans_blksize); + if (num_read < 0) + return (num_read); + + bufpos = buf; + num_wrote = 0; + while (num_wrote < num_read) + { + if ((ret = gftp_put_next_file_chunk (tdata->toreq, bufpos, + num_read - num_wrote)) <= 0) + return (ret); + + num_wrote += ret; + bufpos += ret; + } + + return (num_read); +} + + int _gftpui_common_do_transfer_file (gftp_transfer * tdata, gftp_file * curfle) { struct timeval updatetime; intptr_t trans_blksize; - ssize_t num_read, ret; - char *buf, *bufpos; + ssize_t num_trans; + char *buf; + int ret; gftp_lookup_request_option (tdata->fromreq, "trans_blksize", &trans_blksize); buf = g_malloc (trans_blksize); @@ -1294,41 +1322,31 @@ memset (&updatetime, 0, sizeof (updatetime)); gftpui_start_current_file_in_transfer (tdata); - num_read = 0; + num_trans = 0; while (!tdata->cancel && - (num_read = gftp_get_next_file_chunk (tdata->fromreq, buf, - trans_blksize)) > 0) + (num_trans = _do_transfer_block (tdata, curfle, buf, + trans_blksize)) > 0) { - gftp_calc_kbs (tdata, num_read); + gftp_calc_kbs (tdata, num_trans); + if (tdata->lasttime.tv_sec - updatetime.tv_sec >= 1 || tdata->curtrans >= tdata->tot_file_trans) { gftpui_update_current_file_in_transfer (tdata); memcpy (&updatetime, &tdata->lasttime, sizeof (updatetime)); - } - bufpos = buf; - while (num_read > 0) - { - if ((ret = gftp_put_next_file_chunk (tdata->toreq, bufpos, - num_read)) <= 0) - { - num_read = ret; - break; - } - - num_read -= ret; - bufpos += ret; + if (tdata->current_file_retries > 0) + tdata->current_file_retries = 0; } } - if (num_read == GFTP_ENOTRANS) - num_read = 0; + if (num_trans == GFTP_ENOTRANS) + num_trans = 0; g_free (buf); gftpui_finish_current_file_in_transfer (tdata); - if ((int) num_read == 0) + if ((int) num_trans == 0) { if ((ret = gftp_end_transfer (tdata->fromreq)) < 0) return (ret); @@ -1344,7 +1362,7 @@ return (0); } else - return ((int) num_read); + return ((int) num_trans); } @@ -1463,7 +1481,8 @@ _gftpui_common_trans_file_or_dir (gftp_transfer * tdata) { int tofd, fromfd, ret; - gftp_file * curfle; + gftp_file * curfle; + off_t fsize; if (g_thread_supported ()) g_static_mutex_lock (&tdata->structmutex); @@ -1489,10 +1508,7 @@ if (S_ISDIR (curfle->st_mode)) { tdata->tot_file_trans = 0; - if (tdata->toreq->mkdir != NULL) - ret = tdata->toreq->mkdir (tdata->toreq, curfle->destfile); - else - ret = GFTP_EFATAL; + ret = gftp_make_directory (tdata->toreq, curfle->destfile); } else { @@ -1501,12 +1517,20 @@ if (curfle->size == 0) { curfle->size = gftp_get_file_size (tdata->fromreq, curfle->file); - if (!GFTP_IS_CONNECTED (tdata->fromreq)) - return (curfle->size); + if (curfle->size < 0) + return ((int) curfle->size); tdata->total_bytes += curfle->size; } + if (curfle->retry_transfer) + { + curfle->transfer_action = GFTP_TRANS_ACTION_RESUME; + curfle->startsize = gftp_get_file_size (tdata->toreq, curfle->destfile); + if (curfle->startsize < 0) + return ((int) curfle->startsize); + } + tdata->tot_file_trans = gftp_transfer_file (tdata->fromreq, curfle->file, fromfd, curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? @@ -1540,9 +1564,12 @@ ret = _gftpui_common_preserve_perm_time (tdata, curfle); } else - tdata->fromreq->logging_function (gftp_logging_error, tdata->fromreq, - _("Could not download %s from %s\n"), - curfle->file, tdata->fromreq->hostname); + { + curfle->retry_transfer = 1; + tdata->fromreq->logging_function (gftp_logging_error, tdata->fromreq, + _("Could not download %s from %s\n"), + curfle->file, tdata->fromreq->hostname); + } return (ret); }