/* Adds a new separate partition and loads all rules from database in shm */ dp_connection_list_p dp_add_connection(dp_head_p head) { dp_connection_list_t *el; if ((el = dp_get_connection(&head->partition)) != NULL){ return el; } int all_size = sizeof(dp_connection_list_t) +head->dp_table_name.len + head->partition.len + head->dp_db_url.len; el = shm_malloc(all_size); if(!el) LM_ERR("No more shm\n"); if (!el) { LM_ERR("No more shm mem\n"); return NULL; } /* create & init lock */ if((el->ref_lock = lock_init_rw()) == NULL) { LM_ERR("Failed to init lock\n"); shm_free(el); return NULL; } /*Set table name*/ el->table_name.s = (char*)el + sizeof(*el); el->table_name.len = head->dp_table_name.len; memcpy(el->table_name.s, head->dp_table_name.s, head->dp_table_name.len); /*Set partition*/ el->partition.s = el->table_name.s + el->table_name.len; el->partition.len = head->partition.len; memcpy(el->partition.s, head->partition.s, head->partition.len); /*Set db_url*/ el->db_url.s = el->partition.s + el->partition.len; el->db_url.len = head->dp_db_url.len; memcpy(el->db_url.s, head->dp_db_url.s, head->dp_db_url.len); el->dp_db_handle = pkg_malloc(sizeof(db_con_t*)); if (!el->dp_db_handle) { LM_ERR("No more shm mem\n"); return NULL; } *el->dp_db_handle = 0; if (test_db(el) != 0) { LM_ERR("Unable to test db\n"); shm_free(el); return NULL; } *el->dp_db_handle = 0; el->next = dp_conns; dp_conns = el; LM_DBG("Added dialplan partition [%.*s] table [%.*s].\n", head->partition.len, head->partition.s, head->dp_table_name.len, head->dp_table_name.s); return el; }
/** * init module function */ static int mod_init(void) { LM_INFO("initializing...\n"); init_db_url( db_url , 0 /*cannot be null*/); db_table.len = strlen(db_table.s); sdomain_column.len = strlen(sdomain_column.s); prefix_column.len = strlen(prefix_column.s); domain_column.len = strlen(domain_column.s); prefix.len = strlen(prefix.s); pdt_char_list.len = strlen(pdt_char_list.s); if(pdt_char_list.len<=0) { LM_ERR("invalid pdt char list\n"); return -1; } LM_INFO("pdt_char_list=%s \n",pdt_char_list.s); /* binding to mysql module */ if(db_bind_mod(&db_url, &pdt_dbf)) { LM_ERR("database module not found\n"); return -1; } if (!DB_CAPABILITY(pdt_dbf, DB_CAP_ALL)) { LM_ERR("database module does not " "implement all functions needed by the module\n"); return -1; } /* open a connection with the database */ db_con = pdt_dbf.init(&db_url); if(db_con==NULL) { LM_ERR("failed to connect to the database\n"); return -1; } if (pdt_dbf.use_table(db_con, &db_table) < 0) { LM_ERR("failed to use_table\n"); goto error1; } LM_DBG("database connection opened successfully\n"); /* create & init lock */ if ((pdt_lock = lock_init_rw()) == NULL) { LM_CRIT("failed to init lock\n"); goto error1; } /* tree pointer in shm */ _ptree = (pdt_tree_t**)shm_malloc( sizeof(pdt_tree_t*) ); if (_ptree==0) { LM_ERR("out of shm mem for pdtree\n"); goto error1; } *_ptree=0; /* loading all information from database */ if(pdt_load_db()!=0) { LM_ERR("cannot load info from database\n"); goto error1; } pdt_dbf.close(db_con); db_con = 0; #if 0 pdt_print_tree(*_ptree); #endif /* success code */ return 0; error1: if (pdt_lock) { lock_destroy_rw( pdt_lock ); pdt_lock = 0; } if(_ptree!=0) shm_free(_ptree); if(db_con!=NULL) { pdt_dbf.close(db_con); db_con = 0; } return -1; }
/*! \brief * Module initialization function */ static int mod_init(void) { int idx; LM_DBG("initializing\n"); /* Compute the lengths of string parameters */ init_db_url( db_url , 1 /*can be null*/); contactid_col.len = strlen(contactid_col.s); user_col.len = strlen(user_col.s); domain_col.len = strlen(domain_col.s); contact_col.len = strlen(contact_col.s); expires_col.len = strlen(expires_col.s); q_col.len = strlen(q_col.s); callid_col.len = strlen(callid_col.s); cseq_col.len = strlen(cseq_col.s); flags_col.len = strlen(flags_col.s); cflags_col.len = strlen(cflags_col.s); user_agent_col.len = strlen(user_agent_col.s); received_col.len = strlen(received_col.s); path_col.len = strlen(path_col.s); sock_col.len = strlen(sock_col.s); methods_col.len = strlen(methods_col.s); sip_instance_col.len = strlen(sip_instance_col.s); attr_col.len = strlen(attr_col.s); last_mod_col.len = strlen(last_mod_col.s); if (ul_hash_size > 16) { LM_WARN("hash too big! max 2 ^ 16\n"); return -1; } if(ul_hash_size<=1) ul_hash_size = 512; else ul_hash_size = 1<<ul_hash_size; ul_locks_no = ul_hash_size; if (db_mode == WRITE_THROUGH || db_mode == WRITE_BACK) { cid_keys = pkg_malloc(max_contact_delete * (sizeof(db_key_t) * sizeof(db_val_t))); if (cid_keys == NULL) { LM_ERR("no more pkg memory\n"); return -1; } cid_vals = (db_val_t *)(cid_keys + max_contact_delete); for (idx=0; idx < max_contact_delete; idx++) { VAL_TYPE(cid_vals+idx) = DB_BIGINT; VAL_NULL(cid_vals+idx) = 0; cid_keys[idx] = &contactid_col; } } /* check matching mode */ switch (matching_mode) { case CONTACT_ONLY: case CONTACT_CALLID: break; default: LM_ERR("invalid matching mode %d\n", matching_mode); } if(ul_init_locks()!=0) { LM_ERR("locks array initialization failed\n"); return -1; } /* Register cache timer */ register_timer( "ul-timer", timer, 0, timer_interval, TIMER_FLAG_DELAY_ON_DELAY); /* init the callbacks list */ if ( init_ulcb_list() < 0) { LM_ERR("usrloc/callbacks initialization failed\n"); return -1; } /* Shall we use database ? */ if (db_mode != NO_DB) { /* Yes */ if (db_url.s==NULL || db_url.len==0) { LM_ERR("selected db_mode requires a db connection -> db_url \n"); return -1; } if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */ LM_ERR("failed to bind database module\n"); return -1; } if (!DB_CAPABILITY(ul_dbf, DB_CAP_ALL)) { LM_ERR("database module does not implement all functions" " needed by the module\n"); return -1; } if (db_mode != DB_ONLY && (sync_lock = lock_init_rw()) == NULL) { LM_ERR("cannot init rw lock\n"); return -1; } } fix_flag_name(nat_bflag_str, nat_bflag); nat_bflag = get_flag_id_by_name(FLAG_TYPE_BRANCH, nat_bflag_str); if (nat_bflag==(unsigned int)-1) { nat_bflag = 0; } else if ( nat_bflag>=8*sizeof(nat_bflag) ) { LM_ERR("bflag index (%d) too big!\n", nat_bflag); return -1; } else { nat_bflag = 1<<nat_bflag; } if (ul_event_init() < 0) { LM_ERR("cannot initialize USRLOC events\n"); return -1; } if( (ul_replicate_cluster > 0 || accept_replicated_udata > 0) && load_clusterer_api(&clusterer_api)!=0){ LM_DBG("failed to find clusterer API - is clusterer module loaded?\n"); return -1; } /* register handler for processing usrloc packets from the bin interface */ if (accept_replicated_udata > 0 && bin_register_cb(repl_module_name.s, receive_binary_packet, NULL) < 0) { LM_ERR("cannot register binary packet callback!\n"); return -1; } if(ul_replicate_cluster < 0){ ul_replicate_cluster = 0; } init_flag = 1; return 0; }
/*! \brief * Module initialization function */ static int mod_init(void) { LM_DBG("initializing\n"); /* Compute the lengths of string parameters */ init_db_url( db_url , 1 /*can be null*/); user_col.len = strlen(user_col.s); domain_col.len = strlen(domain_col.s); contact_col.len = strlen(contact_col.s); expires_col.len = strlen(expires_col.s); q_col.len = strlen(q_col.s); callid_col.len = strlen(callid_col.s); cseq_col.len = strlen(cseq_col.s); flags_col.len = strlen(flags_col.s); cflags_col.len = strlen(cflags_col.s); user_agent_col.len = strlen(user_agent_col.s); received_col.len = strlen(received_col.s); path_col.len = strlen(path_col.s); sock_col.len = strlen(sock_col.s); methods_col.len = strlen(methods_col.s); last_mod_col.len = strlen(last_mod_col.s); if(ul_hash_size<=1) ul_hash_size = 512; else ul_hash_size = 1<<ul_hash_size; ul_locks_no = ul_hash_size; /* check matching mode */ switch (matching_mode) { case CONTACT_ONLY: case CONTACT_CALLID: break; default: LM_ERR("invalid matching mode %d\n", matching_mode); } if(ul_init_locks()!=0) { LM_ERR("locks array initialization failed\n"); return -1; } /* Register cache timer */ register_timer( timer, 0, timer_interval); /* init the callbacks list */ if ( init_ulcb_list() < 0) { LM_ERR("usrloc/callbacks initialization failed\n"); return -1; } /* Shall we use database ? */ if (db_mode != NO_DB) { /* Yes */ if (db_url.s==NULL || db_url.len==0) { LM_ERR("selected db_mode requires a db connection -> db_url \n"); return -1; } if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */ LM_ERR("failed to bind database module\n"); return -1; } if (!DB_CAPABILITY(ul_dbf, DB_CAP_ALL)) { LM_ERR("database module does not implement all functions" " needed by the module\n"); return -1; } if (db_mode != DB_ONLY && (sync_lock = lock_init_rw()) == NULL) { LM_ERR("cannot init rw lock\n"); return -1; } } if (nat_bflag==(unsigned int)-1) { nat_bflag = 0; } else if ( nat_bflag>=8*sizeof(nat_bflag) ) { LM_ERR("bflag index (%d) too big!\n", nat_bflag); return -1; } else { nat_bflag = 1<<nat_bflag; } init_flag = 1; return 0; }
static int mod_init(void){ str s; int n; LM_INFO("initializing TLS protocol\n"); if (tls_db_enabled != 0 && tls_db_enabled != 1) { tls_db_enabled = 1; } if (tls_db_enabled) { /* create & init lock */ if ((dom_lock = lock_init_rw()) == NULL) { LM_CRIT("failed to init lock\n"); return -1; } init_db_url(tls_db_url, 0 /*cannot be null*/); tls_db_table.len = strlen(tls_db_table.s); if (tls_db_table.len == 0) { LM_ERR("db url not specified\n"); return -1; } id_col.len = strlen(id_col.s); address_col.len = strlen(address_col.s); type_col.len = strlen(type_col.s); method_col.len = strlen(method_col.s); verify_cert_col.len = strlen(verify_cert_col.s); require_cert_col.len = strlen(require_cert_col.s); certificate_col.len = strlen(certificate_col.s); pk_col.len = strlen(pk_col.s); crl_check_col.len = strlen(crl_check_col.s); calist_col.len = strlen(calist_col.s); cadir_col.len = strlen(cadir_col.s); cplist_col.len = strlen(cplist_col.s); dhparams_col.len = strlen(dhparams_col.s); eccurve_col.len = strlen(eccurve_col.s); if (db_bind_mod(&tls_db_url, &dr_dbf)) { LM_CRIT("cannot bind to database module! " "Did you forget to load a database module ?\n"); return -1; } /* init DB connection */ if ((db_hdl = dr_dbf.init(&tls_db_url)) == 0) { LM_CRIT("cannot initialize database connection\n"); return -1; } if (dr_dbf.use_table(db_hdl, &tls_db_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", tls_db_table.len, tls_db_table.s); return -1; } } if (tls_domain_avp) { s.s = tls_domain_avp; s.len = strlen(s.s); if (parse_avp_spec( &s, &tls_client_domain_avp)) { LM_ERR("cannot parse tls_client_avp"); return -1; } } /* * this has to be called before any function calling CRYPTO_malloc, * CRYPTO_malloc will set allow_customize in openssl to 0 */ if (!CRYPTO_set_mem_functions(os_malloc, os_realloc, os_free)) { LM_ERR("unable to set the memory allocation functions\n"); return -1; } #if !defined(OPENSSL_NO_COMP) STACK_OF(SSL_COMP)* comp_methods; /* disabling compression */ LM_WARN("disabling compression due ZLIB problems\n"); comp_methods = SSL_COMP_get_compression_methods(); if (comp_methods==0) { LM_INFO("openssl compression already disabled\n"); } else { sk_SSL_COMP_zero(comp_methods); } #endif if (tls_init_multithread() < 0) { LM_ERR("failed to init multi-threading support\n"); return -1; } SSL_library_init(); SSL_load_error_strings(); init_ssl_methods(); n = check_for_krb(); if (n==-1) { LM_ERR("kerberos check failed\n"); return -1; } if ( ( n ^ #ifndef OPENSSL_NO_KRB5 1 #else 0 #endif )!=0 ) { LM_ERR("compiled agaist an openssl with %s" "kerberos, but run with one with %skerberos\n", (n==1)?"":"no ",(n!=1)?"no ":""); return -1; } /* * finish setting up the tls default domains */ tls_default_client_domain.type = TLS_DOMAIN_DEF|TLS_DOMAIN_CLI ; tls_default_client_domain.addr.af = AF_INET; tls_default_server_domain.type = TLS_DOMAIN_DEF|TLS_DOMAIN_SRV; tls_default_server_domain.addr.af = AF_INET; /* * now initialize tls default domains */ if ( (n=init_tls_domains(&tls_default_server_domain)) ) { return n; } if ( (n=init_tls_domains(&tls_default_client_domain)) ) { return n; } /* * now initialize tls virtual domains */ if (tls_db_enabled && load_info(&dr_dbf, db_hdl, &tls_db_table, &tls_server_domains, &tls_client_domains)){ return -1; } if ( (n=init_tls_domains(tls_server_domains)) ) { return n; } if ( (n=init_tls_domains(tls_client_domains)) ) { return n; } /* * we are all set */ return 0; }