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