/** * deletes all entries in a cidr and destroys the datastructure */ void destroy_cidr(tcpr_cidr_t * cidr) { if (cidr != NULL) { if (cidr->next != NULL) destroy_cidr(cidr->next); safe_free(cidr); } return; }
/** * processes the tree using rbwalk / tree2cidr to generate a CIDR * used for 2nd pass, router mode * * returns > 0 for success (the mask len), 0 for fail */ int process_tree(void) { int mymask = 0; tcpr_buildcidr_t *bcdata; tcpprep_opt_t *options = tcpprep->options; dbg(1, "Running: process_tree()"); bcdata = (tcpr_buildcidr_t *)safe_malloc(sizeof(tcpr_buildcidr_t)); for (mymask = options->max_mask; mymask <= options->min_mask; mymask++) { dbgx(1, "Current mask: %u", mymask); /* set starting vals */ bcdata->type = DIR_SERVER; bcdata->masklen = mymask; /* build cidrdata with servers */ tree_buildcidr(&treeroot, bcdata); /* calculate types of all IP's */ tree_calculate(&treeroot); /* try to find clients in cidrdata */ bcdata->type = DIR_CLIENT; if (! tree_checkincidr(&treeroot, bcdata)) { /* didn't find any clients in cidrdata */ safe_free(bcdata); return (mymask); /* success! */ } else { destroy_cidr(options->cidrdata); /* clean up after our mess */ options->cidrdata = NULL; } } safe_free(bcdata); /* we failed to find a valid cidr list */ notice("Unable to determine any IP addresses as a clients."); notice("Perhaps you should change the --ratio, --minmask/maxmask settings, or try another mode?"); return (0); }
int process_tree() { int mymask = 0; BUILDCIDR *bcdata; if ((bcdata = (BUILDCIDR *) malloc(sizeof(BUILDCIDR))) == NULL) err(1, "malloc"); for (mymask = max_mask; mymask <= min_mask; mymask++) { dbg(1, "Current mask: %u", mymask); /* set starting vals */ bcdata->type = SERVER; bcdata->masklen = mymask; /* build cidrdata with servers */ tree_buildcidr(&treeroot, bcdata); /* calculate types of all IP's */ tree_calculate(&treeroot); /* try to find clients in cidrdata */ checkincidr = 0; bcdata->type = CLIENT; tree_checkincidr(&treeroot, bcdata); if (checkincidr == 0) { /* didn't find any clients in cidrdata */ return (mymask); /* success! */ } else { destroy_cidr(cidrdata); /* clean up after our mess */ cidrdata = NULL; } } /* we failed to find a vaild cidr list */ return (0); }