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; }
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; }
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 ); } }
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); }
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; }
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 }