int gftpui_common_transfer_files (gftp_transfer * tdata) { int ret, skipped_files; tdata->curfle = tdata->files; gftpui_common_num_child_threads++; gettimeofday (&tdata->starttime, NULL); memcpy (&tdata->lasttime, &tdata->starttime, sizeof (tdata->lasttime)); skipped_files = 0; while (tdata->curfle != NULL) { ret = _gftpui_common_trans_file_or_dir (tdata); if (tdata->cancel) { if (gftp_abort_transfer (tdata->toreq) != 0) gftp_disconnect (tdata->toreq); if (gftp_abort_transfer (tdata->fromreq) != 0) gftp_disconnect (tdata->fromreq); } else if (ret == GFTP_EFATAL || ret == GFTP_ECANIGNORE) skipped_files++; else if (ret < 0) { if (gftp_get_transfer_status (tdata, ret) == GFTP_ERETRYABLE) continue; break; } _gftpui_common_next_file_in_trans (tdata); if (tdata->cancel) { if (!tdata->skip_file) break; tdata->cancel = 0; tdata->fromreq->cancel = 0; tdata->toreq->cancel = 0; } } if (skipped_files) tdata->fromreq->logging_function (gftp_logging_error, tdata->fromreq, _("There were %d files or directories that could not be transferred. Check the log for which items were not properly transferred."), skipped_files); tdata->done = 1; gftpui_common_num_child_threads--; return (1); }
off_t gftp_transfer_file (gftp_request * fromreq, const char *fromfile, off_t fromsize, gftp_request * toreq, const char *tofile, off_t tosize) { /* Needed for systems that size(float) < size(void *) */ union { intptr_t i; float f; } maxkbs; off_t size; int ret; g_return_val_if_fail (fromreq != NULL, GFTP_EFATAL); g_return_val_if_fail (fromfile != NULL, GFTP_EFATAL); g_return_val_if_fail (toreq != NULL, GFTP_EFATAL); g_return_val_if_fail (tofile != NULL, GFTP_EFATAL); gftp_lookup_request_option (toreq, "maxkbs", &maxkbs.f); if (maxkbs.f > 0) { toreq->logging_function (gftp_logging_misc, toreq, _("File transfer will be throttled to %.2f KB/s\n"), maxkbs.f); } if (fromreq->protonum == toreq->protonum && fromreq->transfer_file != NULL) return (fromreq->transfer_file (fromreq, fromfile, fromsize, toreq, tofile, tosize)); fromreq->cached = 0; toreq->cached = 0; get_file: size = gftp_get_file (fromreq, fromfile, tosize); if (size < 0) { if (size == GFTP_ETIMEDOUT) { ret = gftp_connect (fromreq); if (ret < 0) return (ret); goto get_file; } return (size); } put_file: ret = gftp_put_file (toreq, tofile, tosize, size); if (ret != 0) { if (size == GFTP_ETIMEDOUT) { ret = gftp_connect (fromreq); if (ret < 0) return (ret); goto put_file; } if (gftp_abort_transfer (fromreq) != 0) gftp_end_transfer (fromreq); return (ret); } return (size); }