00001
00002
00003 #include "subStructFileRead.h"
00004 #include "miscServerFunct.h"
00005 #include "dataObjOpr.h"
00006
00007
00008
00009 #include "eirods_structured_object.h"
00010
00011 int
00012 rsSubStructFileRead (rsComm_t *rsComm, subStructFileFdOprInp_t *subStructFileReadInp,
00013 bytesBuf_t *subStructFileReadOutBBuf)
00014 {
00015 rodsServerHost_t *rodsServerHost;
00016 int remoteFlag;
00017 int status;
00018
00019 remoteFlag = resolveHost (&subStructFileReadInp->addr, &rodsServerHost);
00020
00021 if (subStructFileReadInp->len > 0) {
00022 if (subStructFileReadOutBBuf->buf == NULL)
00023 subStructFileReadOutBBuf->buf = malloc (subStructFileReadInp->len);
00024 } else {
00025 return (0);
00026 }
00027
00028 if (remoteFlag == LOCAL_HOST) {
00029 status = _rsSubStructFileRead (rsComm, subStructFileReadInp, subStructFileReadOutBBuf);
00030 } else if (remoteFlag == REMOTE_HOST) {
00031 status = remoteSubStructFileRead (rsComm, subStructFileReadInp, subStructFileReadOutBBuf,
00032 rodsServerHost);
00033 } else {
00034 if (remoteFlag < 0) {
00035 return (remoteFlag);
00036 } else {
00037 rodsLog (LOG_NOTICE,
00038 "rsSubStructFileRead: resolveHost returned unrecognized value %d",
00039 remoteFlag);
00040 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00041 }
00042 }
00043
00044 return (status);
00045 }
00046
00047 int
00048 remoteSubStructFileRead (rsComm_t *rsComm, subStructFileFdOprInp_t *subStructFileReadInp,
00049 bytesBuf_t *subStructFileReadOutBBuf, rodsServerHost_t *rodsServerHost)
00050 {
00051 int status;
00052
00053 if (rodsServerHost == NULL) {
00054 rodsLog (LOG_NOTICE,
00055 "remoteSubStructFileRead: Invalid rodsServerHost");
00056 return SYS_INVALID_SERVER_HOST;
00057 }
00058
00059 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00060 return status;
00061 }
00062
00063 status = rcSubStructFileRead (rodsServerHost->conn, subStructFileReadInp,
00064 subStructFileReadOutBBuf);
00065
00066 if (status < 0) {
00067 rodsLog (LOG_NOTICE,
00068 "remoteSubStructFileRead: rcFileRead failed for fd %d", subStructFileReadInp->fd);
00069 }
00070
00071 return status;
00072
00073 }
00074
00075
00076
00077 int _rsSubStructFileRead( rsComm_t* _comm,
00078 subStructFileFdOprInp_t* _read_inp,
00079 bytesBuf_t* _out_buf ) {
00080
00081
00082
00083 eirods::structured_object struct_obj;
00084 struct_obj.comm( _comm );
00085 struct_obj.file_descriptor( _read_inp->fd );
00086
00087 struct_obj.resc_hier( eirods::EIRODS_LOCAL_USE_ONLY_RESOURCE );
00088
00089
00090
00091 eirods::error read_err = fileRead( _comm, struct_obj, _out_buf->buf, _read_inp->len );
00092 if( !read_err.ok() ) {
00093 std::stringstream msg;
00094 msg << "failed on call to fileRead for [";
00095 msg << struct_obj.physical_path();
00096 msg << "]";
00097 eirods::log( PASSMSG( msg.str(), read_err ) );
00098 _out_buf->len = 0;
00099 return read_err.code();
00100
00101 } else {
00102 _out_buf->len = read_err.code();
00103 return read_err.code();
00104
00105 }
00106
00107 }
00108