00001
00002
00003 #include "subStructFileLseek.h"
00004 #include "miscServerFunct.h"
00005 #include "dataObjOpr.h"
00006
00007
00008
00009 #include "eirods_structured_object.h"
00010
00011
00012 int
00013 rsSubStructFileLseek (rsComm_t *rsComm, subStructFileLseekInp_t *subStructFileLseekInp,
00014 fileLseekOut_t **subStructFileLseekOut)
00015 {
00016 rodsServerHost_t *rodsServerHost;
00017 int remoteFlag;
00018 int status;
00019
00020 remoteFlag = resolveHost (&subStructFileLseekInp->addr, &rodsServerHost);
00021
00022 if (remoteFlag == LOCAL_HOST) {
00023 status = _rsSubStructFileLseek (rsComm, subStructFileLseekInp, subStructFileLseekOut);
00024 } else if (remoteFlag == REMOTE_HOST) {
00025 status = remoteSubStructFileLseek (rsComm, subStructFileLseekInp, subStructFileLseekOut,
00026 rodsServerHost);
00027 } else {
00028 if (remoteFlag < 0) {
00029 return (remoteFlag);
00030 } else {
00031 rodsLog (LOG_NOTICE,
00032 "rsSubStructFileLseek: resolveHost returned unrecognized value %d",
00033 remoteFlag);
00034 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00035 }
00036 }
00037
00038 return (status);
00039 }
00040
00041 int
00042 remoteSubStructFileLseek (rsComm_t *rsComm, subStructFileLseekInp_t *subStructFileLseekInp,
00043 fileLseekOut_t **subStructFileLseekOut, rodsServerHost_t *rodsServerHost)
00044 {
00045 int status;
00046
00047 if (rodsServerHost == NULL) {
00048 rodsLog (LOG_NOTICE,
00049 "remoteSubStructFileLseek: Invalid rodsServerHost");
00050 return SYS_INVALID_SERVER_HOST;
00051 }
00052
00053 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00054 return status;
00055 }
00056
00057 status = rcSubStructFileLseek (rodsServerHost->conn, subStructFileLseekInp,
00058 subStructFileLseekOut);
00059
00060 if (status < 0) {
00061 rodsLog (LOG_NOTICE,
00062 "remoteSubStructFileLseek: rcFileLseek failed for fd %d",
00063 subStructFileLseekInp->fd);
00064 }
00065
00066 return status;
00067 }
00068
00069 int _rsSubStructFileLseek( rsComm_t* _comm,
00070 subStructFileLseekInp_t* _lseek_inp,
00071 fileLseekOut_t** _lseek_out ) {
00072
00073
00074 eirods::structured_object struct_obj;
00075 struct_obj.comm( _comm );
00076 struct_obj.file_descriptor( _lseek_inp->fd );
00077
00078 struct_obj.resc_hier( eirods::EIRODS_LOCAL_USE_ONLY_RESOURCE );
00079
00080 rodsLong_t lStatus;
00081 int status;
00082
00083
00084
00085 eirods::error lseek_err = fileLseek( _comm,
00086 struct_obj,
00087 _lseek_inp->offset,
00088 _lseek_inp->whence );
00089 if( !lseek_err.ok() ) {
00090 std::stringstream msg;
00091 msg << "fileLseek failed for fd [";
00092 msg << struct_obj.file_descriptor();
00093 msg << "]";
00094 eirods::log( PASSMSG( msg.str(), lseek_err ) );
00095 return lseek_err.code();
00096
00097 } else {
00098
00099
00100 if( ! *_lseek_out ) {
00101 *_lseek_out = new fileLseekOut_t;
00102 memset( *_lseek_out, 0, sizeof( fileLseekOut_t ) );
00103 }
00104
00105 (*_lseek_out)->offset = lseek_err.code();
00106 return 0;
00107
00108 }
00109
00110 }
00111