コード例 #1
0
ファイル: md5Checksum.cpp プロジェクト: bpow/irods
int
rcChksumLocFile( char *fileName, char *chksumFlag, keyValPair_t *condInput, const char* _scheme ) {
    char chksumStr[NAME_LEN];
    int status;

    if ( condInput == NULL || chksumFlag == NULL || fileName == NULL ) {
        rodsLog( LOG_NOTICE,
                 "rcChksumLocFile: NULL input" );
        return USER__NULL_INPUT_ERR;
    }

    if ( strcmp( chksumFlag, VERIFY_CHKSUM_KW ) != 0 &&
            strcmp( chksumFlag, REG_CHKSUM_KW ) != 0 &&
            strcmp( chksumFlag, RSYNC_CHKSUM_KW ) != 0 ) {
        rodsLog( LOG_NOTICE,
                 "rcChksumLocFile: bad input chksumFlag %s", chksumFlag );
        return USER_BAD_KEYWORD_ERR;
    }

    status = chksumLocFile( fileName, chksumStr, _scheme );
    if ( status < 0 ) {
        return status;
    }

    addKeyVal( condInput, chksumFlag, chksumStr );

    return 0;
}
コード例 #2
0
ファイル: md5Checksum.cpp プロジェクト: bpow/irods
int verifyChksumLocFile(
    char *fileName,
    char *myChksum,
    char *chksumStr ) {
    // =-=-=-=-=-=-=-
    // extract scheme from checksum string
    std::string scheme;
    irods::error ret = irods::get_hash_scheme_from_checksum( myChksum, scheme );
    if ( !ret.ok() ) {
        //irods::log( PASS( ret ) );
    }

    char chksumBuf[CHKSUM_LEN];
    if ( chksumStr == NULL ) {
        chksumStr = chksumBuf;
    }

    int status = chksumLocFile( fileName, chksumStr, scheme.c_str() );
    if ( status < 0 ) {
        return status;
    }
    if ( strcmp( myChksum, chksumStr ) != 0 ) {
        return USER_CHKSUM_MISMATCH;
    }
    return 0;
}
コード例 #3
0
ファイル: md5Checksum.cpp プロジェクト: bpow/irods
int main( int argc, char *argv[] ) {
    int i = 1; // JMC cppcheck - uninit var
    char chksumStr[NAME_LEN];

    if ( argc != 2 ) {
        fprintf( stderr, "usage: md5checksum localFile\n" );
        exit( 1 );
    }

    status = chksumLocFile( argv[i], chksumStr );

    if ( status >= 0 ) {
        printf( "chksumStr = %s\n", chksumStr );
        exit( 0 );
    }
    else {
        fprintf( stderr, "chksumFile error for %s, status = %d.\n",
                 argv[i], status );
        exit( 1 );
    }
}
コード例 #4
0
ファイル: rcDataObjGet.c プロジェクト: UPPMAX/irods
int
rcDataObjGet (rcComm_t *conn, dataObjInp_t *dataObjInp, char *locFilePath)
{
    int status;
    portalOprOut_t *portalOprOut = NULL;
    bytesBuf_t dataObjOutBBuf;
#ifndef windows_platform
    struct stat statbuf;
#else
    struct irodsntstat statbuf;
#endif

    if (strcmp (locFilePath, STDOUT_FILE_NAME) == 0) {
        /* no parallel I/O if pipe to stdout */
        dataObjInp->numThreads = NO_THREADING;
    }
#ifndef windows_platform
    else if (stat (locFilePath, &statbuf) >= 0)
#else
    else if(iRODSNt_stat(locFilePath, &statbuf) >= 0)
#endif
    {
        /* local file exists */
        if (getValByKey (&dataObjInp->condInput, FORCE_FLAG_KW) == NULL) {
            return (OVERWRITE_WITHOUT_FORCE_FLAG);
        }
    }

    status = _rcDataObjGet (conn, dataObjInp, &portalOprOut, &dataObjOutBBuf);

    if (status < 0) {
        if (portalOprOut != NULL) free (portalOprOut);
        return (status);
    }

    if (status == 0 || dataObjOutBBuf.len > 0) {
        /* data included */
        /**** Removed by Raja as this can cause problems when the data sizes are different - say when post processing is done....Dec 2 2010
        if (dataObjInp->dataSize > 0 &&
          dataObjInp->dataSize != dataObjOutBBuf.len) {
                    rodsLog (LOG_NOTICE,
                     "putFile: totalWritten %lld dataSize %lld mismatch",
                     dataObjOutBBuf.len, dataObjInp->dataSize);
                   return (SYS_COPY_LEN_ERR);
        }
             ****/
        status = getIncludeFile (conn, &dataObjOutBBuf, locFilePath);
        free (dataObjOutBBuf.buf);
#ifdef RBUDP_TRANSFER
    } else if (getUdpPortFromPortList (&portalOprOut->portList) != 0) {
        int veryVerbose;
        /* rbudp transfer */
        /* some sanity check */
        if (portalOprOut->numThreads != 1) {
            rcOprComplete (conn, SYS_INVALID_PORTAL_OPR);
            free (portalOprOut);
            return (SYS_INVALID_PORTAL_OPR);
        }
        conn->transStat.numThreads = portalOprOut->numThreads;
        if (getValByKey (&dataObjInp->condInput, VERY_VERBOSE_KW) != NULL) {
            printf ("From server: NumThreads=%d, addr:%s, port:%d, cookie=%d\n",
                    portalOprOut->numThreads, portalOprOut->portList.hostAddr,
                    portalOprOut->portList.portNum, portalOprOut->portList.cookie);
            veryVerbose = 2;
        } else {
            veryVerbose = 0;
        }
        status = getFileToPortalRbudp (portalOprOut, locFilePath, 0,
                                       dataObjInp->dataSize, veryVerbose, 0);
        /* just send a complete msg */
        if (status < 0) {
            rcOprComplete (conn, status);
        } else {
            status = rcOprComplete (conn, portalOprOut->l1descInx);
        }
#endif  /* RBUDP_TRANSFER */
    } else {

        if (portalOprOut->numThreads <= 0) {
            status = getFile (conn, portalOprOut->l1descInx,
                              locFilePath, dataObjInp->objPath, dataObjInp->dataSize);
        } else {
            if (getValByKey (&dataObjInp->condInput, VERY_VERBOSE_KW) != NULL) {
                printf ("From server: NumThreads=%d, addr:%s, port:%d, cookie=%d\n",
                        portalOprOut->numThreads, portalOprOut->portList.hostAddr,
                        portalOprOut->portList.portNum, portalOprOut->portList.cookie);
            }
            /* some sanity check */
            if (portalOprOut->numThreads >= 20 * DEF_NUM_TRAN_THR) {
                rcOprComplete (conn, SYS_INVALID_PORTAL_OPR);
                free (portalOprOut);
                return (SYS_INVALID_PORTAL_OPR);
            }

            conn->transStat.numThreads = portalOprOut->numThreads;
            status = getFileFromPortal (conn, portalOprOut, locFilePath,
                                        dataObjInp->objPath, dataObjInp->dataSize);
        }
        /* just send a complete msg */
        if (status < 0) {
            rcOprComplete (conn, status);
        } else {
            status = rcOprComplete (conn, portalOprOut->l1descInx);
        }
    }

    if (status >= 0 && conn->fileRestart.info.numSeg > 0) {   /* file restart */
        clearLfRestartFile (&conn->fileRestart);
    }

    if (getValByKey (&dataObjInp->condInput, VERIFY_CHKSUM_KW) != NULL) {
        if (portalOprOut == NULL || strlen (portalOprOut->chksum) == 0) {
            rodsLog (LOG_ERROR,
                     "rcDataObjGet: VERIFY_CHKSUM_KW set but no chksum from server");
        } else {
            char chksumStr[NAME_LEN];

            status = chksumLocFile (locFilePath, chksumStr);

            if (status < 0) {
                rodsLogError (LOG_ERROR, status,
                              "rcDataObjGet: chksumLocFile error for %s, status = %d",
                              locFilePath, status);
                if (portalOprOut != NULL)
                    free (portalOprOut);
                return (status);
            }

            if (strcmp (portalOprOut->chksum, chksumStr) != 0) {
                status = USER_CHKSUM_MISMATCH;
                rodsLogError (LOG_ERROR, status,
                              "rcDataObjGet: chksum mismatch error for %s, status = %d",
                              locFilePath, status);
                if (portalOprOut != NULL)
                    free (portalOprOut);
                return (status);
            }
        }
    }
    if (portalOprOut != NULL) {
        free (portalOprOut);
    }

    return (status);
}
コード例 #5
0
ファイル: putUtil.cpp プロジェクト: hurngchunlee/irods
int
bulkPutFileUtil( rcComm_t *conn, char *srcPath, char *targPath,
                 rodsLong_t srcSize, int createMode,
                 rodsArguments_t *rodsArgs, bulkOprInp_t *bulkOprInp,
                 bulkOprInfo_t *bulkOprInfo ) {
    int status;
    int in_fd;
    int bytesRead = 0;
    /*#ifndef windows_platform
      char *bufPtr = bulkOprInfo->bytesBuf.buf + bulkOprInfo->size;
    #else*/  /* make change for Windows only */
    char *bufPtr = ( char * )( bulkOprInfo->bytesBuf.buf ) + bulkOprInfo->size;
    /*#endif*/

#ifdef windows_platform
    in_fd = iRODSNt_bopen( srcPath, O_RDONLY, 0 );
#else
    in_fd = open( srcPath, O_RDONLY, 0 );
#endif
    if ( in_fd < 0 ) { /* error */
        status = USER_FILE_DOES_NOT_EXIST - errno;
        rodsLog( LOG_ERROR,
                 "bulkPutFileUtilcannot open file %s, status = %d", srcPath, status );
        return status;
    }

    status = myRead( in_fd, bufPtr, srcSize, &bytesRead, NULL );
    if ( status != srcSize ) {
        if ( status >= 0 ) {
            status = SYS_COPY_LEN_ERR - errno;
            rodsLogError( LOG_ERROR, status, "bulkPutFileUtil: bytesRead %ju does not match srcSize %ju for %s",
                          ( uintmax_t )bytesRead, ( uintmax_t )srcSize, srcPath );
        }
        else {
            status = USER_INPUT_PATH_ERR - errno;
        }
        return status;
    }
    close( in_fd );
    rstrcpy( bulkOprInfo->cachedTargPath, targPath, MAX_NAME_LEN );
    bulkOprInfo->count++;
    bulkOprInfo->size += srcSize;
    bulkOprInfo->bytesBuf.len = bulkOprInfo->size;

    if ( getValByKey( &bulkOprInp->condInput, REG_CHKSUM_KW ) != NULL ||
            getValByKey( &bulkOprInp->condInput, VERIFY_CHKSUM_KW ) != NULL ) {
        char chksumStr[NAME_LEN];

        rodsEnv env;
        int ret = getRodsEnv( &env );
        if ( ret < 0 ) {
            rodsLog(
                LOG_ERROR,
                "bulkPutFileUtil: error getting rods env %d",
                ret );
            return ret;
        }
        status = chksumLocFile( srcPath, chksumStr, env.rodsDefaultHashScheme );
        if ( status < 0 ) {
            rodsLog( LOG_ERROR,
                     "bulkPutFileUtil: chksumLocFile error for %s ", srcPath );
            return status;
        }
        status = fillAttriArrayOfBulkOprInp( targPath, createMode, chksumStr,
                                             bulkOprInfo->size, bulkOprInp );
    }
    else {
        status = fillAttriArrayOfBulkOprInp( targPath, createMode, NULL,
                                             bulkOprInfo->size, bulkOprInp );
    }
    if ( status < 0 ) {
        rodsLogError( LOG_ERROR, status,
                      "bulkPutFileUtil: fillAttriArrayOfBulkOprInp error for %s",
                      srcPath );
        return status;
    }
    if ( bulkOprInfo->count >= MAX_NUM_BULK_OPR_FILES ||
            bulkOprInfo->size >= BULK_OPR_BUF_SIZE -
            MAX_BULK_OPR_FILE_SIZE ) {
        /* tar send it */
        status = sendBulkPut( conn, bulkOprInp, bulkOprInfo, rodsArgs );
        if ( status >= 0 ) {
            /* return the count */
            status = bulkOprInfo->count;
        }
        else {
            rodsLogError( LOG_ERROR, status,
                          "bulkPutFileUtil: tarAndBulkPut error for %s", srcPath );
        }
        clearBulkOprInfo( bulkOprInfo );
    }
    return status;
}
コード例 #6
0
ファイル: lowlevtest.cpp プロジェクト: hurngchunlee/irods
int
main( int argc, char **argv ) {
    rcComm_t *conn;
    rodsEnv myRodsEnv;
    int status;
    rErrMsg_t errMsg;
    miscSvrInfo_t *outSvrInfo = NULL;
    fileCreateInp_t fileCreateInp;
    fileOpenInp_t fileOpenInp;
    fileWriteInp_t fileWriteInp;
    fileCloseInp_t fileCloseInp;
    fileLseekInp_t fileLseekInp;
    fileLseekOut_t *fileLseekOut = NULL;
    fileUnlinkInp_t fileUnlinkInp;
    fileMkdirInp_t fileMkdirInp;
    fileRmdirInp_t fileRmdirInp;
    fileChmodInp_t fileChmodInp;
    fileFstatInp_t fileFstatInp;
    fileFsyncInp_t fileFsyncInp;
    fileStageInp_t fileStageInp;
    fileGetFsFreeSpaceInp_t fileGetFsFreeSpaceInp;
    fileGetFsFreeSpaceOut_t *fileGetFsFreeSpaceOut = NULL;
    rodsStat_t *fileFstatOut;
    fileStatInp_t fileStatInp;
    rodsStat_t *fileStatOut;
    bytesBuf_t fileWriteInpBBuf;
    fileReadInp_t fileReadInp;
    bytesBuf_t fileReadOutBBuf;

    fileOpendirInp_t fileOpendirInp;
    fileReaddirInp_t fileReaddirInp;
    rodsDirent_t *fileReaddirOut;
    fileClosedirInp_t fileClosedirInp;
    char chksumStr[NAME_LEN];
    fileChksumInp_t fileChksumInp;
    char *chksumStrOut = NULL;

    int fileInx;
    int bytesWritten, bytesRead, total;
    int in_fd, out_fd;
    int dir_fd;

    if ( argc != 2 ) {
        fprintf( stderr, "Usage: %s local-file\n", argv[0] );
        exit( 1 );
    }

    status = chksumLocFile( argv[1], chksumStr );

    if ( status < 0 ) {
        fprintf( stderr, "chksumLocFile error, status = %d\n", status );
        exit( 1 );
    }
    else {
        printf( "chksumStr = %s\n", chksumStr );
    }

    status = getRodsEnv( &myRodsEnv );

    if ( status < 0 ) {
        fprintf( stderr, "getRodsEnv error, status = %d\n", status );
        exit( 1 );
    }

    conn = rcConnect( myRodsEnv.rodsHost, myRodsEnv.rodsPort,
                      myRodsEnv.rodsUserName, myRodsEnv.rodsZone, 0, &errMsg );

    if ( conn == NULL ) {
        fprintf( stderr, "rcConnect error\n" );
        exit( 1 );
    }

    status = clientLogin( conn );
    if ( status != 0 ) {
        fprintf( stderr, "clientLogin error\n" );
        rcDisconnect( conn );
        exit( 7 );
    }

    /* test rcGetMiscSvrInfo call */

    status = rcGetMiscSvrInfo( conn, &outSvrInfo );

    if ( status < 0 ) {
        fprintf( stderr, "rcGetMiscSvrInfo error. status = %d\n", status );
    }
    else {
        printf( "serverType = %d\n", outSvrInfo->serverType );
        printf( "server relVersion = %s\n", outSvrInfo->relVersion );
        printf( "server apiVersion = %s\n", outSvrInfo->apiVersion );
        printf( "server rodsZone = %s\n", outSvrInfo->rodsZone );
    }

    /* test rcFileCreate call */

    memset( &fileCreateInp, 0, sizeof( fileCreateInp ) );

    fileCreateInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileCreateInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileCreateInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileCreateInp.fileName, FILE_NAME, MAX_NAME_LEN );
    fileCreateInp.mode = 0640;
    fileCreateInp.dataSize = -1;

    fileInx = rcFileCreate( conn, &fileCreateInp );

    if ( fileInx < 0 ) {
        fprintf( stderr, "rcFileCreate error. status = %d\n", fileInx );
        rcDisconnect( conn );
        exit( 1 );
    }
    else {
        printf( "rcFileCreate: fileInx = %d\n", fileInx );
    }

    in_fd = open( argv[1], O_RDONLY, 0 );
    if ( in_fd < 0 ) { /* error */
        fprintf( stderr, "can't open file\"%s\"\n", argv[1] );
        rcDisconnect( conn );
        exit( 1 );
    }

    fileWriteInpBBuf.buf = malloc( BUFSIZE );
    fileWriteInpBBuf.len = 0;

    total = 0;
    while ( ( fileWriteInpBBuf.len = read( in_fd, fileWriteInpBBuf.buf, BUFSIZE ) )
            > 0 ) {
        /* Write to the data object */

        fileWriteInp.fileInx = fileInx;
        fileWriteInp.len = fileWriteInpBBuf.len;
        bytesWritten = rcFileWrite( conn, &fileWriteInp, &fileWriteInpBBuf );
        if ( bytesWritten < fileWriteInp.len ) {
            fprintf( stderr, "Error: Read %d bytes, Wrote %d bytes.\n ",
                     fileWriteInp.len, bytesWritten );
            rcDisconnect( conn );
            exit( 1 );
        }
        total += bytesWritten;
    }

    printf( "rcFileWrite: total written = %d\n", total );

    /* test rcFileLseek call */

    fileLseekInp.fileInx = fileInx;
    fileLseekInp.offset = 100;
    fileLseekInp.whence = SEEK_SET;
    status = rcFileLseek( conn, &fileLseekInp, &fileLseekOut );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileLseek error. status = %d.\n ", status );
    }
    else {
        if ( fileLseekOut->offset != 100 ) {
            fprintf( stderr, "rcFileLseek error, seek to %d, got %lld\n",
                     100, fileLseekOut->offset );
        }
        printf( "rcFileLseek out offset = %lld\n", fileLseekOut->offset );
    }

    /* test rcFileClose call */

    fileCloseInp.fileInx = fileInx;

    status = rcFileClose( conn, &fileCloseInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileClose error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileClose: status = %d\n", status );
    }

    /* test rcFileChksum call */

    memset( &fileChksumInp, 0, sizeof( fileChksumInp ) );

    fileChksumInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileChksumInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileChksumInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileChksumInp.fileName, FILE_NAME, MAX_NAME_LEN );

    status = rcFileChksum( conn, &fileChksumInp, &chksumStrOut );

    if ( status < 0 ) {
        fprintf( stderr, "rcFileChksum error. status = %d\n", status );
        rcDisconnect( conn );
        exit( 1 );
    }
    else {
        printf( "rcFileChksum: chksumStrOut = %s\n", chksumStrOut );
    }

    /* test rcFileGetFsFreeSpace call */

    fileGetFsFreeSpaceInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileGetFsFreeSpaceInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileGetFsFreeSpaceInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileGetFsFreeSpaceInp.fileName, FILE_NAME, MAX_NAME_LEN );
    fileGetFsFreeSpaceInp.flag = 0;

    status = rcFileGetFsFreeSpace( conn, &fileGetFsFreeSpaceInp,
                                   &fileGetFsFreeSpaceOut );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileGetFsFreeSpace error. status = %d.\n ",
                 status );
    }
    else {
        printf( "rcFileGetFsFreeSpace: freespace = %lld\n",
                fileGetFsFreeSpaceOut->size );
    }

    /* test rcFileOpen call */

    memset( &fileOpenInp, 0, sizeof( fileOpenInp ) );

    fileOpenInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileOpenInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileOpenInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileOpenInp.fileName, FILE_NAME, MAX_NAME_LEN );
    fileOpenInp.mode = 0640;
    fileOpenInp.flags = O_RDONLY;
    fileOpenInp.otherFlags = 0;

    fileInx = rcFileOpen( conn, &fileOpenInp );

    if ( fileInx < 0 ) {
        fprintf( stderr, "rcFileOpen error. status = %d\n", fileInx );
        rcDisconnect( conn );
        exit( 1 );
    }
    else {
        printf( "rcFileOpen: fileInx = %d\n", fileInx );
    }

    /* test rcFileRead call */

    fileReadOutBBuf.buf = fileWriteInpBBuf.buf;
    fileReadOutBBuf.len = 0;
    fileReadInp.fileInx = fileInx;
    fileReadInp.len = BUFSIZE;

    out_fd = open( OUT_FILE_NAME, O_CREAT | O_WRONLY, 0640 );
    if ( out_fd < 0 ) { /* error */
        fprintf( stderr, "can't create local file %s\n", OUT_FILE_NAME );
        exit( 1 );
    }

    total = 0;
    while ( ( bytesRead = rcFileRead( conn, &fileReadInp, &fileReadOutBBuf ) ) > 0 ) {
        /* Write to the data object */
        bytesWritten = write( out_fd, fileReadOutBBuf.buf, bytesRead );
        if ( bytesWritten < bytesRead ) {
            fprintf( stderr, "Error: Read %d bytes, Wrote %d bytes.\n ",
                     bytesRead, bytesWritten );
            exit( 1 );
        }
        total += bytesWritten;
    }

    printf( "%d bytes written to %s\n", total, OUT_FILE_NAME );

    fileFstatInp.fileInx = fileInx;

    /* test rcFileFstat call */

    status = rcFileFstat( conn, &fileFstatInp, &fileFstatOut );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileFstat error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileFstat: size = %lld, mode = %o\n",
                fileFstatOut->st_size, fileFstatOut->st_mode );
    }

    /* test rcFileClose call */

    fileCloseInp.fileInx = fileInx;

    status = rcFileClose( conn, &fileCloseInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileClose error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileClose: status = %d\n", status );
    }

    /* test rcFileChmod call */

    fileChmodInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileChmodInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileChmodInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileChmodInp.fileName, FILE_NAME, MAX_NAME_LEN );
    fileChmodInp.mode = MY_MODE;

    status = rcFileChmod( conn, &fileChmodInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileChmod error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileChmod: status = %d\n", status );
    }

    /* test rcFileStat call */

    fileStatInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileStatInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileStatInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileStatInp.fileName, FILE_NAME, MAX_NAME_LEN );

    status = rcFileStat( conn, &fileStatInp, &fileStatOut );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileStat error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileStat: size = %lld, mode = %o\n",
                fileStatOut->st_size, fileStatOut->st_mode );
    }

    /* test rcFileMkdir call */

    fileMkdirInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileMkdirInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileMkdirInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileMkdirInp.dirName, DIR_NAME, MAX_NAME_LEN );
    fileMkdirInp.mode = MY_MODE;

    status = rcFileMkdir( conn, &fileMkdirInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileMkdir error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileMkdir: status = %d\n", status );
    }

    /* test rcFileOpendir call */

    fileOpendirInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileOpendirInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileOpendirInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileOpendirInp.dirName, PAR_DIR_NAME, MAX_NAME_LEN );

    dir_fd = rcFileOpendir( conn, &fileOpendirInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: fileOpendirInp error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileOpendir: status = %d\n", status );
    }

    /* test rcFileReaddir call */

    fileReaddirInp.fileInx = dir_fd;

    while ( ( status = rcFileReaddir( conn, &fileReaddirInp, &fileReaddirOut ) )
            >= 0 ) {
        printf( "path %s in dir %s\n", fileReaddirOut->d_name, PAR_DIR_NAME );
    }

    if ( status < -1 ) {
        fprintf( stderr, "Error: rcFileReaddir error. status = %d.\n ", status );
    }

    /* test rcFileClosedir call */

    fileClosedirInp.fileInx = dir_fd;

    status = rcFileClosedir( conn, &fileClosedirInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileClosedir error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileClosedir: status = %d\n", status );
    }

    /* test rcFileUnlink call */

    fileUnlinkInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileUnlinkInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileUnlinkInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileUnlinkInp.fileName, FILE_NAME, MAX_NAME_LEN );

    status = rcFileUnlink( conn, &fileUnlinkInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileUnlink error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileUnlink: status = %d\n", status );
    }

    /* test rcFileRmdir call */

    fileRmdirInp.fileType = UNIX_FILE_TYPE;
    rstrcpy( fileRmdirInp.addr.hostAddr, ADDR, NAME_LEN );
    rstrcpy( fileRmdirInp.addr.zoneName, myRodsEnv.rodsZone, NAME_LEN );
    rstrcpy( fileRmdirInp.dirName, DIR_NAME, MAX_NAME_LEN );

    status = rcFileRmdir( conn, &fileRmdirInp );

    if ( status < 0 ) {
        fprintf( stderr, "Error: rcFileRmdir error. status = %d.\n ", status );
    }
    else {
        printf( "rcFileRmdir: status = %d\n", status );
    }


    rcDisconnect( conn );

    free( fileWriteInpBBuf.buf ); // JMC cppcheck - leak
}