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
00016 #include "eirods_resource_backport.h"
00017
00018 int
00019 rsDataObjLseek (rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp,
00020 fileLseekOut_t **dataObjLseekOut)
00021 {
00022 int status;
00023 int l1descInx, l3descInx;
00024 int rescTypeInx;
00025 dataObjInfo_t *dataObjInfo;
00026
00027 l1descInx = dataObjLseekInp->l1descInx;
00028
00029 if (l1descInx <= 2 || l1descInx >= NUM_L1_DESC) {
00030 rodsLog (LOG_NOTICE,
00031 "rsDataObjLseek: l1descInx %d out of range",
00032 l1descInx);
00033 return (SYS_FILE_DESC_OUT_OF_RANGE);
00034 }
00035 if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
00036 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00037
00038 dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00039 status = rcDataObjLseek (L1desc[l1descInx].remoteZoneHost->conn,
00040 dataObjLseekInp, dataObjLseekOut);
00041 dataObjLseekInp->l1descInx = l1descInx;
00042 return status;
00043 }
00044
00045 l3descInx = L1desc[l1descInx].l3descInx;
00046
00047 if (l3descInx <= 2) {
00048 rodsLog (LOG_NOTICE,
00049 "rsDataObjLseek: l3descInx %d out of range",
00050 l3descInx);
00051 return (SYS_FILE_DESC_OUT_OF_RANGE);
00052 }
00053
00054 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00055
00056
00057
00058 std::string location;
00059 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00060 if( !ret.ok() ) {
00061 eirods::log( PASSMSG( "rsDataObjLseek - failed in get_loc_for_hier_String", ret ) );
00062 return -1;
00063 }
00064
00065
00066 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00067 subStructFileLseekInp_t subStructFileLseekInp;
00068 memset (&subStructFileLseekInp, 0, sizeof (subStructFileLseekInp));
00069 subStructFileLseekInp.type = dataObjInfo->specColl->type;
00070 subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx;
00071 subStructFileLseekInp.offset = dataObjLseekInp->offset;
00072 subStructFileLseekInp.whence = dataObjLseekInp->whence;
00073 rstrcpy (subStructFileLseekInp.addr.hostAddr, location.c_str(),
00074 NAME_LEN);
00075 status = rsSubStructFileLseek (rsComm, &subStructFileLseekInp, dataObjLseekOut);
00076 } else {
00077 *dataObjLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t));
00078 memset (*dataObjLseekOut, 0, sizeof (fileLseekOut_t));
00079 rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;
00080
00081 (*dataObjLseekOut)->offset = _l3Lseek (rsComm, rescTypeInx, l3descInx,
00082 dataObjLseekInp->offset, dataObjLseekInp->whence);
00083
00084 if ((*dataObjLseekOut)->offset >= 0) {
00085 status = 0;
00086 } else {
00087 status = (*dataObjLseekOut)->offset;
00088 }
00089 }
00090
00091 return (status);
00092 }
00093
00094 rodsLong_t
00095 _l3Lseek (rsComm_t *rsComm, int rescTypeInx, int l3descInx,
00096 rodsLong_t offset, int whence)
00097 {
00098 fileLseekInp_t fileLseekInp;
00099 fileLseekOut_t *fileLseekOut = NULL;
00100 int status;
00101
00102 #if 0 // JMC - legacy resource
00103 switch (RescTypeDef[rescTypeInx].rescCat) {
00104 case FILE_CAT:
00105 #endif // JMC - legacy resource
00106 memset (&fileLseekInp, 0, sizeof (fileLseekInp));
00107 fileLseekInp.fileInx = l3descInx;
00108 fileLseekInp.offset = offset;
00109 fileLseekInp.whence = whence;
00110 status = rsFileLseek (rsComm, &fileLseekInp, &fileLseekOut);
00111 #if 0 // JMC - legacy resource
00112 break;
00113
00114 default:
00115 rodsLog (LOG_NOTICE,
00116 "_l3Lseek: rescCat type %d is not recognized",
00117 RescTypeDef[rescTypeInx].rescCat);
00118 status = SYS_INVALID_RESC_TYPE;
00119 break;
00120 }
00121 #endif // JMC - legacy resource
00122 if (status < 0) {
00123 return (status);
00124 } else {
00125 rodsLong_t offset = fileLseekOut->offset;
00126 free (fileLseekOut);
00127 return (offset);
00128 }
00129 }
00130
00131 #ifdef COMPAT_201
00132 int
00133 rsDataObjLseek201 (rsComm_t *rsComm, fileLseekInp_t *dataObjLseekInp,
00134 fileLseekOut_t **dataObjLseekOut)
00135 {
00136 openedDataObjInp_t openedDataObjInp;
00137 int status;
00138
00139 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00140
00141 openedDataObjInp.l1descInx = dataObjLseekInp->fileInx;
00142 openedDataObjInp.offset = dataObjLseekInp->offset;
00143 openedDataObjInp.whence = dataObjLseekInp->whence;
00144
00145 status = rsDataObjLseek (rsComm, &openedDataObjInp, dataObjLseekOut);
00146
00147 return status;
00148 }
00149 #endif
00150