int irods_file_seek_( int *fd, long *offset, char *whence ) { openedDataObjInp_t seekParam; fileLseekOut_t* seekResult = NULL; int status; int myWhence = 0; if ( strstr( whence, "SEEK_SET" ) != NULL ) { myWhence = SEEK_SET; } if ( strstr( whence, "SEEK_CUR" ) != NULL ) { myWhence = SEEK_CUR; } if ( strstr( whence, "SEEK_END" ) != NULL ) { myWhence = SEEK_END; } if ( debug ) { printf( "irods_file_seek_: %d\n", *fd ); } memset( &seekParam, 0, sizeof( openedDataObjInp_t ) ); seekParam.l1descInx = *fd; seekParam.offset = *offset; seekParam.whence = myWhence; status = rcDataObjLseek( Comm, &seekParam, &seekResult ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "irods_file_seek_" ); } return status; }
static int irods_reli_lseek_if_needed( struct irods_file *file, INT64_T offset ) { openedDataObjInp_t request; fileLseekOut_t *response=0; int result; struct irods_server *server = connect_to_host(file->host); if(!server) return -1; if(!connect_to_file(server,file)) return -1; if(file->offset==offset) return 0; memset(&request,0,sizeof(request)); request.l1descInx = file->fd; request.offset = offset; request.whence = SEEK_SET; debug(D_IRODS,"rcDataObjLseek %s %d %lld",file->host,file->fd,(long long)offset); result = rcDataObjLseek(server->conn,&request,&response); debug(D_IRODS,"= %d",result); if(result<0) { errno = irods_reli_errno(result); return -1; } free(response); file->offset = offset; return 0; }
int isioFileSeek(int fileIndex, long offset, int whence) { openedDataObjInp_t seekParam; fileLseekOut_t* seekResult = NULL; int status; if (debug) printf("isioFileSeek: %d\n", fileIndex); memset( &seekParam, 0, sizeof(openedDataObjInp_t) ); seekParam.l1descInx = openFiles[fileIndex]; seekParam.offset = offset; seekParam.whence = whence; status = rcDataObjLseek(Comm, &seekParam, &seekResult ); if ( status < 0 ) { rodsLogError (LOG_ERROR, status, "isioFileSeek"); } return(status); }
static off_t irods_seek(hFILE *fpv, off_t offset, int whence) { hFILE_irods *fp = (hFILE_irods *) fpv; openedDataObjInp_t args; fileLseekOut_t *out = NULL; int ret; memset(&args, 0, sizeof args); args.l1descInx = fp->descriptor; args.offset = offset; args.whence = whence; ret = rcDataObjLseek(irods.conn, &args, &out); if (out) { offset = out->offset; free(out); } else offset = -1; if (ret < 0) { set_errno(ret); return -1; } return offset; }
int _iFuseFileCacheLseek( fileCache_t *fileCache, off_t offset ) { int status; if ( offset == fileCache->offset ) { return 0; } if ( fileCache->state == NO_FILE_CACHE ) { iFuseConn_t *conn = getAndUseConnByPath( fileCache->localPath, &status ); openedDataObjInp_t dataObjLseekInp; fileLseekOut_t *dataObjLseekOut = NULL; bzero( &dataObjLseekInp, sizeof( dataObjLseekInp ) ); dataObjLseekInp.l1descInx = fileCache->iFd; dataObjLseekInp.offset = offset; dataObjLseekInp.whence = SEEK_SET; status = rcDataObjLseek( conn->conn, &dataObjLseekInp, &dataObjLseekOut ); unuseIFuseConn( conn ); if ( dataObjLseekOut != NULL ) { free( dataObjLseekOut ); } } else { rodsLong_t lstatus; lstatus = lseek( fileCache->iFd, offset, SEEK_SET ); if ( lstatus >= 0 ) { status = 0; } else { status = lstatus; } } fileCache->offset = offset; return status; }
int rsDataObjLseek( rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp, fileLseekOut_t **dataObjLseekOut ) { int status; int l1descInx, l3descInx; int rescTypeInx; dataObjInfo_t *dataObjInfo; l1descInx = dataObjLseekInp->l1descInx; if ( l1descInx <= 2 || l1descInx >= NUM_L1_DESC ) { rodsLog( LOG_NOTICE, "rsDataObjLseek: l1descInx %d out of range", l1descInx ); return ( SYS_FILE_DESC_OUT_OF_RANGE ); } if ( L1desc[l1descInx].inuseFlag != FD_INUSE ) { return BAD_INPUT_DESC_INDEX; } if ( L1desc[l1descInx].remoteZoneHost != NULL ) { /* cross zone operation */ dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx; status = rcDataObjLseek( L1desc[l1descInx].remoteZoneHost->conn, dataObjLseekInp, dataObjLseekOut ); dataObjLseekInp->l1descInx = l1descInx; return status; } l3descInx = L1desc[l1descInx].l3descInx; if ( l3descInx <= 2 ) { rodsLog( LOG_NOTICE, "rsDataObjLseek: l3descInx %d out of range", l3descInx ); return ( SYS_FILE_DESC_OUT_OF_RANGE ); } dataObjInfo = L1desc[l1descInx].dataObjInfo; // =-=-=-=-=-=-=- // extract the host location from the resource hierarchy std::string location; irods::error ret = irods::get_loc_for_hier_string( dataObjInfo->rescHier, location ); if ( !ret.ok() ) { irods::log( PASSMSG( "rsDataObjLseek - failed in get_loc_for_hier_String", ret ) ); return -1; } if ( getStructFileType( dataObjInfo->specColl ) >= 0 ) { subStructFileLseekInp_t subStructFileLseekInp; memset( &subStructFileLseekInp, 0, sizeof( subStructFileLseekInp ) ); subStructFileLseekInp.type = dataObjInfo->specColl->type; subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx; subStructFileLseekInp.offset = dataObjLseekInp->offset; subStructFileLseekInp.whence = dataObjLseekInp->whence; rstrcpy( subStructFileLseekInp.addr.hostAddr, location.c_str(), NAME_LEN ); rstrcpy( subStructFileLseekInp.resc_hier, dataObjInfo->rescHier, NAME_LEN ); status = rsSubStructFileLseek( rsComm, &subStructFileLseekInp, dataObjLseekOut ); } else { *dataObjLseekOut = ( fileLseekOut_t* )malloc( sizeof( fileLseekOut_t ) ); memset( *dataObjLseekOut, 0, sizeof( fileLseekOut_t ) ); rescTypeInx = dataObjInfo->rescInfo->rescTypeInx; ( *dataObjLseekOut )->offset = _l3Lseek( rsComm, rescTypeInx, l3descInx, dataObjLseekInp->offset, dataObjLseekInp->whence ); if ( ( *dataObjLseekOut )->offset >= 0 ) { status = 0; } else { status = ( *dataObjLseekOut )->offset; } } return ( status ); }
int rsDataObjLseek (rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp, fileLseekOut_t **dataObjLseekOut) { int status; int l1descInx, l3descInx; int rescTypeInx; dataObjInfo_t *dataObjInfo; l1descInx = dataObjLseekInp->l1descInx; if (l1descInx <= 2 || l1descInx >= NUM_L1_DESC) { rodsLog (LOG_NOTICE, "rsDataObjLseek: l1descInx %d out of range", l1descInx); return (SYS_FILE_DESC_OUT_OF_RANGE); } if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX; if (L1desc[l1descInx].remoteZoneHost != NULL) { /* cross zone operation */ dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx; status = rcDataObjLseek (L1desc[l1descInx].remoteZoneHost->conn, dataObjLseekInp, dataObjLseekOut); dataObjLseekInp->l1descInx = l1descInx; return status; } l3descInx = L1desc[l1descInx].l3descInx; if (l3descInx <= 2) { rodsLog (LOG_NOTICE, "rsDataObjLseek: l3descInx %d out of range", l3descInx); return (SYS_FILE_DESC_OUT_OF_RANGE); } dataObjInfo = L1desc[l1descInx].dataObjInfo; if (getStructFileType (dataObjInfo->specColl) >= 0) { subStructFileLseekInp_t subStructFileLseekInp; memset (&subStructFileLseekInp, 0, sizeof (subStructFileLseekInp)); subStructFileLseekInp.type = dataObjInfo->specColl->type; subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx; subStructFileLseekInp.offset = dataObjLseekInp->offset; subStructFileLseekInp.whence = dataObjLseekInp->whence; rstrcpy (subStructFileLseekInp.addr.hostAddr, dataObjInfo->rescInfo->rescLoc, NAME_LEN); status = rsSubStructFileLseek (rsComm, &subStructFileLseekInp, dataObjLseekOut); } else { *dataObjLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t)); memset (*dataObjLseekOut, 0, sizeof (fileLseekOut_t)); rescTypeInx = dataObjInfo->rescInfo->rescTypeInx; (*dataObjLseekOut)->offset = _l3Lseek (rsComm, rescTypeInx, l3descInx, dataObjLseekInp->offset, dataObjLseekInp->whence); if ((*dataObjLseekOut)->offset >= 0) { status = 0; } else { status = (*dataObjLseekOut)->offset; } } return (status); }