int rsDataObjCopy250( rsComm_t *rsComm, dataObjCopyInp_t *dataObjCopyInp, transStat_t **transStat ) { int status; transferStat_t *transferStat = NULL; status = rsDataObjCopy( rsComm, dataObjCopyInp, &transferStat ); if ( transStat != NULL && status >= 0 && transferStat != NULL ) { *transStat = ( transStat_t * ) malloc( sizeof( transStat_t ) ); ( *transStat )->numThreads = transferStat->numThreads; ( *transStat )->bytesWritten = transferStat->bytesWritten; free( transferStat ); } return status; }
int rsRsyncDataToData( rsComm_t *rsComm, dataObjInp_t *dataObjInp ) { int status; char *srcChksumStr = NULL; char *destChksumStr = NULL; dataObjCopyInp_t dataObjCopyInp; char *destObjPath; transferStat_t *transStat = NULL; /* always have the FORCE flag on */ addKeyVal( &dataObjInp->condInput, FORCE_FLAG_KW, "" ); destObjPath = getValByKey( &dataObjInp->condInput, RSYNC_DEST_PATH_KW ); if ( destObjPath == NULL ) { rodsLog( LOG_ERROR, "rsRsyncDataToData: RSYNC_DEST_PATH_KW input is missing for %s", dataObjInp->objPath ); return USER_RSYNC_NO_MODE_INPUT_ERR; } memset( &dataObjCopyInp, 0, sizeof( dataObjCopyInp ) ); rstrcpy( dataObjCopyInp.srcDataObjInp.objPath, dataObjInp->objPath, MAX_NAME_LEN ); dataObjCopyInp.srcDataObjInp.dataSize = dataObjInp->dataSize; replDataObjInp( dataObjInp, &dataObjCopyInp.destDataObjInp ); rstrcpy( dataObjCopyInp.destDataObjInp.objPath, destObjPath, MAX_NAME_LEN ); // we need the destination resource hierarchy to vote on the write rmKeyVal( &dataObjCopyInp.destDataObjInp.condInput, RESC_HIER_STR_KW ); /* use rsDataObjChksum because the path could in in remote zone */ status = rsDataObjChksum( rsComm, &dataObjCopyInp.srcDataObjInp, &srcChksumStr ); if ( status < 0 && ( status != CAT_NO_ACCESS_PERMISSION || srcChksumStr == NULL ) ) { /* XXXXX CAT_NO_ACCESS_PERMISSION mean the chksum was calculated but * cannot be registered. But the chksum value is OK. */ rodsLog( LOG_ERROR, "rsRsyncDataToData: _rsDataObjChksum error for %s, status = %d", dataObjCopyInp.srcDataObjInp.objPath, status ); clearKeyVal( &dataObjCopyInp.srcDataObjInp.condInput ); return status; } /* use rsDataObjChksum because the path could in in remote zone */ status = rsDataObjChksum( rsComm, &dataObjCopyInp.destDataObjInp, &destChksumStr ); if ( status < 0 && status != CAT_NO_ACCESS_PERMISSION && status != CAT_NO_ROWS_FOUND ) { rodsLog( LOG_ERROR, "rsRsyncDataToData: _rsDataObjChksum error for %s, status = %d", dataObjCopyInp.destDataObjInp.objPath, status ); free( srcChksumStr ); free( destChksumStr ); clearKeyVal( &dataObjCopyInp.srcDataObjInp.condInput ); clearKeyVal( &dataObjCopyInp.destDataObjInp.condInput ); return status; } if ( destChksumStr != NULL && strcmp( srcChksumStr, destChksumStr ) == 0 ) { free( srcChksumStr ); free( destChksumStr ); clearKeyVal( &dataObjCopyInp.destDataObjInp.condInput ); clearKeyVal( &dataObjCopyInp.srcDataObjInp.condInput ); return 0; } addKeyVal( &dataObjCopyInp.destDataObjInp.condInput, REG_CHKSUM_KW, srcChksumStr ); status = rsDataObjCopy( rsComm, &dataObjCopyInp, &transStat ); free( transStat ); free( srcChksumStr ); free( destChksumStr ); clearKeyVal( &dataObjCopyInp.destDataObjInp.condInput ); clearKeyVal( &dataObjCopyInp.srcDataObjInp.condInput ); if ( status >= 0 ) { return SYS_RSYNC_TARGET_MODIFIED; } else { return status; } }