示例#1
0
int
remoteFileReaddir( rsComm_t *rsComm, fileReaddirInp_t *fileReaddirInp,
                   rodsDirent_t **fileReaddirOut, rodsServerHost_t *rodsServerHost ) {
    int status;

    if ( rodsServerHost == NULL ) {
        rodsLog( LOG_NOTICE,
                 "remoteFileReaddir: Invalid rodsServerHost" );
        return SYS_INVALID_SERVER_HOST;
    }

    if ( ( status = svrToSvrConnect( rsComm, rodsServerHost ) ) < 0 ) {
        return status;
    }

    fileReaddirInp->fileInx = convL3descInx( fileReaddirInp->fileInx );
    status = rcFileReaddir( rodsServerHost->conn, fileReaddirInp, fileReaddirOut );

    if ( status < 0 ) {
        if ( status != -1 ) {   /* eof */
            rodsLog( LOG_NOTICE,
                     "remoteFileReaddir: rcFileReaddir failed for %s",
                     FileDesc[fileReaddirInp->fileInx].fileName );
        }
    }

    return status;
}
示例#2
0
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
}