pfs_resolve_t pfs_resolve( const char *logical_name, char *physical_name, time_t stoptime ) { pfs_resolve_t result = PFS_RESOLVE_UNCHANGED; struct mount_entry *e; const char *t; if(!resolve_cache) resolve_cache = hash_table_create(0,0); t = hash_table_lookup(resolve_cache,logical_name); if(t) { strcpy(physical_name,t); result = PFS_RESOLVE_CHANGED; } else { for(e=mount_list;e;e=e->next) { result = mount_entry_check(logical_name,e->prefix,e->redirect,physical_name); if(result!=PFS_RESOLVE_UNCHANGED) break; } } switch(result) { case PFS_RESOLVE_UNCHANGED: strcpy(physical_name,logical_name); break; case PFS_RESOLVE_CHANGED: clean_up_path(physical_name); break; case PFS_RESOLVE_FAILED: debug(D_RESOLVE,"%s failed",logical_name); break; case PFS_RESOLVE_ENOENT: debug(D_RESOLVE,"%s ENOENT",logical_name); break; case PFS_RESOLVE_DENIED: debug(D_RESOLVE,"%s denied",logical_name); break; } if(result==PFS_RESOLVE_UNCHANGED || result==PFS_RESOLVE_CHANGED) { debug(D_RESOLVE,"%s = %s",logical_name,physical_name); if(!hash_table_lookup(resolve_cache,logical_name)) { hash_table_insert(resolve_cache,logical_name,xxstrdup(physical_name)); } } return result; }
static pfs_resolve_t pfs_resolve_ns( struct pfs_mount_entry *ns, const char *logical_name, char *physical_name, mode_t mode, time_t stoptime ) { assert(ns); assert(physical_name); assert(physical_name); pfs_resolve_t result = PFS_RESOLVE_UNCHANGED; const char *t; char lookup_key[PFS_PATH_MAX + 3 * sizeof(int) + 1]; sprintf(lookup_key, "%o|%p|%s", mode, ns, logical_name); if(!resolve_cache) resolve_cache = hash_table_create(0,0); t = (const char *) hash_table_lookup(resolve_cache,lookup_key); if(t) { strcpy(physical_name,t); result = PFS_RESOLVE_CHANGED; } else { while (ns) { assert(!(ns->next && ns->parent)); assert(ns->refcount > 0); if (ns->parent) { ns = ns->parent; continue; } if (*ns->prefix == '\x00' || *ns->redirect == '\x00') { // we hit the end of the mountlist break; } result = mount_entry_check(logical_name,ns->prefix,ns->redirect,physical_name); if(result!=PFS_RESOLVE_UNCHANGED) { if ((mode & ns->mode) != mode) { result = PFS_RESOLVE_DENIED; debug(D_RESOLVE,"%s denied, requesting mode %o on mount entry with %o",logical_name,mode,ns->mode); } break; } ns = ns->next; } } switch(result) { case PFS_RESOLVE_UNCHANGED: strcpy(physical_name,logical_name); break; case PFS_RESOLVE_CHANGED: clean_up_path(physical_name); break; case PFS_RESOLVE_FAILED: debug(D_RESOLVE,"%s failed",logical_name); break; case PFS_RESOLVE_ENOENT: debug(D_RESOLVE,"%s ENOENT",logical_name); break; case PFS_RESOLVE_DENIED: debug(D_RESOLVE,"%s denied",logical_name); break; } if(result==PFS_RESOLVE_UNCHANGED || result==PFS_RESOLVE_CHANGED) { debug(D_RESOLVE,"%s = %s,%o",logical_name,physical_name,mode); if(!hash_table_lookup(resolve_cache,lookup_key)) { hash_table_insert(resolve_cache,lookup_key,xxstrdup(physical_name)); } } return result; }