all: updated FSF address in GPL text
[sip-router] / modules / cdp / acceptor.c
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2012 Smile Communications, jason.penton@smilecoms.com
5  * Copyright (C) 2012 Smile Communications, richard.good@smilecoms.com
6  * 
7  * The initial version of this code was written by Dragos Vingarzan
8  * (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
9  * Fruanhofer Institute. It was and still is maintained in a separate
10  * branch of the original SER. We are therefore migrating it to
11  * Kamailio/SR and look forward to maintaining it from here on out.
12  * 2011/2012 Smile Communications, Pty. Ltd.
13  * ported/maintained/improved by 
14  * Jason Penton (jason(dot)penton(at)smilecoms.com and
15  * Richard Good (richard(dot)good(at)smilecoms.com) as part of an 
16  * effort to add full IMS support to Kamailio/SR using a new and
17  * improved architecture
18  * 
19  * NB: Alot of this code was originally part of OpenIMSCore,
20  * FhG Fokus. 
21  * Copyright (C) 2004-2006 FhG Fokus
22  * Thanks for great work! This is an effort to 
23  * break apart the various CSCF functions into logically separate
24  * components. We hope this will drive wider use. We also feel
25  * that in this way the architecture is more complete and thereby easier
26  * to manage in the Kamailio/SR environment
27  *
28  * This file is part of Kamailio, a free SIP server.
29  *
30  * Kamailio is free software; you can redistribute it and/or modify
31  * it under the terms of the GNU General Public License as published by
32  * the Free Software Foundation; either version 2 of the License, or
33  * (at your option) any later version
34  *
35  * Kamailio is distributed in the hope that it will be useful,
36  * but WITHOUT ANY WARRANTY; without even the implied warranty of
37  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38  * GNU General Public License for more details.
39  *
40  * You should have received a copy of the GNU General Public License 
41  * along with this program; if not, write to the Free Software 
42  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
43  * 
44  */
45
46 #include <unistd.h>
47 #include <errno.h>
48 #include <string.h>
49 #include <assert.h>
50 #include <sys/time.h>
51 #include <sys/types.h>
52 #include <sys/socket.h>
53 #include <sys/ioctl.h>
54 #include <signal.h>
55 #include <netinet/in.h>
56 #include <netdb.h>
57 #include <stdlib.h>
58
59 #include "acceptor.h"
60 #include "utils.h"
61 #include "globals.h"
62 #include "tcp_accept.h"
63 #include "config.h"
64 #include "worker.h"
65
66
67 /* defined in ../diameter_peer.c */
68 int dp_add_pid(pid_t pid);
69 void dp_del_pid(pid_t pid);
70
71 /**
72  * Called from diameter_peer_start, after a process was forked for this.
73  * - opens the listening sockets and binds them to the addresses.
74  * @param cfg - the dp_config file, which contains the list of acceptors
75  * @returns - never. As this is forked, when finished it is expected to exit on itself.
76  */
77 void acceptor_process(dp_config *cfg)
78 {
79         int i,k;
80         unsigned int sock;
81         
82         LM_INFO("Acceptor process starting up...\n");
83         listening_socks = pkg_malloc((cfg->acceptors_cnt+1)*sizeof(int));
84         if (!listening_socks){
85                 LOG_NO_MEM("pkg",(cfg->acceptors_cnt+1)*sizeof(int));
86                 goto done;
87         }
88         memset(listening_socks,0,(cfg->acceptors_cnt+1)*sizeof(int));   
89         k=0;
90         for(i=0;i<cfg->acceptors_cnt;i++)
91                 if (create_socket(cfg->acceptors[i].port,cfg->acceptors[i].bind,&sock)){
92                         listening_socks[k++]=sock;                      
93                 }       
94
95         
96         LM_INFO("Acceptor opened sockets. Entering accept loop ...\n");         
97         accept_loop();
98
99         for(i=0;listening_socks[i];i++)
100                 close(listening_socks[i]);
101         
102         if (listening_socks) pkg_free(listening_socks);
103 #ifdef CDP_FOR_SER
104 #else
105 #ifdef PKG_MALLOC
106         #ifdef PKG_MALLOC
107                 LM_DBG("Acceptor Memory status (pkg):\n");
108                 //pkg_status();
109                 #ifdef pkg_sums
110                         pkg_sums();
111                 #endif 
112         #endif
113 #endif
114                 dp_del_pid(getpid());           
115 #endif          
116 done:           
117         LM_INFO("Acceptor process finished\n");
118         exit(0);
119 }