/** * reloads the routing data * * @param cmd_tree the MI command tree * @param param the parameter * * @return code 200 on success, code 500 on failure */ struct mi_root* reload_fifo (struct mi_root* cmd_tree, void *param) { struct mi_root * tmp = NULL; if (prepare_route_tree () == -1) { tmp = init_mi_tree(500, "failed to re-built tree, see log", 33); } else { tmp = init_mi_tree(200, MI_OK_S, MI_OK_LEN); } return tmp; }
/** * Initialises the module, i.e. it binds the necessary API functions * and registers the fifo commands * * @return 0 on success, -1 on failure */ static int mod_init(void) { init_db_url( db_url , 0 /*cannot be null*/); db_table.len = strlen(db_table.s); carrier_table.len = strlen(carrier_table.s); subscriber_table.len = strlen(subscriber_table.s); id_col.len = strlen(id_col.s); carrier_col.len = strlen(carrier_col.s); domain_col.len = strlen(domain_col.s); scan_prefix_col.len = strlen(scan_prefix_col.s); flags_col.len = strlen(flags_col.s); mask_col.len = strlen(mask_col.s); prob_col.len = strlen(prob_col.s); rewrite_host_col.len = strlen(rewrite_host_col.s); strip_col.len = strlen(strip_col.s); rewrite_prefix_col.len = strlen(rewrite_prefix_col.s); rewrite_suffix_col.len = strlen(rewrite_suffix_col.s); comment_col.len = strlen(comment_col.s); username_col.len = strlen(username_col.s); subscriber_domain_col.len = strlen(subscriber_domain_col.s); cr_preferred_carrier_col.len = strlen(cr_preferred_carrier_col.s); carrier_id_col.len = strlen(carrier_id_col.s); carrier_name_col.len = strlen(carrier_name_col.s); failure_id_col.len = strlen(failure_id_col.s); failure_carrier_col.len = strlen(failure_carrier_col.s); failure_domain_col.len = strlen(failure_domain_col.s); failure_scan_prefix_col.len = strlen(failure_scan_prefix_col.s); failure_host_name_col.len = strlen(failure_host_name_col.s); failure_reply_code_col.len = strlen(failure_reply_code_col.s); failure_flags_col.len = strlen(failure_flags_col.s); failure_mask_col.len = strlen(failure_mask_col.s); failure_next_domain_col.len = strlen(failure_next_domain_col.s); failure_comment_col.len = strlen(failure_comment_col.s); default_tree.len = strlen(default_tree.s); if (init_route_data(config_source) < 0) { LM_ERR("could not init route data\n"); return -1; } if (prepare_route_tree() == -1) { LM_ERR("could not prepare route tree\n"); return -1; } if(data_main_finalize() < 0) { return -1; } LM_INFO("module initialized, pid [%d]\n", getpid()); return 0; }
/** * loads the config data into shared memory (but doesn't really * share it), updates the routing data and writes it to the config * file. Afterwards, the global routing data is reloaded. * * @param opts pointer to the option structure which contains * data to be modified or to be added * * @return 0 on success, -1 on failure */ static int update_route_data(fifo_opt_t * opts) { struct rewrite_data * rd; int i,j; str tmp_domain; str tmp_prefix; str tmp_host; str tmp_rewrite_prefix; str tmp_rewrite_suffix; str tmp_comment = str_init(""); if ((rd = shm_malloc(sizeof(struct rewrite_data))) == NULL) { LM_ERR("out of shared memory\n"); return -1; } memset(rd, 0, sizeof(struct rewrite_data)); if (load_config(rd) < 0) { LM_ERR("could not load config\n"); FIFO_ERR(E_LOADCONF); return -1; } if (rule_fixup(rd) < 0) { LM_ERR("could not fixup rules\n"); FIFO_ERR(E_RULEFIXUP); return -1; } updated = 0; if (opts->cmd == OPT_ADD) { tmp_domain=opts->domain; tmp_prefix=opts->prefix; tmp_host=opts->host; tmp_rewrite_prefix=opts->rewrite_prefix; tmp_rewrite_suffix=opts->rewrite_suffix; if (tmp_domain.s==NULL) { tmp_domain.s=""; tmp_domain.len=0; } if (tmp_prefix.s==NULL) { tmp_prefix.s=""; tmp_prefix.len=0; } if (tmp_host.s==NULL) { tmp_host.s=""; tmp_host.len=0; } if (tmp_rewrite_prefix.s==NULL) { tmp_rewrite_prefix.s=""; tmp_rewrite_prefix.len=0; } if (tmp_rewrite_suffix.s==NULL) { tmp_rewrite_suffix.s=""; tmp_rewrite_suffix.len=0; } if (add_route(rd, 1, &tmp_domain, &tmp_prefix, 0, 0, 0, opts->prob, &tmp_host, opts->strip, &tmp_rewrite_prefix, &tmp_rewrite_suffix, opts->status, opts->hash_index, -1, NULL, &tmp_comment) < 0) { goto errout; } updated = 1; if (rule_fixup(rd) < 0) { LM_ERR("could not fixup rules after route appending\n"); FIFO_ERR(E_RULEFIXUP); return -1; } } else { for (i=0; i<rd->tree_num; i++) { if(rd->carriers[i]){ for (j=0; j<rd->carriers[i]->tree_num; j++) { if (rd->carriers[i]->trees[j] && rd->carriers[i]->trees[j]->tree) { if (update_route_data_recursor(rd->carriers[i]->trees[j]->tree, &rd->carriers[i]->trees[j]->name, opts) < 0) { goto errout; } } } } } } if(!updated){ LM_ERR("no match for update found\n"); FIFO_ERR(E_NOUPDATE); goto errout; } if (save_config(rd) < 0) { LM_ERR("could not save config\n"); FIFO_ERR(E_SAVECONF); goto errout; } if (prepare_route_tree() == -1) { LM_ERR("could not prepare the route tree\n"); FIFO_ERR(E_LOADCONF); goto errout; } destroy_rewrite_data(rd); return 0; errout: destroy_rewrite_data(rd); return -1; }