static void distribute_free_if_empty(struct distribute *dist) { int i; for (i=0; i < DISTRIBUTE_MAX; i++) if (dist->list[i] != NULL || dist->prefix[i] != NULL) return; hash_release (disthash, dist); distribute_free (dist); }
/* Unset distribute-list. If matched distribute-list exist then return 1. */ static int distribute_list_prefix_unset (const char *ifname, enum distribute_type type, const char *plist_name) { struct distribute *dist; dist = distribute_lookup (ifname); if (!dist) return 0; if (type == DISTRIBUTE_IN) { if (!dist->prefix[DISTRIBUTE_IN]) return 0; if (strcmp (dist->prefix[DISTRIBUTE_IN], plist_name) != 0) return 0; free (dist->prefix[DISTRIBUTE_IN]); dist->prefix[DISTRIBUTE_IN] = NULL; } if (type == DISTRIBUTE_OUT) { if (!dist->prefix[DISTRIBUTE_OUT]) return 0; if (strcmp (dist->prefix[DISTRIBUTE_OUT], plist_name) != 0) return 0; free (dist->prefix[DISTRIBUTE_OUT]); dist->prefix[DISTRIBUTE_OUT] = NULL; } /* Apply this distribute-list to the interface. */ (*distribute_delete_hook) (dist); /* If both out and in is NULL then free distribute list. */ if (dist->list[DISTRIBUTE_IN] == NULL && dist->list[DISTRIBUTE_OUT] == NULL && dist->prefix[DISTRIBUTE_IN] == NULL && dist->prefix[DISTRIBUTE_OUT] == NULL) { hash_release (disthash, dist); distribute_free (dist); } return 1; }