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