/* starts the tcp processes */ int tcp_init_children() { int r; int sockfd[2]; int reader_fd[2]; /* for comm. with the tcp children read */ pid_t pid; /* create the tcp sock_info structures */ /* copy the sockets --moved to main_loop*/ /* fork children & create the socket pairs*/ for(r=0; r<tcp_children_no; r++){ if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd)<0){ LOG(L_ERR, "ERROR: tcp_main: socketpair failed: %s\n", strerror(errno)); goto error; } if (socketpair(AF_UNIX, SOCK_STREAM, 0, reader_fd)<0){ LOG(L_ERR, "ERROR: tcp_main: socketpair failed: %s\n", strerror(errno)); goto error; } process_no++; pid=fork(); if (pid<0){ LOG(L_ERR, "ERROR: tcp_main: fork failed: %s\n", strerror(errno)); goto error; }else if (pid>0){ /* parent */ close(sockfd[1]); close(reader_fd[1]); tcp_children[r].pid=pid; tcp_children[r].proc_no=process_no; tcp_children[r].busy=0; tcp_children[r].n_reqs=0; tcp_children[r].unix_sock=reader_fd[0]; pt[process_no].pid=pid; pt[process_no].unix_sock=sockfd[0]; pt[process_no].idx=r; strncpy(pt[process_no].desc, "tcp receiver", MAX_PT_DESC); }else{ /* child */ close(sockfd[0]); unix_tcp_sock=sockfd[1]; bind_address=0; /* force a SEGFAULT if someone uses a non-init. bind address on tcp */ if (init_child(r+children_no+1) < 0) { LOG(L_ERR, "init_children failed\n"); goto error; } tcp_receive_loop(reader_fd[1]); } } return 0; error: return -1; }
/*! \brief starts the tcp processes */ int tcp_init_children(int *chd_rank) { int r; //int sockfd[2]; int reader_fd[2]; /* for comm. with the tcp children read */ pid_t pid; struct socket_info *si; atomic_t *load_p; /* estimate max fd. no: * 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++); #ifdef USE_TLS if (! tls_disable) for (si=tls_listen; si; si=si->next, r++); #endif tcp_max_fd_no=counted_processes*2 +r-1 /* timer */ +3; /* stdin/out/err*/ tcp_max_fd_no+=tcp_max_connections; /* create the tcp sock_info structures */ /* copy the sockets --moved to main_loop*/ load_p = shm_malloc(sizeof(atomic_t)); if (!load_p) goto error; memset(load_p,0,sizeof(atomic_t)); register_tcp_load_stat(load_p); /* fork children & create the socket pairs*/ for(r=0; r<tcp_children_no; r++){ /*if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd)<0){ LM_ERR("socketpair failed: %s\n", strerror(errno)); goto error; }*/ if (socketpair(AF_UNIX, SOCK_STREAM, 0, reader_fd)<0){ LM_ERR("socketpair failed: %s\n", strerror(errno)); goto error; } (*chd_rank)++; pid=internal_fork("SIP receiver TCP"); if (pid<0){ LM_ERR("fork failed\n"); goto error; }else if (pid>0){ /* parent */ close(reader_fd[1]); tcp_children[r].pid=pid; tcp_children[r].proc_no=process_no; tcp_children[r].busy=0; tcp_children[r].n_reqs=0; tcp_children[r].unix_sock=reader_fd[0]; }else{ /* child */ set_proc_attrs("TCP receiver"); pt[process_no].idx=r; pt[process_no].load = load_p; bind_address=0; /* force a SEGFAULT if someone uses a non-init. bind address on tcp */ if (init_child(*chd_rank) < 0) { LM_ERR("init_children failed\n"); exit(-1); } tcp_receive_loop(reader_fd[1]); exit(-1); } } return 0; error: return -1; }
int main(int argv, char** argc ) { printf("starting tests\n"); tcp_receive_loop(); }