static int _gftpui_common_trans_file_or_dir (gftp_transfer * tdata) { gftp_file * curfle; int ret; if (g_thread_supported ()) g_static_mutex_lock (&tdata->structmutex); curfle = tdata->curfle->data; tdata->current_file_number++; if (g_thread_supported ()) g_static_mutex_unlock (&tdata->structmutex); if (curfle->transfer_action == GFTP_TRANS_ACTION_SKIP) { tdata->tot_file_trans = 0; return (0); } if ((ret = gftp_connect (tdata->fromreq)) < 0) return (ret); if ((ret = gftp_connect (tdata->toreq)) < 0) return (ret); if (S_ISDIR (curfle->st_mode)) { tdata->tot_file_trans = 0; if (curfle->startsize > 0) ret = 1; else ret = gftp_make_directory (tdata->toreq, curfle->destfile); } else { if (curfle->size == 0) { curfle->size = gftp_get_file_size (tdata->fromreq, curfle->file); 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, curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? curfle->startsize : 0, tdata->toreq, curfle->destfile, curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? curfle->startsize : 0); if (tdata->tot_file_trans < 0) ret = tdata->tot_file_trans; else { if (g_thread_supported ()) g_static_mutex_lock (&tdata->structmutex); tdata->curtrans = 0; tdata->curresumed = curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? curfle->startsize : 0; tdata->resumed_bytes += tdata->curresumed; if (g_thread_supported ()) g_static_mutex_unlock (&tdata->structmutex); ret = _gftpui_common_do_transfer_file (tdata, curfle); } } if (ret == 0) ret = _gftpui_common_preserve_perm_time (tdata, curfle); else { 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); }
static GList * _setup_current_directory_transfer (gftp_transfer * transfer, int *ret) { GHashTable * dirhash; char *pos, *newname; gftp_file * curfle; GList * lastlist; off_t *newsize; *ret = 0; if (transfer->toreq != NULL) { dirhash = gftp_gen_dir_hash (transfer->toreq, ret); if (*ret == GFTP_EFATAL) return (NULL); } else dirhash = NULL; for (lastlist = transfer->files; ; lastlist = lastlist->next) { curfle = lastlist->data; if ((pos = strrchr (curfle->file, '/')) != NULL) pos++; else pos = curfle->file; if (dirhash != NULL && (newsize = g_hash_table_lookup (dirhash, pos)) != NULL) { curfle->exists_other_side = 1; curfle->startsize = *newsize; } else curfle->exists_other_side = 0; if (curfle->size < 0 && GFTP_IS_CONNECTED (transfer->fromreq)) { curfle->size = gftp_get_file_size (transfer->fromreq, curfle->file); if (curfle->size == GFTP_EFATAL) { gftp_destroy_dir_hash (dirhash); *ret = curfle->size; return (NULL); } } if (transfer->toreq && curfle->destfile == NULL) curfle->destfile = gftp_build_path (transfer->toreq, transfer->toreq->directory, curfle->file, NULL); if (transfer->fromreq->directory != NULL && *transfer->fromreq->directory != '\0' && *curfle->file != '/') { newname = gftp_build_path (transfer->fromreq, transfer->fromreq->directory, curfle->file, NULL); g_free (curfle->file); curfle->file = newname; } if (lastlist->next == NULL) break; } gftp_destroy_dir_hash (dirhash); return (lastlist); }