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