Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
    }
}