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( rsComm_t *rsComm, fileReadInp_t *fileReadInp, bytesBuf_t *fileReadOutBBuf ) {
00091
00092
00093
00094
00095 if(FileDesc[fileReadInp->fileInx].objPath == NULL ||
00096 FileDesc[fileReadInp->fileInx].objPath[0] == '\0') {
00097 std::stringstream msg;
00098 msg << __FUNCTION__;
00099 msg << " - Empty logical path.";
00100 eirods::log(LOG_ERROR, msg.str());
00101 return -1;
00102 }
00103
00104
00105
00106 eirods::file_object file_obj( rsComm,
00107 FileDesc[fileReadInp->fileInx].objPath,
00108 FileDesc[fileReadInp->fileInx].fileName,
00109 FileDesc[fileReadInp->fileInx].rescHier,
00110 FileDesc[fileReadInp->fileInx].fd,
00111 0, 0 );
00112
00113 eirods::error ret = fileRead( rsComm,
00114 file_obj,
00115 fileReadOutBBuf->buf,
00116 fileReadInp->len );
00117
00118
00119
00120 if( !ret.ok() ) {
00121 std::stringstream msg;
00122 msg << "_rsFileRead: fileRead for ";
00123 msg << file_obj.physical_path();
00124 msg << ", status = ";
00125 msg << ret.code();
00126 eirods::error err = PASS( false, ret.code(), msg.str(), ret );
00127 eirods::log( err );
00128 } else {
00129 fileReadOutBBuf->len = ret.code();
00130 }
00131
00132 return ret.code();
00133
00134 }
00135