00001
00002
00003
00004
00005
00006 #include "dataObjLseek.h"
00007 #include "rodsLog.h"
00008 #include "rsGlobalExtern.h"
00009 #include "rcGlobalExtern.h"
00010 #include "subStructFileLseek.h"
00011 #include "objMetaOpr.h"
00012 #include "subStructFileUnlink.h"
00013
00014
00015 int
00016 rsDataObjLseek (rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp,
00017 fileLseekOut_t **dataObjLseekOut)
00018 {
00019 int status;
00020 int l1descInx, l3descInx;
00021 int rescTypeInx;
00022 dataObjInfo_t *dataObjInfo;
00023
00024 l1descInx = dataObjLseekInp->l1descInx;
00025
00026 if (l1descInx <= 2 || l1descInx >= NUM_L1_DESC) {
00027 rodsLog (LOG_NOTICE,
00028 "rsDataObjLseek: l1descInx %d out of range",
00029 l1descInx);
00030 return (SYS_FILE_DESC_OUT_OF_RANGE);
00031 }
00032 if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
00033 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00034
00035 dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00036 status = rcDataObjLseek (L1desc[l1descInx].remoteZoneHost->conn,
00037 dataObjLseekInp, dataObjLseekOut);
00038 dataObjLseekInp->l1descInx = l1descInx;
00039 return status;
00040 }
00041
00042 l3descInx = L1desc[l1descInx].l3descInx;
00043
00044 if (l3descInx <= 2) {
00045 rodsLog (LOG_NOTICE,
00046 "rsDataObjLseek: l3descInx %d out of range",
00047 l3descInx);
00048 return (SYS_FILE_DESC_OUT_OF_RANGE);
00049 }
00050
00051 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00052
00053 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00054 subStructFileLseekInp_t subStructFileLseekInp;
00055 memset (&subStructFileLseekInp, 0, sizeof (subStructFileLseekInp));
00056 subStructFileLseekInp.type = dataObjInfo->specColl->type;
00057 subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx;
00058 subStructFileLseekInp.offset = dataObjLseekInp->offset;
00059 subStructFileLseekInp.whence = dataObjLseekInp->whence;
00060 rstrcpy (subStructFileLseekInp.addr.hostAddr, dataObjInfo->rescInfo->rescLoc,
00061 NAME_LEN);
00062 status = rsSubStructFileLseek (rsComm, &subStructFileLseekInp, dataObjLseekOut);
00063 } else {
00064 *dataObjLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t));
00065 memset (*dataObjLseekOut, 0, sizeof (fileLseekOut_t));
00066 rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;
00067
00068 (*dataObjLseekOut)->offset = _l3Lseek (rsComm, rescTypeInx, l3descInx,
00069 dataObjLseekInp->offset, dataObjLseekInp->whence);
00070
00071 if ((*dataObjLseekOut)->offset >= 0) {
00072 status = 0;
00073 } else {
00074 status = (*dataObjLseekOut)->offset;
00075 }
00076 }
00077
00078 return (status);
00079 }
00080
00081 rodsLong_t
00082 _l3Lseek (rsComm_t *rsComm, int rescTypeInx, int l3descInx,
00083 rodsLong_t offset, int whence)
00084 {
00085 fileLseekInp_t fileLseekInp;
00086 fileLseekOut_t *fileLseekOut = NULL;
00087 int status;
00088
00089 switch (RescTypeDef[rescTypeInx].rescCat) {
00090 case FILE_CAT:
00091 memset (&fileLseekInp, 0, sizeof (fileLseekInp));
00092 fileLseekInp.fileInx = l3descInx;
00093 fileLseekInp.offset = offset;
00094 fileLseekInp.whence = whence;
00095 status = rsFileLseek (rsComm, &fileLseekInp, &fileLseekOut);
00096 break;
00097
00098 default:
00099 rodsLog (LOG_NOTICE,
00100 "_l3Lseek: rescCat type %d is not recognized",
00101 RescTypeDef[rescTypeInx].rescCat);
00102 status = SYS_INVALID_RESC_TYPE;
00103 break;
00104 }
00105 if (status < 0) {
00106 return (status);
00107 } else {
00108 rodsLong_t offset = fileLseekOut->offset;
00109 free (fileLseekOut);
00110 return (offset);
00111 }
00112 }
00113
00114 #ifdef COMPAT_201
00115 int
00116 rsDataObjLseek201 (rsComm_t *rsComm, fileLseekInp_t *dataObjLseekInp,
00117 fileLseekOut_t **dataObjLseekOut)
00118 {
00119 openedDataObjInp_t openedDataObjInp;
00120 int status;
00121
00122 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00123
00124 openedDataObjInp.l1descInx = dataObjLseekInp->fileInx;
00125 openedDataObjInp.offset = dataObjLseekInp->offset;
00126 openedDataObjInp.whence = dataObjLseekInp->whence;
00127
00128 status = rsDataObjLseek (rsComm, &openedDataObjInp, dataObjLseekOut);
00129
00130 return status;
00131 }
00132 #endif
00133