00001
00002
00003
00004
00005
00006 #include "fileLseek.h"
00007 #include "miscServerFunct.h"
00008 #include "rsGlobalExtern.h"
00009
00010 int
00011 rsFileLseek (rsComm_t *rsComm, fileLseekInp_t *fileLseekInp,
00012 fileLseekOut_t **fileLseekOut)
00013 {
00014 rodsServerHost_t *rodsServerHost;
00015 int remoteFlag;
00016 int retVal;
00017
00018 *fileLseekOut = NULL;
00019
00020 remoteFlag = getServerHostByFileInx (fileLseekInp->fileInx,
00021 &rodsServerHost);
00022
00023 if (remoteFlag == LOCAL_HOST) {
00024 retVal = _rsFileLseek (rsComm, fileLseekInp, fileLseekOut);
00025 } else if (remoteFlag == REMOTE_HOST) {
00026 retVal = remoteFileLseek (rsComm, fileLseekInp,
00027 fileLseekOut, rodsServerHost);
00028 } else {
00029 if (remoteFlag < 0) {
00030 return (remoteFlag);
00031 } else {
00032 rodsLog (LOG_NOTICE,
00033 "rsFileLseek: resolveHost returned unrecognized value %d",
00034 remoteFlag);
00035 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00036 }
00037 }
00038
00039
00040
00041 return (retVal);
00042 }
00043
00044 int
00045 remoteFileLseek (rsComm_t *rsComm, fileLseekInp_t *fileLseekInp,
00046 fileLseekOut_t **fileLseekOut, rodsServerHost_t *rodsServerHost)
00047 {
00048 int status;
00049
00050 if (rodsServerHost == NULL) {
00051 rodsLog (LOG_NOTICE,
00052 "remoteFileLseek: Invalid rodsServerHost");
00053 return SYS_INVALID_SERVER_HOST;
00054 }
00055
00056 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00057 return status;
00058 }
00059
00060 fileLseekInp->fileInx = convL3descInx (fileLseekInp->fileInx);
00061 status = rcFileLseek (rodsServerHost->conn, fileLseekInp, fileLseekOut);
00062
00063 if (status < 0) {
00064 rodsLog (LOG_NOTICE,
00065 "remoteFileLseek: rcFileLseek failed for %d, status = %d",
00066 fileLseekInp->fileInx, status);
00067 }
00068
00069 return status;
00070 }
00071
00072 int
00073 _rsFileLseek (rsComm_t *rsComm, fileLseekInp_t *fileLseekInp,
00074 fileLseekOut_t **fileLseekOut)
00075 {
00076 int status;
00077 rodsLong_t lStatus;
00078
00079 lStatus = fileLseek (FileDesc[fileLseekInp->fileInx].fileType,
00080 rsComm, FileDesc[fileLseekInp->fileInx].fd,
00081 fileLseekInp->offset, fileLseekInp->whence);
00082
00083 if (lStatus < 0) {
00084 status = lStatus;
00085 rodsLog (LOG_NOTICE,
00086 "_rsFileLseek: fileLseek failed for %d, status = %d",
00087 fileLseekInp->fileInx, status);
00088 return (status);
00089 } else {
00090 *fileLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t));
00091 memset (*fileLseekOut, 0, sizeof (fileLseekOut_t));
00092
00093 (*fileLseekOut)->offset = lStatus;
00094 status = 0;
00095 }
00096
00097 return (status);
00098 }