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