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
00082 _rsFileClose (rsComm_t *rsComm, fileCloseInp_t *fileCloseInp)
00083 {
00084
00085 if(FileDesc[fileCloseInp->fileInx].objPath == NULL ||
00086 FileDesc[fileCloseInp->fileInx].objPath[0] == '\0') {
00087 std::stringstream msg;
00088 msg << __FUNCTION__;
00089 msg << " - Empty logical path.";
00090 eirods::log(LOG_ERROR, msg.str());
00091 return -1;
00092 }
00093
00094
00095
00096 eirods::file_object file_obj( rsComm,
00097 FileDesc[fileCloseInp->fileInx].objPath,
00098 FileDesc[fileCloseInp->fileInx].fileName,
00099 FileDesc[fileCloseInp->fileInx].rescHier,
00100 FileDesc[fileCloseInp->fileInx].fd,
00101 0, 0 );
00102 if(fileCloseInp->in_pdmo != 0) {
00103 file_obj.in_pdmo(true);
00104 } else {
00105 file_obj.in_pdmo(false);
00106 }
00107
00108 eirods::error close_err = fileClose( rsComm, file_obj );
00109
00110
00111 if( !close_err.ok() ) {
00112 std::stringstream msg;
00113 msg << "fileClose failed for [";
00114 msg << fileCloseInp->fileInx;
00115 msg << "]";
00116 eirods::error err = PASSMSG( msg.str(), close_err );
00117 }
00118
00119 return close_err.code();
00120
00121 }
00122
00123
00124
00125
00126
00127
00128
00129