625
625
std::string csum(buf);
626
626
if (csum.substr(0, csum.find(':')) == DefaultCheckSum()) {
627
627
logger.msg(VERBOSE, "StopWriting: Calculated checksum %s", csum);
628
// list checksum and compare
629
// note: not all implementations support checksum
630
logger.msg(DEBUG, "list_files_ftp: "
631
"looking for checksum of %s", url.str());
633
std::string cksumtype(upper(DefaultCheckSum()));
634
GlobusResult res = globus_ftp_client_cksm(&ftp_handle, url.str().c_str(),
635
&ftp_opattr, cksum, (globus_off_t)0,
636
(globus_off_t)-1, cksumtype.c_str(),
637
&ftp_complete_callback, cbarg);
639
logger.msg(VERBOSE, "list_files_ftp: globus_ftp_client_cksum failed");
640
logger.msg(VERBOSE, "Globus error: %s", res.str());
642
else if (!cond.wait(1000*usercfg.Timeout())) {
643
logger.msg(VERBOSE, "list_files_ftp: timeout waiting for cksum");
644
globus_ftp_client_abort(&ftp_handle);
647
else if (!callback_status) {
648
// reset to success since failing to get checksum should not trigger an error
649
callback_status = DataStatus::Success;
650
logger.msg(INFO, "list_files_ftp: failed to get file's checksum");
653
logger.msg(VERBOSE, "list_files_ftp: checksum %s", cksum);
654
if (csum.substr(csum.find(':')+1) == std::string(cksum)) {
655
logger.msg(INFO, "Calculated checksum %s matches checksum reported by server", csum);
658
logger.msg(ERROR, "Checksum mismatch between calculated checksum %s and checksum reported by server %s",
659
csum, std::string(DefaultCheckSum()+':'+cksum));
660
return DataStatus::TransferErrorRetryable;
628
if(additional_checks) {
629
// list checksum and compare
630
// note: not all implementations support checksum
631
logger.msg(DEBUG, "list_files_ftp: "
632
"looking for checksum of %s", url.str());
634
std::string cksumtype(upper(DefaultCheckSum()));
635
GlobusResult res = globus_ftp_client_cksm(&ftp_handle, url.str().c_str(),
636
&ftp_opattr, cksum, (globus_off_t)0,
637
(globus_off_t)-1, cksumtype.c_str(),
638
&ftp_complete_callback, cbarg);
640
logger.msg(VERBOSE, "list_files_ftp: globus_ftp_client_cksum failed");
641
logger.msg(VERBOSE, "Globus error: %s", res.str());
643
else if (!cond.wait(1000*usercfg.Timeout())) {
644
logger.msg(VERBOSE, "list_files_ftp: timeout waiting for cksum");
645
globus_ftp_client_abort(&ftp_handle);
648
else if (!callback_status) {
649
// reset to success since failing to get checksum should not trigger an error
650
callback_status = DataStatus::Success;
651
logger.msg(INFO, "list_files_ftp: no checksum information possible");
654
logger.msg(VERBOSE, "list_files_ftp: checksum %s", cksum);
655
if (csum.substr(csum.find(':')+1) == std::string(cksum)) {
656
logger.msg(INFO, "Calculated checksum %s matches checksum reported by server", csum);
659
logger.msg(ERROR, "Checksum mismatch between calculated checksum %s and checksum reported by server %s",
660
csum, std::string(DefaultCheckSum()+':'+cksum));
661
return DataStatus::TransferErrorRetryable;