NSAPI_PUBLIC void ACL_ListDestroy(NSErr_t *errp, ACLListHandle_t *acl_list ) { ACLWrapper_t *wrapper; ACLWrapper_t *tmp_wrapper; ACLHandle_t *tmp_acl; if ( acl_list == NULL ) return; if ( acl_list->acl_sym_table ) { /* Destroy each entry in the symbol table */ symTableEnumerate(acl_list->acl_sym_table, 0, acl_hash_entry_destroy); /* Destory the hash table itself */ symTableDestroy(acl_list->acl_sym_table, 0); } ACL_EvalDestroyContext( (ACLListCache_t *)acl_list->cache ); wrapper = acl_list->acl_list_head; while ( wrapper ) { tmp_acl = wrapper->acl; tmp_wrapper = wrapper; wrapper = wrapper->wrap_next; PERM_FREE( tmp_wrapper ); ACL_AclDestroy(errp, tmp_acl ); } PERM_FREE( acl_list ); return; }
/* * Destroys an ACL List * * Input: * acl_list target list */ NSAPI_PUBLIC void ACL_ListDestroy(NSErr_t *errp, ACLListHandle_t *acl_list ) { ACLWrapper_t *wrapper; ACLWrapper_t *tmp_wrapper; ACLHandle_t *tmp_acl; // nothing to do? if ( acl_list == NULL ) // nothing to do. return; if (acl_list->ref_count != 0) { NS_ASSERT(acl_list->ref_count == 0); } if ( acl_list->acl_sym_table ) { /* Destroy each entry in the symbol table */ symTableEnumerate(acl_list->acl_sym_table, 0, acl_hash_entry_destroy); /* Destory the hash table itself */ symTableDestroy(acl_list->acl_sym_table, 0); } // destroy evaluation cache (if there) ACL_EvalDestroyContext( (ACLListCache_t *)acl_list->cache ); wrapper = acl_list->acl_list_head; while ( wrapper ) { tmp_acl = wrapper->acl; tmp_wrapper = wrapper; wrapper = wrapper->wrap_next; PERM_FREE( tmp_wrapper ); ACL_AclDestroy(errp, tmp_acl ); } PERM_FREE( acl_list ); return; }
NSAPI_PUBLIC int ACL_ListAclDelete(NSErr_t *errp, ACLListHandle_t *acl_list, char *acl_name, int flags ) { ACLHandle_t *acl = NULL; ACLWrapper_t *wrapper; ACLWrapper_t *wrapper_prev = NULL; Symbol_t *sym; if ( acl_list == NULL || acl_name == NULL ) return(ACLERRUNDEF); if ( flags & ACL_CASE_INSENSITIVE ) { for ( wrapper = acl_list->acl_list_head; wrapper != NULL; wrapper = wrapper->wrap_next ) { if ( wrapper->acl->tag && strcasecmp( wrapper->acl->tag, acl_name ) == 0 ) { acl = wrapper->acl; break; } wrapper_prev = wrapper; } } else { for ( wrapper = acl_list->acl_list_head; wrapper != NULL; wrapper = wrapper->wrap_next ) { if ( wrapper->acl->tag && strcmp( wrapper->acl->tag, acl_name ) == 0 ) { acl = wrapper->acl; break; } wrapper_prev = wrapper; } } if ( acl ) { if ( wrapper_prev ) { wrapper_prev->wrap_next = wrapper->wrap_next; } else { acl_list->acl_list_head = wrapper->wrap_next; } if ( acl_list->acl_list_tail == wrapper ) { acl_list->acl_list_tail = wrapper_prev; } acl = wrapper->acl; acl_list->acl_count--; PERM_FREE(wrapper); if ( acl_list->acl_sym_table ) { if ( symTableFindSym(acl_list->acl_sym_table, acl->tag, ACLSYMACL, (void **) &sym) < 0 ) { /* not found, this is an error of some sort */ } else { symTableRemoveSym(acl_list->acl_sym_table, sym); acl_hash_entry_destroy(sym, 0); } } ACL_AclDestroy(errp, acl); return(0); } return(ACLERRUNDEF); }