int collStatAllKinds( rsComm_t *rsComm, dataObjInp_t *dataObjInp, rodsObjStat_t **rodsObjStatOut ) { int status; *rodsObjStatOut = NULL; addKeyVal( &dataObjInp->condInput, SEL_OBJ_TYPE_KW, "collection" ); status = _rsObjStat( rsComm, dataObjInp, rodsObjStatOut ); rmKeyVal( &dataObjInp->condInput, SEL_OBJ_TYPE_KW ); if ( status >= 0 ) { if ( ( *rodsObjStatOut )->objType != COLL_OBJ_T ) { status = OBJ_PATH_DOES_NOT_EXIST; } } if ( status < 0 && *rodsObjStatOut != NULL ) { freeRodsObjStat( *rodsObjStatOut ); *rodsObjStatOut = NULL; } return status; }
int rsObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp, rodsObjStat_t **rodsObjStatOut) { int status; rodsServerHost_t *rodsServerHost = NULL; specCollCache_t *specCollCache = NULL; int linkCnt; linkCnt = resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, NULL); *rodsObjStatOut = NULL; status = getAndConnRcatHost (rsComm, SLAVE_RCAT, dataObjInp->objPath, &rodsServerHost); if (status < 0) { return(status); } if (rodsServerHost->localFlag == LOCAL_HOST) { #ifdef RODS_CAT status = _rsObjStat (rsComm, dataObjInp, rodsObjStatOut); #else status = SYS_NO_RCAT_SERVER_ERR; #endif } else { if (isLocalZone (dataObjInp->objPath)) { /* Since the iCat is on a remote host, see if it is a sub path of * a cached specColl locally first. If it is, it will save time * resolving it */ status = statPathInSpecColl (rsComm, dataObjInp->objPath, 1, rodsObjStatOut); if (status >= 0) { /* the path is in a specColl */ return status; } else if (status != SYS_SPEC_COLL_NOT_IN_CACHE) { /* path is in the path of specColl cache but does not exist */ if (linkCnt > 0 && *rodsObjStatOut != NULL) { /* a soft link - returns specColl */ if ((*rodsObjStatOut)->specColl == NULL) { replSpecColl (&specCollCache->specColl, &(*rodsObjStatOut)->specColl); } rstrcpy ((*rodsObjStatOut)->specColl->objPath, dataObjInp->objPath, MAX_NAME_LEN); } return status; } /* falls through if the path is not in a cached specColl */ } /* not in cache, need to do a remote call */ status = rcObjStat (rodsServerHost->conn, dataObjInp, rodsObjStatOut); if (status >= 0 && (*rodsObjStatOut)->specColl != NULL) { /* queue it in cache */ queueSpecCollCacheWithObjStat (*rodsObjStatOut); } } if (linkCnt > 0 && *rodsObjStatOut != NULL) { /* fill in (*rodsObjStatOut)->specColl if it is linked */ if ((*rodsObjStatOut)->specColl == NULL) { replSpecColl (&specCollCache->specColl, &(*rodsObjStatOut)->specColl); } rstrcpy ((*rodsObjStatOut)->specColl->objPath, dataObjInp->objPath, MAX_NAME_LEN); } return (status); }