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