Mercurial > gftp.yaz
comparison src/uicommon/gftpui.c @ 811:789ff8cb3170
2006-9-14 Brian Masney <masneyb@gftp.org>
* src/uicommon/gftpui.c - added _do_transfer_file(). This will take
care of the actual file transfer. It will also make sure that the
entire buffer has been transmitted properly.
* lib/protocols.c lib/rfc959.c (*_put_next_file_chunk) - removed
unneeded code that checks for a block size of 0
* lib/rfc959.c (rfc959_syst) - disable show_hidden_files and
resolve_remote_symlinks if the remote system type is OS/400.
author | masneyb |
---|---|
date | Thu, 14 Sep 2006 09:07:29 +0000 |
parents | 0807446c6f11 |
children | d6fdfcbdb056 |
comparison
equal
deleted
inserted
replaced
810:6cdba64ec675 | 811:789ff8cb3170 |
---|---|
1289 } | 1289 } |
1290 } | 1290 } |
1291 | 1291 |
1292 | 1292 |
1293 int | 1293 int |
1294 _do_transfer_file (gftp_transfer * tdata) | |
1295 { | |
1296 struct timeval updatetime; | |
1297 intptr_t trans_blksize; | |
1298 ssize_t num_read, ret; | |
1299 char *buf, *bufpos; | |
1300 | |
1301 gftp_lookup_request_option (tdata->fromreq, "trans_blksize", &trans_blksize); | |
1302 buf = g_malloc (trans_blksize); | |
1303 | |
1304 memset (&updatetime, 0, sizeof (updatetime)); | |
1305 gftpui_start_current_file_in_transfer (tdata); | |
1306 | |
1307 while (!tdata->cancel && | |
1308 (num_read = gftp_get_next_file_chunk (tdata->fromreq, buf, | |
1309 trans_blksize)) > 0) | |
1310 { | |
1311 gftp_calc_kbs (tdata, num_read); | |
1312 if (tdata->lasttime.tv_sec - updatetime.tv_sec >= 1 || | |
1313 tdata->curtrans >= tdata->tot_file_trans) | |
1314 { | |
1315 gftpui_update_current_file_in_transfer (tdata); | |
1316 memcpy (&updatetime, &tdata->lasttime, sizeof (updatetime)); | |
1317 } | |
1318 | |
1319 bufpos = buf; | |
1320 while (num_read > 0) | |
1321 { | |
1322 if ((ret = gftp_put_next_file_chunk (tdata->toreq, bufpos, | |
1323 num_read)) <= 0) | |
1324 { | |
1325 num_read = ret; | |
1326 break; | |
1327 } | |
1328 | |
1329 num_read -= ret; | |
1330 bufpos += ret; | |
1331 } | |
1332 } | |
1333 | |
1334 if (num_read == GFTP_ENOTRANS) | |
1335 num_read = 0; | |
1336 | |
1337 g_free (buf); | |
1338 gftpui_finish_current_file_in_transfer (tdata); | |
1339 | |
1340 return ((int) num_read); | |
1341 } | |
1342 | |
1343 | |
1344 int | |
1294 gftpui_common_transfer_files (gftp_transfer * tdata) | 1345 gftpui_common_transfer_files (gftp_transfer * tdata) |
1295 { | 1346 { |
1296 intptr_t preserve_permissions, preserve_time, trans_blksize; | 1347 intptr_t preserve_permissions, preserve_time; |
1297 struct timeval updatetime; | |
1298 ssize_t num_read, ret; | |
1299 gftp_file * curfle; | 1348 gftp_file * curfle; |
1300 int tofd, fromfd; | 1349 int tofd, fromfd; |
1301 char *buf; | 1350 int ret; |
1302 | |
1303 gftp_lookup_request_option (tdata->fromreq, "trans_blksize", &trans_blksize); | |
1304 buf = g_malloc (trans_blksize); | |
1305 | 1351 |
1306 tdata->curfle = tdata->files; | 1352 tdata->curfle = tdata->files; |
1307 gettimeofday (&tdata->starttime, NULL); | 1353 gettimeofday (&tdata->starttime, NULL); |
1308 memcpy (&tdata->lasttime, &tdata->starttime, sizeof (tdata->lasttime)); | 1354 memcpy (&tdata->lasttime, &tdata->starttime, sizeof (tdata->lasttime)); |
1309 | 1355 |
1312 gftp_lookup_request_option (tdata->fromreq, "preserve_time", | 1358 gftp_lookup_request_option (tdata->fromreq, "preserve_time", |
1313 &preserve_time); | 1359 &preserve_time); |
1314 | 1360 |
1315 while (tdata->curfle != NULL) | 1361 while (tdata->curfle != NULL) |
1316 { | 1362 { |
1317 num_read = -1; | 1363 ret = -1; |
1318 | 1364 |
1319 if (g_thread_supported ()) | 1365 if (g_thread_supported ()) |
1320 g_static_mutex_lock (&tdata->structmutex); | 1366 g_static_mutex_lock (&tdata->structmutex); |
1321 | 1367 |
1322 curfle = tdata->curfle->data; | 1368 curfle = tdata->curfle->data; |
1422 tdata->resumed_bytes += tdata->curresumed; | 1468 tdata->resumed_bytes += tdata->curresumed; |
1423 | 1469 |
1424 if (g_thread_supported ()) | 1470 if (g_thread_supported ()) |
1425 g_static_mutex_unlock (&tdata->structmutex); | 1471 g_static_mutex_unlock (&tdata->structmutex); |
1426 | 1472 |
1427 memset (&updatetime, 0, sizeof (updatetime)); | 1473 ret = _do_transfer_file (tdata); |
1428 gftpui_start_current_file_in_transfer (tdata); | |
1429 | |
1430 while (!tdata->cancel && | |
1431 (num_read = gftp_get_next_file_chunk (tdata->fromreq, | |
1432 buf, trans_blksize)) > 0) | |
1433 { | |
1434 gftp_calc_kbs (tdata, num_read); | |
1435 if (tdata->lasttime.tv_sec - updatetime.tv_sec >= 1 || | |
1436 tdata->curtrans >= tdata->tot_file_trans) | |
1437 { | |
1438 gftpui_update_current_file_in_transfer (tdata); | |
1439 memcpy (&updatetime, &tdata->lasttime, sizeof (updatetime)); | |
1440 } | |
1441 | |
1442 if ((ret = gftp_put_next_file_chunk (tdata->toreq, buf, | |
1443 num_read)) < 0) | |
1444 { | |
1445 num_read = (int) ret; | |
1446 break; | |
1447 } | |
1448 } | |
1449 | |
1450 if (num_read == GFTP_ENOTRANS) | |
1451 num_read = 0; | |
1452 | |
1453 gftpui_finish_current_file_in_transfer (tdata); | |
1454 } | 1474 } |
1455 | 1475 |
1456 if (tdata->cancel) | 1476 if (tdata->cancel) |
1457 { | 1477 { |
1458 if (gftp_abort_transfer (tdata->fromreq) != 0) | 1478 if (gftp_abort_transfer (tdata->fromreq) != 0) |
1459 gftp_disconnect (tdata->fromreq); | 1479 gftp_disconnect (tdata->fromreq); |
1460 | 1480 |
1461 if (gftp_abort_transfer (tdata->toreq) != 0) | 1481 if (gftp_abort_transfer (tdata->toreq) != 0) |
1462 gftp_disconnect (tdata->toreq); | 1482 gftp_disconnect (tdata->toreq); |
1463 } | 1483 } |
1464 else if (num_read < 0) | 1484 else if (ret < 0) |
1465 { | 1485 { |
1466 tdata->fromreq->logging_function (gftp_logging_error, | 1486 tdata->fromreq->logging_function (gftp_logging_error, |
1467 tdata->fromreq, | 1487 tdata->fromreq, |
1468 _("Could not download %s from %s\n"), | 1488 _("Could not download %s from %s\n"), |
1469 curfle->file, | 1489 curfle->file, |
1470 tdata->fromreq->hostname); | 1490 tdata->fromreq->hostname); |
1471 | 1491 |
1472 if (gftp_get_transfer_status (tdata, num_read) == GFTP_ERETRYABLE) | 1492 if (gftp_get_transfer_status (tdata, ret) == GFTP_ERETRYABLE) |
1473 continue; | 1493 continue; |
1474 | 1494 |
1475 break; | 1495 break; |
1476 } | 1496 } |
1477 else | 1497 else |
1529 tdata->fromreq->cancel = 0; | 1549 tdata->fromreq->cancel = 0; |
1530 tdata->toreq->cancel = 0; | 1550 tdata->toreq->cancel = 0; |
1531 } | 1551 } |
1532 | 1552 |
1533 tdata->done = 1; | 1553 tdata->done = 1; |
1534 g_free (buf); | |
1535 | 1554 |
1536 return (1); | 1555 return (1); |
1537 } | 1556 } |
1538 | 1557 |
1539 | 1558 |