int _rsFileGet (rsComm_t *rsComm, fileOpenInp_t *fileGetInp, bytesBuf_t *fileGetOutBBuf) { int status; int fd; int len; len = fileGetInp->dataSize; if (len <= 0) return (0); fd = _rsFileOpen (rsComm, fileGetInp); if (fd < 0) { rodsLog (LOG_NOTICE, "_rsFileGet: fileGet for %s, status = %d", fileGetInp->fileName, fd); return (fd); } if (fileGetOutBBuf->buf == NULL) { fileGetOutBBuf->buf = malloc (len); } status = fileRead (fileGetInp->fileType, rsComm, fd, fileGetOutBBuf->buf, len); if (status != len) { if (status >= 0) { #if 0 /* XXXXXXXX take this out for now so that on the fly convert works */ rodsLog (LOG_NOTICE, "_rsFileGet: fileRead for %s, toread %d, read %d", fileGetInp->fileName, len, status); status = SYS_COPY_LEN_ERR; #else fileGetOutBBuf->len = status; #endif } else { rodsLog (LOG_NOTICE, "_rsFileGet: fileRead for %s, status = %d", fileGetInp->fileName, status); } } else { fileGetOutBBuf->len = status; } fileClose (fileGetInp->fileType, rsComm, fd); return (status); }
// =-=-=-=-=-=-=- // local implementation of put int _rsFilePut( rsComm_t* _comm, fileOpenInp_t* _put_inp, bytesBuf_t* _put_bbuf, rodsServerHost_t* _server_host ) { int fd = 0; // =-=-=-=-=-=-=- // NOTE:: this test does not seem to work for i86 solaris if ( ( _put_inp->otherFlags & FORCE_FLAG ) != 0 ) { // =-=-=-=-=-=-=- // create one if it does not exist */ _put_inp->flags |= O_CREAT; fd = _rsFileOpen( _comm, _put_inp ); } else { fd = _rsFileCreate( _comm, _put_inp, _server_host ); } // else // =-=-=-=-=-=-=- // log, error if any if ( fd < 0 ) { if ( getErrno( fd ) == EEXIST ) { rodsLog( LOG_DEBUG1, "_rsFilePut: filePut for %s, status = %d", _put_inp->fileName, fd ); } else if ( fd != DIRECT_ARCHIVE_ACCESS ) { rodsLog( LOG_DEBUG, "_rsFilePut: filePut for %s, status = %d", _put_inp->fileName, fd ); } return ( fd ); } // =-=-=-=-=-=-=- // call write for resource plugin irods::file_object_ptr file_obj( new irods::file_object( _comm, _put_inp->objPath, _put_inp->fileName, _put_inp->resc_hier_, fd, 0, 0 ) ); file_obj->in_pdmo( _put_inp->in_pdmo ); file_obj->cond_input( _put_inp->condInput ); irods::error write_err = fileWrite( _comm, file_obj, _put_bbuf->buf, _put_bbuf->len ); int write_code = write_err.code(); // =-=-=-=-=-=-=- // log errors, if any if ( write_code != _put_bbuf->len ) { if ( write_code >= 0 ) { std::stringstream msg; msg << "fileWrite failed for ["; msg << _put_inp->fileName; msg << "] towrite ["; msg << _put_bbuf->len; msg << "] written ["; msg << write_code << "]"; irods::error err = PASSMSG( msg.str(), write_err ); irods::log( err ); write_code = SYS_COPY_LEN_ERR; } else { std::stringstream msg; msg << "fileWrite failed for ["; msg << _put_inp->fileName; msg << "]"; irods::error err = PASSMSG( msg.str(), write_err ); irods::log( err ); } } // =-=-=-=-=-=-=- // close up after ourselves irods::error close_err = fileClose( _comm, file_obj ); if ( !close_err.ok() ) { irods::error err = PASSMSG( "error on close", close_err ); irods::log( err ); } // =-=-=-=-=-=-=- // return 'write_err code' as this includes this implementation // assumes we are returning the size of the file 'put' via fileWrite return write_code; } // _rsFilePut
int _rsFileGet( rsComm_t* _comm, fileOpenInp_t* _get_inp, bytesBuf_t* _get_buf ) { int fd; int len; len = _get_inp->dataSize; fd = _rsFileOpen( _comm, _get_inp ); if ( fd < 0 ) { rodsLog( LOG_NOTICE, "_rsFileGet: fileGet for %s, status = %d", _get_inp->fileName, fd ); return fd; } if ( _get_buf->buf == NULL ) { _get_buf->buf = malloc( len ); } irods::file_object_ptr file_obj( new irods::file_object( _comm, _get_inp->objPath, _get_inp->fileName, _get_inp->resc_hier_, fd, _get_inp->mode, _get_inp->flags ) ); // =-=-=-=-=-=-=- // pass condInput file_obj->cond_input( _get_inp->condInput ); irods::error read_err = fileRead( _comm, file_obj, _get_buf->buf, len ); int bytes_read = read_err.code(); if ( bytes_read != len ) { if ( bytes_read >= 0 ) { _get_buf->len = bytes_read; } else { std::stringstream msg; msg << "fileRead failed for ["; msg << _get_inp->fileName; msg << "]"; irods::error ret_err = PASSMSG( msg.str(), read_err ); irods::log( ret_err ); } } else { _get_buf->len = bytes_read; } // =-=-=-=-=-=-=- // call resource plugin close irods::error close_err = fileClose( _comm, file_obj ); if ( !close_err.ok() ) { irods::error err = PASSMSG( "error on close", close_err ); irods::log( err ); } return bytes_read; } // _rsFileGet