Beispiel #1
0
static void
ptree_free(ptree_t * ptp)
{
	if (ptp) {
		if (ptp->part)
			ptree_free(ptp->part);
		if (ptp->next)
			ptree_free(ptp->next);
		if (ptp->val.size)
			Free(ptp->val.val);
		Free(ptp);
	}
}
Beispiel #2
0
void trie_cleanup(void)
{
	rwlock_wr_lock(&tree_lock);
	ptree_free(tree);
	rwlock_unlock(&tree_lock);
	rwlock_destroy(&tree_lock);
}
Beispiel #3
0
static ptree_t *
parse_sexp(octet_t * sexp)
{
	ptree_t        *ptp, *ntp = 0, *ptr;

	if (*sexp->val == '(') {
		ptp = (ptree_t *) Calloc(1, sizeof(ptree_t));
		ptp->list = 1;
		sexp->val++;
		sexp->len--;
		while (sexp->len && *sexp->val != ')') {
			if ((ptr = parse_sexp(sexp)) == 0) {
				ptree_free(ptp);
				return 0;
			}

			if (ptp->part == 0)
				ntp = ptp->part = ptr;
			else {
				ntp->next = ptr;
				ntp = ntp->next;
			}
		}
		if (*sexp->val == ')') {
			sexp->val++;
			sexp->len--;
		} else {	/* error */
			ptree_free(ptp);
			return 0;
		}
	} else {
		ptp = (ptree_t *) Calloc(1, sizeof(ptree_t));
		if (get_str(sexp, &ptp->val) != SPOCP_SUCCESS) {
			ptree_free(ptp);
			return 0;
		}
	}

	return ptp;
}
Beispiel #4
0
static void
destroy_flowinfo_in_port(struct flowinfo *self) {
  struct ptree_node *node;
  struct flowinfo *flowinfo;

  node = ptree_top(self->ptree);
  while (node != NULL) {
    flowinfo = node->info;
    flowinfo->destroy_func(flowinfo);
    node = ptree_next(node);
  }
  ptree_free(self->ptree);
  self->misc->destroy_func(self->misc);
  free(self);
}
Beispiel #5
0
static void
destroy_flowinfo_ipv4_dst(struct flowinfo *self) {
  struct ptree_node *node;
  struct flowinfo *flowinfo;

  node = ptree_top(self->ptree);
  while (node != NULL) {
    flowinfo = node->info;
    if (flowinfo != NULL) {
      flowinfo->destroy_func(flowinfo);
    }
    node = ptree_next(node);
  }
  ptree_free(self->ptree);
  free(self);
}