/** * Real initialization, called after the config is parsed */ int diameter_peer_init_real() { pid_list_t *i,*j; if (!config) { LM_ERR("diameter_peer_init_real(): Configuration was not parsed yet. Aborting...\n"); goto error; } log_dp_config(config); dp_first_pid = shm_malloc(sizeof(pid_t)); if (!dp_first_pid){ LOG_NO_MEM("shm",sizeof(pid_t)); goto error; } *dp_first_pid = getpid(); shutdownx = shm_malloc(sizeof(int)); if (!shutdownx){ LOG_NO_MEM("shm",sizeof(int)); goto error; } *shutdownx = 0; shutdownx_lock = lock_alloc(); if (!shutdownx_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } shutdownx_lock = lock_init(shutdownx_lock); handlers_lock = lock_alloc(); if (!handlers_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } handlers_lock = lock_init(handlers_lock); handlers = shm_malloc(sizeof(handler_list)); if (!handlers){ LOG_NO_MEM("shm",sizeof(handler_list)); goto error; } handlers->head=0; handlers->tail=0; /* init the pid list */ pid_list = shm_malloc(sizeof(pid_list_head_t)); if (!pid_list){ LOG_NO_MEM("shm",sizeof(pid_list_head_t)); goto error; } bzero(pid_list,sizeof(pid_list_head_t)); pid_list_lock = lock_alloc(); pid_list_lock = lock_init(pid_list_lock); /* init shared mem pointers before forking */ timer_cdp_init(); worker_init(); /* init the peer manager */ peer_manager_init(config); /* init diameter transactions */ cdp_trans_init(); /* init the session */ if (!cdp_sessions_init(config->sessions_hash_size)) goto error; /* add callback for messages - used to implement the API */ cb_add(api_callback,0); return 1; error: if (shutdownx) shm_free(shutdownx); if (config) free_dp_config(config); i = pid_list->head; while(i){ j = i->next; shm_free(i); i = j; } shm_free(pid_list); lock_get(pid_list_lock); lock_destroy(pid_list_lock); lock_dealloc((void*)pid_list_lock); return 0; }
/** * Initialize the CDiameterPeer from a configuration file. * The file is kept as dtd. See configdtd.h for the DTD and ConfigExample.xml. * @param cfg_filename - file with the configuration * @returns 1 on success, 0 on error */ int diameter_peer_init(char *cfg_filename) { pid_list_t *i,*j; config = parse_dp_config(cfg_filename); if (!config) { LOG(L_ERR,"ERROR:init_diameter_peer(): Error loading configuration file. Aborting...\n"); goto error; } log_dp_config(L_INFO,config); dp_first_pid = shm_malloc(sizeof(pid_t)); if (!dp_first_pid){ LOG_NO_MEM("shm",sizeof(pid_t)); goto error; } *dp_first_pid = getpid(); shutdownx = shm_malloc(sizeof(int)); if (!shutdownx){ LOG_NO_MEM("shm",sizeof(int)); goto error; } *shutdownx = 0; shutdownx_lock = lock_alloc(); if (!shutdownx_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } shutdownx_lock = lock_init(shutdownx_lock); handlers_lock = lock_alloc(); if (!handlers_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } handlers_lock = lock_init(handlers_lock); handlers = shm_malloc(sizeof(handler_list)); if (!handlers){ LOG_NO_MEM("shm",sizeof(handler_list)); goto error; } handlers->head=0; handlers->tail=0; /* init the pid list */ pid_list = shm_malloc(sizeof(pid_list_head_t)); pid_list_lock = lock_alloc(); pid_list_lock = lock_init(pid_list_lock); /* init shared mem pointers before forking */ timer_cdp_init(); worker_init(); /* init the peer manager */ peer_manager_init(config); /* init the msg_handler */ //msg_timer_init(); /* init the session */ if (!session_init()) goto error; #ifdef CDP_FOR_SER /* init diameter transactions */ trans_init(); /* add callback for messages - used to implement the API */ cb_add(api_callback,0); #endif /*********** Added by Vitalis to initialize the transactions **********/ /* init diameter transactions */ trans_init(); /* add callback for messages - used to implement the API */ cb_add(api_callback,0); /*******End of addition ***********/ return 1; error: if (shutdownx) shm_free(shutdownx); if (config) free_dp_config(config); i = pid_list->head; while(i){ j = i->next; shm_free(i); i = j; } shm_free(pid_list); lock_get(pid_list_lock); lock_destroy(pid_list_lock); lock_dealloc((void*)pid_list_lock); return 0; }