00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "fileOpen.h"
00011 #include "fileOpr.h"
00012 #include "miscServerFunct.h"
00013 #include "rsGlobalExtern.h"
00014
00015
00016
00017 #include "eirods_log.h"
00018 #include "eirods_file_object.h"
00019 #include "eirods_stacktrace.h"
00020 #include "eirods_resource_backport.h"
00021
00022 int
00023 rsFileOpen (rsComm_t *rsComm, fileOpenInp_t *fileOpenInp)
00024 {
00025 rodsServerHost_t *rodsServerHost;
00026 int remoteFlag;
00027 int fileInx;
00028
00029
00030 eirods::error ret = eirods::get_host_for_hier_string( fileOpenInp->resc_hier_, remoteFlag, rodsServerHost );
00031 if( !ret.ok() ) {
00032 eirods::log( PASSMSG( "rsFileCreate - failed in call to eirods::get_host_for_hier_string", ret ) );
00033 return -1;
00034 }
00035
00036
00037 if (remoteFlag < 0) {
00038 return (remoteFlag);
00039 } else {
00040 fileInx = rsFileOpenByHost (rsComm, fileOpenInp, rodsServerHost);
00041 return (fileInx);
00042 }
00043 }
00044
00045 int
00046 rsFileOpenByHost (rsComm_t *rsComm, fileOpenInp_t *fileOpenInp,
00047 rodsServerHost_t *rodsServerHost)
00048 {
00049 int fileInx;
00050 int fd;
00051 int remoteFlag;
00052
00053 if (rodsServerHost == NULL) {
00054 rodsLog (LOG_NOTICE,
00055 "rsFileOpenByHost: Input NULL rodsServerHost");
00056 return (SYS_INTERNAL_NULL_INPUT_ERR);
00057 }
00058
00059 remoteFlag = rodsServerHost->localFlag;
00060
00061 if (remoteFlag == LOCAL_HOST) {
00062 fd = _rsFileOpen (rsComm, fileOpenInp);
00063 } else if (remoteFlag == REMOTE_HOST) {
00064 fd = remoteFileOpen (rsComm, fileOpenInp, rodsServerHost);
00065 } else {
00066 if (remoteFlag < 0) {
00067 return (remoteFlag);
00068 } else {
00069 rodsLog (LOG_NOTICE,
00070 "rsFileOpenByHost: resolveHost returned unrecognized value %d",
00071 remoteFlag);
00072 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00073 }
00074 }
00075
00076 if (fd < 0) {
00077 return (fd);
00078 }
00079 fileInx = allocAndFillFileDesc (rodsServerHost, fileOpenInp->objPath, fileOpenInp->fileName, fileOpenInp->resc_hier_,
00080 fileOpenInp->fileType, fd, fileOpenInp->mode);
00081
00082 return (fileInx);
00083 }
00084
00085 int
00086 remoteFileOpen (rsComm_t *rsComm, fileOpenInp_t *fileOpenInp,
00087 rodsServerHost_t *rodsServerHost)
00088 {
00089 int fileInx;
00090 int status;
00091
00092 if (rodsServerHost == NULL) {
00093 rodsLog (LOG_NOTICE,
00094 "remoteFileOpen: Invalid rodsServerHost");
00095 return SYS_INVALID_SERVER_HOST;
00096 }
00097
00098 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00099 return status;
00100 }
00101
00102 fileInx = rcFileOpen (rodsServerHost->conn, fileOpenInp);
00103
00104 if (fileInx < 0) {
00105 rodsLog (LOG_NOTICE,
00106 "remoteFileOpen: rcFileOpen failed for %s",
00107 fileOpenInp->fileName);
00108 }
00109
00110 return fileInx;
00111 }
00112
00113
00114
00115 int _rsFileOpen( rsComm_t* _comm,
00116 fileOpenInp_t* _open_inp ) {
00117
00118
00119 if( !_comm || !_open_inp ) {
00120 rodsLog( LOG_ERROR, "_rsFileOpen - null comm or open_inp pointer(s)." );
00121 return -1;
00122 }
00123
00124
00125
00126
00127 if( ( _open_inp->flags & O_WRONLY ) && ( _open_inp->flags & O_RDWR ) ) {
00128
00129 _open_inp->flags &= ~(O_WRONLY);
00130 }
00131
00132 if(_open_inp->objPath[0] == '\0') {
00133 std::stringstream msg;
00134 msg << __FUNCTION__;
00135 msg << " - Empty logical path.";
00136 eirods::log(LOG_ERROR, msg.str());
00137 return -1;
00138 }
00139
00140
00141
00142 eirods::file_object file_obj( _comm, _open_inp->objPath, _open_inp->fileName, _open_inp->resc_hier_, 0, _open_inp->mode, _open_inp->flags );
00143 if(_open_inp->in_pdmo) {
00144 file_obj.in_pdmo(true);
00145 }
00146
00147 eirods::error ret_err = fileOpen( _comm, file_obj );
00148
00149
00150
00151 if ( !ret_err.ok() ) {
00152 std::stringstream msg;
00153 msg << "_rsFileOpen: fileOpen for [";
00154 msg << _open_inp->fileName;
00155 msg << "], status = ";
00156 msg << file_obj.file_descriptor();
00157 eirods::error out_err = PASS( false, ret_err.code(), msg.str(), ret_err );
00158 eirods::log( out_err );
00159 }
00160
00161 return file_obj.file_descriptor();
00162
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173