diff --git a/src/core/tcp_init.h b/src/core/tcp_init.h index ddabbc5fce4..70a193a0e27 100644 --- a/src/core/tcp_init.h +++ b/src/core/tcp_init.h @@ -13,8 +13,8 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -54,7 +54,7 @@ struct tcp_child{ int init_tcp(void); void destroy_tcp(void); int tcp_init(struct socket_info* sock_info); -int tcp_init_children(void); +int tcp_init_children(int *woneinit); void tcp_main_loop(void); void tcp_receive_loop(int unix_sock); int tcp_fix_child_sockets(int* fd); diff --git a/src/core/tcp_main.c b/src/core/tcp_main.c index aecf3a88c15..1fda94ec27b 100644 --- a/src/core/tcp_main.c +++ b/src/core/tcp_main.c @@ -5034,16 +5034,16 @@ int tcp_fix_child_sockets(int* fd) /* starts the tcp processes */ -int tcp_init_children() +int tcp_init_children(int *woneinit) { int r, i; int reader_fd_1; /* for comm. with the tcp children read */ pid_t pid; char si_desc[MAX_PT_DESC]; struct socket_info *si; - + /* estimate max fd. no: - * 1 tcp send unix socket/all_proc, + * 1 tcp send unix socket/all_proc, * + 1 udp sock/udp proc + 1 tcp_child sock/tcp child* * + no_listen_tcp */ for(r=0, si=tcp_listen; si; si=si->next, r++); @@ -5051,12 +5051,12 @@ int tcp_init_children() if (! tls_disable) for (si=tls_listen; si; si=si->next, r++); #endif - + register_fds(r+tcp_max_connections+get_max_procs()-1 /* tcp main */); #if 0 tcp_max_fd_no=get_max_procs()*2 +r-1 /* timer */ +3; /* stdin/out/err*/ /* max connections can be temporarily exceeded with estimated_process_count - * - tcp_main (tcpconn_connect called simultaneously in all all the + * - tcp_main (tcpconn_connect called simultaneously in all all the * processes) */ tcp_max_fd_no+=tcp_max_connections+get_max_procs()-1 /* tcp main */; #endif @@ -5095,7 +5095,7 @@ int tcp_init_children() /* create the tcp sock_info structures */ /* copy the sockets --moved to main_loop*/ - + /* fork children & create the socket pairs*/ for(r=0; r0){ /* parent */ + *woneinit = 1; }else{ /* child */ bind_address=0; /* force a SEGFAULT if someone uses a non-init. bind address on tcp */ + if(*woneinit==0) { + if(run_child_one_init_route()<0) + goto error; + } + tcp_receive_loop(reader_fd_1); } } diff --git a/src/main.c b/src/main.c index 6f8b354d223..e9d66ed4498 100644 --- a/src/main.c +++ b/src/main.c @@ -1720,8 +1720,14 @@ int main_loop(void) /* child */ bind_address=si; /* shortcut */ + if(woneinit==0) { + if(run_child_one_init_route()<0) + goto error; + } + return sctp_core_rcv_loop(); } + woneinit = 1; } /*parent*/ /*close(sctp_sock)*/; /*if closed=>sendto invalid fd errors?*/ @@ -1777,7 +1783,7 @@ int main_loop(void) #ifdef USE_TCP if (!tcp_disable){ /* start tcp & tls receivers */ - if (tcp_init_children()<0) goto error; + if (tcp_init_children(&woneinit)<0) goto error; /* start tcp+tls main attendant proc */ pid = fork_process(PROC_TCP_MAIN, "tcp main process", 0); if (pid<0){