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 (rsComm_t *rsComm, fileLseekInp_t *fileLseekInp, fileLseekOut_t **fileLseekOut) {
00084
00085 if(FileDesc[fileLseekInp->fileInx].objPath == NULL ||
00086 FileDesc[fileLseekInp->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[fileLseekInp->fileInx].objPath,
00098 FileDesc[fileLseekInp->fileInx].fileName,
00099 FileDesc[fileLseekInp->fileInx].rescHier,
00100 FileDesc[fileLseekInp->fileInx].fd,
00101 0, 0 );
00102
00103 eirods::error lseek_err = fileLseek( rsComm,
00104 file_obj,
00105 fileLseekInp->offset,
00106 fileLseekInp->whence );
00107
00108
00109 if( !lseek_err.ok() ) {
00110 std::stringstream msg;
00111 msg << "lseek failed for [";
00112 msg << FileDesc[fileLseekInp->fileInx].fileName;
00113 msg << "]";
00114 eirods::error ret_err = PASSMSG( msg.str(), lseek_err );
00115 eirods::log( ret_err );
00116 return lseek_err.code();
00117
00118 } else {
00119 *fileLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t));
00120 memset (*fileLseekOut, 0, sizeof (fileLseekOut_t));
00121 (*fileLseekOut)->offset = lseek_err.code();
00122 return 0;
00123 }
00124
00125 }
00126
00127
00128