00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "fileRead.h"
00011 #include "miscServerFunct.h"
00012 #include "rsGlobalExtern.h"
00013
00014
00015
00016 #include "eirods_log.h"
00017 #include "eirods_file_object.h"
00018 #include "eirods_stacktrace.h"
00019
00020 int
00021 rsFileRead (rsComm_t *rsComm, fileReadInp_t *fileReadInp,
00022 bytesBuf_t *fileReadOutBBuf)
00023 {
00024 rodsServerHost_t *rodsServerHost;
00025 int remoteFlag;
00026 int retVal;
00027
00028
00029 remoteFlag = getServerHostByFileInx (fileReadInp->fileInx,
00030 &rodsServerHost);
00031
00032 if (fileReadInp->len > 0) {
00033 if (fileReadOutBBuf->buf == NULL)
00034 fileReadOutBBuf->buf = malloc (fileReadInp->len);
00035 } else {
00036 return (0);
00037 }
00038
00039 if (remoteFlag == LOCAL_HOST) {
00040 retVal = _rsFileRead (rsComm, fileReadInp, fileReadOutBBuf);
00041 } else if (remoteFlag == REMOTE_HOST) {
00042 retVal = remoteFileRead (rsComm, fileReadInp, fileReadOutBBuf,
00043 rodsServerHost);
00044 } else {
00045 if (remoteFlag < 0) {
00046 return (remoteFlag);
00047 } else {
00048 rodsLog (LOG_NOTICE,
00049 "rsFileRead: resolveHost returned unrecognized value %d",
00050 remoteFlag);
00051 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00052 }
00053 }
00054
00055 return (retVal);
00056 }
00057
00058 int
00059 remoteFileRead (rsComm_t *rsComm, fileReadInp_t *fileReadInp,
00060 bytesBuf_t *fileReadOutBBuf, rodsServerHost_t *rodsServerHost)
00061 {
00062 int retVal;
00063
00064 if (rodsServerHost == NULL) {
00065 rodsLog (LOG_NOTICE,
00066 "remoteFileRead: Invalid rodsServerHost");
00067 return SYS_INVALID_SERVER_HOST;
00068 }
00069
00070 if ((retVal = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00071 return retVal;
00072 }
00073
00074 fileReadInp->fileInx = convL3descInx (fileReadInp->fileInx);
00075 retVal = rcFileRead (rodsServerHost->conn, fileReadInp,
00076 fileReadOutBBuf);
00077
00078 if (retVal < 0) {
00079 rodsLog (LOG_NOTICE,
00080 "remoteFileRead: rcFileRead failed for %s",
00081 FileDesc[fileReadInp->fileInx].fileName);
00082 }
00083
00084 return retVal;
00085 }
00086
00087
00088
00089
00090 int _rsFileRead(
00091 rsComm_t* _comm,
00092 fileReadInp_t* _read_inp,
00093 bytesBuf_t* _read_bbuf ) {
00094
00095
00096
00097
00098 if(FileDesc[_read_inp->fileInx].objPath == NULL ||
00099 FileDesc[_read_inp->fileInx].objPath[0] == '\0') {
00100 std::stringstream msg;
00101 msg << __FUNCTION__;
00102 msg << " - Empty logical path.";
00103 eirods::log(LOG_ERROR, msg.str());
00104 return -1;
00105 }
00106
00107
00108
00109 eirods::file_object_ptr file_obj(
00110 new eirods::file_object(
00111 _comm,
00112 FileDesc[_read_inp->fileInx].objPath,
00113 FileDesc[_read_inp->fileInx].fileName,
00114 FileDesc[_read_inp->fileInx].rescHier,
00115 FileDesc[_read_inp->fileInx].fd,
00116 0, 0 ) );
00117
00118 eirods::error ret = fileRead( _comm,
00119 file_obj,
00120 _read_bbuf->buf,
00121 _read_inp->len );
00122
00123
00124
00125 if( !ret.ok() ) {
00126 std::stringstream msg;
00127 msg << "fileRead failed for ";
00128 msg << file_obj->physical_path();
00129 msg << "]";
00130 eirods::error err = PASSMSG( msg.str(), ret );
00131 eirods::log( err );
00132 } else {
00133 _read_bbuf->len = ret.code();
00134 }
00135
00136 return ret.code();
00137
00138 }
00139