00001
00002
00003
00004
00005
00006
00007
00008 #include "fileGet.h"
00009 #include "miscServerFunct.h"
00010
00011
00012
00013 #include "eirods_log.h"
00014 #include "eirods_file_object.h"
00015 #include "eirods_resource_backport.h"
00016
00017
00018
00019
00020
00021
00022
00023 int
00024 rsFileGet (rsComm_t *rsComm, fileOpenInp_t *fileGetInp,
00025 bytesBuf_t *fileGetOutBBuf)
00026 {
00027 rodsServerHost_t *rodsServerHost;
00028 int remoteFlag;
00029 int status;
00030
00031
00032 eirods::error ret = eirods::get_host_for_hier_string( fileGetInp->resc_hier_, remoteFlag, rodsServerHost );
00033 if( !ret.ok() ) {
00034 eirods::log( PASSMSG( "rsFileCreate - failed in call to eirods::get_host_for_hier_string", ret ) );
00035 return -1;
00036 }
00037 if (remoteFlag == LOCAL_HOST) {
00038 status = _rsFileGet (rsComm, fileGetInp, fileGetOutBBuf);
00039 } else if (remoteFlag == REMOTE_HOST) {
00040 status = remoteFileGet (rsComm, fileGetInp, fileGetOutBBuf,
00041 rodsServerHost);
00042 } else {
00043 if (remoteFlag < 0) {
00044 return (remoteFlag);
00045 } else {
00046 rodsLog (LOG_NOTICE,
00047 "rsFileGet: resolveHost returned unrecognized value %d",
00048 remoteFlag);
00049 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00050 }
00051 }
00052
00053 return (status);
00054 }
00055
00056 int
00057 remoteFileGet (rsComm_t *rsComm, fileOpenInp_t *fileGetInp,
00058 bytesBuf_t *fileGetOutBBuf, rodsServerHost_t *rodsServerHost)
00059 {
00060 int status;
00061
00062 if (rodsServerHost == NULL) {
00063 rodsLog (LOG_NOTICE,
00064 "remoteFileGet: Invalid rodsServerHost");
00065 return SYS_INVALID_SERVER_HOST;
00066 }
00067
00068 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00069 return status;
00070 }
00071
00072
00073
00074 status = rcFileGet (rodsServerHost->conn, fileGetInp, fileGetOutBBuf);
00075
00076 if (status < 0) {
00077 rodsLog (LOG_NOTICE,
00078 "remoteFileGet: rcFileGet failed for %s",
00079 fileGetInp->fileName);
00080 }
00081
00082 return status;
00083 }
00084
00085 int _rsFileGet (rsComm_t *rsComm, fileOpenInp_t *fileGetInp, bytesBuf_t *fileGetOutBBuf ) {
00086
00087 int fd;
00088 int len;
00089
00090 len = fileGetInp->dataSize;
00091 if (len <= 0)
00092 return (0);
00093 fd = _rsFileOpen (rsComm, fileGetInp);
00094
00095 if (fd < 0) {
00096 rodsLog (LOG_NOTICE,
00097 "_rsFileGet: fileGet for %s, status = %d",
00098 fileGetInp->fileName, fd);
00099 return (fd);
00100 }
00101
00102 if (fileGetOutBBuf->buf == NULL) {
00103 fileGetOutBBuf->buf = malloc (len);
00104 }
00105
00106 if(fileGetInp->objPath[0] == '\0') {
00107 std::stringstream msg;
00108 msg << __FUNCTION__;
00109 msg << " - Empty logical path.";
00110 eirods::log(LOG_ERROR, msg.str());
00111 return -1;
00112 }
00113
00114 eirods::file_object file_obj( rsComm, fileGetInp->objPath, fileGetInp->fileName, fileGetInp->resc_hier_, fd, fileGetInp->mode, fileGetInp->flags );
00115 eirods::error read_err = fileRead( rsComm,
00116 file_obj,
00117 fileGetOutBBuf->buf,
00118 len );
00119 int bytes_read = read_err.code();
00120 if ( bytes_read != len ) {
00121 if ( bytes_read >= 0) {
00122
00123 fileGetOutBBuf->len = bytes_read;
00124
00125 } else {
00126 std::stringstream msg;
00127 msg << "_rsFileGet: fileRead for ";
00128 msg << fileGetInp->fileName;
00129 msg << ", status = ";
00130 msg << bytes_read;
00131 eirods::error ret_err = PASS( false, bytes_read, msg.str(), read_err );
00132 eirods::log( ret_err );
00133 }
00134 } else {
00135 fileGetOutBBuf->len = bytes_read;
00136 }
00137
00138
00139
00140 eirods::error close_err = fileClose( rsComm,
00141 file_obj );
00142 if( !close_err.ok() ) {
00143 eirods::error err = PASS( false, close_err.code(), "_rsFileGet - error on close", close_err );
00144 eirods::log( err );
00145 }
00146
00147 return (bytes_read);
00148
00149 }
00150
00151
00152
00153
00154
00155
00156