コード例 #1
0
ファイル: diameter_peer.c プロジェクト: Jared-Prime/kamailio
/**
 * Start the CDiameterPeer operations.
 * It forks all the processes required.
 * @param blocking - if this is set, use the calling processes for the timer and never
 * return; else fork a new one for the timer and return
 * @returns 1 on success, 0 on error, never if blocking
 */
int diameter_peer_start(int blocking)
{
	int pid;
	int k=0;
	peer *p;

	/* fork workers */
	for(k=0;k<config->workers;k++){
		pid = fork_process(1001+k,"cdp_worker",1);
		if (pid==-1){
			LM_CRIT("init_diameter_peer(): Error on fork() for worker!\n");
			return 0;
		}
		if (pid==0) {
			srandom(time(0)*k);
			snprintf(pt[process_no].desc, MAX_PT_DESC,"cdp worker child=%d", k );
			if (cfg_child_init()) return 0;
			worker_process(k);
			LM_CRIT("init_diameter_peer(): worker_process finished without exit!\n");
			exit(-1);
		}else{
			dp_add_pid(pid);
		}
	}

	/* init the fd_exchange pipes */
	receiver_init(NULL);
	for(p = peer_list->head,k=0;p;p=p->next,k++)
		receiver_init(p);


	/* fork receiver for unknown peers */

	pid = fork_process(1001+k,"cdp_receiver_peer_unkown",1);

	if (pid==-1){
		LM_CRIT("init_diameter_peer(): Error on fork() for unknown peer receiver!\n");
		return 0;
	}
	if (pid==0) {
		srandom(time(0)*k);
		snprintf(pt[process_no].desc, MAX_PT_DESC,
				"cdp receiver peer unknown");
		if (cfg_child_init()) return 0;
		receiver_process(NULL);
		LM_CRIT("init_diameter_peer(): receiver_process finished without exit!\n");
		exit(-1);
	}else{
		dp_add_pid(pid);
	}

	/* fork receivers for each pre-configured peers */
	lock_get(peer_list_lock);
	for(p = peer_list->head,k=-1;p;p = p->next,k--){
		pid = fork_process(1001+k,"cdp_receiver_peer",1);
		if (pid==-1){
			LM_CRIT("init_diameter_peer(): Error on fork() for peer receiver!\n");
			return 0;
		}
		if (pid==0) {
			srandom(time(0)*k);
				snprintf(pt[process_no].desc, MAX_PT_DESC,
					"cdp_receiver_peer=%.*s", p->fqdn.len,p->fqdn.s );
			if (cfg_child_init()) return 0;
			receiver_process(p);
			LM_CRIT("init_diameter_peer(): receiver_process finished without exit!\n");
			exit(-1);
		}else{
			dp_add_pid(pid);
		}
	}
	lock_release(peer_list_lock);


	/* Fork the acceptor process (after receivers, so it inherits all the right sockets) */
	pid = fork_process(1000,"cdp_acceptor",1);

	if (pid==-1){
		LM_CRIT("init_diameter_peer(): Error on fork() for acceptor!\n");
		return 0;
	}
	if (pid==0) {
		if (cfg_child_init()) return 0;
		acceptor_process(config);
		LM_CRIT("init_diameter_peer(): acceptor_process finished without exit!\n");
		exit(-1);
	}else{
		dp_add_pid(pid);
	}

	/* fork/become timer */
	if (blocking) {
		dp_add_pid(getpid());
		if (cfg_child_init()) return 0;
		timer_process(1);
	}
	else{
		pid = fork_process(1001,"cdp_timer",1);
		if (pid==-1){
			LM_CRIT("init_diameter_peer(): Error on fork() for timer!\n");
			return 0;
		}
		if (pid==0) {
			if (cfg_child_init()) return 0;
			timer_process(0);
			LM_CRIT("init_diameter_peer(): timer_process finished without exit!\n");
			exit(-1);
		}else{
			dp_add_pid(pid);
		}
	}

	return 1;
}
コード例 #2
0
/**
 * Start the CDiameterPeer operations.
 * It forks all the processes required.
 * @param blocking - if this is set, use the calling processes for the timer and never 
 * return; else fork a new one for the timer and return
 * @returns 1 on success, 0 on error, never if blocking
 */ 
int diameter_peer_start(int blocking)
{
	int pid;
	int k=0;


	
	/* Fork the acceptor process */
	#ifdef CDP_FOR_SER		
		pid = fork_process(1000,"cdp_acceptor",1);
	#else
		pid = fork();
	#endif
	
	if (pid==-1){
		LOG(L_CRIT,"ERROR:init_diameter_peer(): Error on fork() for acceptor!\n");
		return 0;
	}
	
	if (pid==0) {
		acceptor_process(config);
		LOG(L_CRIT,"ERROR:init_diameter_peer(): acceptor_process finished without exit!\n");
		exit(-1);		
	}else{
		dp_add_pid(pid);
	}

	/* fork workers */
	for(k=0;k<config->workers;k++){
		#ifdef CDP_FOR_SER		
			pid = fork_process(1001+k,"cdp_worker",1);
		#else
			pid = fork();
		#endif
		if (pid==-1){
			LOG(L_CRIT,"ERROR:init_diameter_peer(): Error on fork() for worker!\n");
			return 0;
		}
		if (pid==0) {
			srandom(time(0)*k);
			#ifdef CDP_FOR_SER
				snprintf(pt[process_no].desc, MAX_PT_DESC,
					"cdp worker child=%d", k );
			#endif	
			worker_process(k);
			LOG(L_CRIT,"ERROR:init_diameter_peer(): worker_process finished without exit!\n");
			exit(-1);		
		}else{
			dp_add_pid(pid);
		}
	}
				
	/* fork/become timer */
	if (blocking) {
		dp_add_pid(getpid());
		timer_process(1);
		
	}		
	else{		
		
		#ifdef CDP_FOR_SER		
			pid = fork_process(1001,"cdp_timer",1);
		#else
			pid = fork();
		#endif
		if (pid==-1){
			LOG(L_CRIT,"ERROR:init_diameter_peer(): Error on fork() for timer!\n");
			return 0;
		}
		if (pid==0) {
			timer_process(0);
			LOG(L_CRIT,"ERROR:init_diameter_peer(): timer_process finished without exit!\n");
			exit(-1);		
		}else{			
			dp_add_pid(pid);
		}
	}
	
	return 1;
}