diff --git a/gateway.c b/gateway.c index c8731d79..e3aaa8c7 100644 --- a/gateway.c +++ b/gateway.c @@ -55,6 +55,11 @@ struct uwsgi_gateway *register_gateway(char *name, void (*loop)(void)) { if (!uwsgi.master_process) { if (gw_pid > 0) { +#ifdef __linux__ + if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0,0,0)) { + uwsgi_error("prctl()"); + } +#endif loop(); // never here !!! (i hope) exit(1); @@ -101,6 +106,11 @@ void gateway_respawn(int id) { if (gw_pid == 0) { if (uwsgi.master_as_root) uwsgi_as_root(); +#ifdef __linux__ + if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0,0,0)) { + uwsgi_error("prctl()"); + } +#endif ug->loop(); // never here !!! (i hope) exit(1); diff --git a/socket.c b/socket.c index 2b441613..7b1d6ef8 100644 --- a/socket.c +++ b/socket.c @@ -10,20 +10,20 @@ int bind_to_unix(char *socket_name, int listen_queue, int chmod_socket, int abst // leave 1 byte for abstract namespace (108 linux -> 104 bsd/mac) if (strlen(socket_name) > 102) { uwsgi_log( "invalid socket name\n"); - exit(1); + uwsgi_nuclear_blast(); } uws_addr = malloc(sizeof(struct sockaddr_un)); if (uws_addr == NULL) { uwsgi_error("malloc()"); - exit(1); + uwsgi_nuclear_blast(); } memset(uws_addr, 0, sizeof(struct sockaddr_un)); serverfd = socket(AF_UNIX, SOCK_STREAM, 0); if (serverfd < 0) { uwsgi_error("socket()"); - exit(1); + uwsgi_nuclear_blast(); } if (abstract_socket == 0) { if (unlink(socket_name) != 0 && errno != ENOENT) { @@ -44,13 +44,13 @@ int bind_to_unix(char *socket_name, int listen_queue, int chmod_socket, int abst if (bind(serverfd, (struct sockaddr *) uws_addr, strlen(socket_name) + abstract_socket + ((void *) uws_addr->sun_path - (void *) uws_addr)) != 0) { #endif uwsgi_error("bind()"); - exit(1); + uwsgi_nuclear_blast(); } if (listen(serverfd, listen_queue) != 0) { uwsgi_error("listen()"); - exit(1); + uwsgi_nuclear_blast(); } // chmod unix socket for lazy users @@ -104,7 +104,7 @@ int bind_to_unix(char *socket_name, int listen_queue, int chmod_socket, int abst serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (serverfd < 0) { uwsgi_error("socket()"); - exit(1); + uwsgi_nuclear_blast(); } uwsgi_log( "binding on %d SCTP interfaces on port: %d\n", num_ip, ntohs(uws_addr[0].sin_port)); @@ -112,7 +112,7 @@ int bind_to_unix(char *socket_name, int listen_queue, int chmod_socket, int abst if (sctp_bindx(serverfd, (struct sockaddr *) uws_addr, num_ip, SCTP_BINDX_ADD_ADDR) != 0) { uwsgi_error("sctp_bindx()"); - exit(1); + uwsgi_nuclear_blast(); } sctp_im.sinit_max_instreams = 0xFFFF; @@ -124,7 +124,7 @@ int bind_to_unix(char *socket_name, int listen_queue, int chmod_socket, int abst if (listen(serverfd, listen_queue) != 0) { uwsgi_error("listen()"); - exit(1); + uwsgi_nuclear_blast(); } return serverfd; @@ -328,7 +328,7 @@ char *generate_socket_name(char *socket_name) { struct ifaddrs *ifap = NULL, *ifa, *ifaf; if (getifaddrs(&ifap)) { uwsgi_error("getifaddrs()"); - exit(1); + uwsgi_nuclear_blast(); } // here socket_name will be truncated @@ -359,7 +359,7 @@ char *generate_socket_name(char *socket_name) { } uwsgi_log("unable to find avalid socket address\n"); - exit(1); + uwsgi_nuclear_blast(); } return socket_name ; } @@ -381,7 +381,7 @@ int bind_to_tcp(char *socket_name, int listen_queue, char *tcp_port) { serverfd = socket(AF_INET, SOCK_STREAM, 0); if (serverfd < 0) { uwsgi_error("socket()"); - exit(1); + uwsgi_nuclear_blast(); } if (socket_name[0] == 0) { @@ -394,7 +394,7 @@ int bind_to_tcp(char *socket_name, int listen_queue, char *tcp_port) { if (setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (const void *) &reuse, sizeof(int)) < 0) { uwsgi_error("setsockopt()"); - exit(1); + uwsgi_nuclear_blast(); } if (!uwsgi.no_defer_accept) { @@ -421,12 +421,12 @@ int bind_to_tcp(char *socket_name, int listen_queue, char *tcp_port) { uwsgi_log("probably another instance of uWSGI is running on the same address.\n"); } uwsgi_error("bind()"); - exit(1); + uwsgi_nuclear_blast(); } if (listen(serverfd, listen_queue) != 0) { uwsgi_error("listen()"); - exit(1); + uwsgi_nuclear_blast(); } diff --git a/uwsgi.c b/uwsgi.c index d0cf6c15..97df5f94 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -263,6 +263,20 @@ void grace_them_all() } +void uwsgi_nuclear_blast() { + + if (!uwsgi.workers) { + reap_them_all(); + } + else if (uwsgi.master_process) { + if (getpid() == uwsgi.workers[0].pid) { + reap_them_all(); + } + } + + exit(1); +} + void reap_them_all() { int i; @@ -278,6 +292,8 @@ void reap_them_all() kill(uwsgi.gateways[i].pid, SIGKILL); } + if (!uwsgi.workers) return; + uwsgi_log("...brutally killing workers...\n"); for (i = 1; i <= uwsgi.numproc; i++) { if (uwsgi.workers[i].pid > 0) diff --git a/uwsgi.h b/uwsgi.h index 52888054..2d76bb09 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1582,3 +1582,5 @@ struct uwsgi_rb_timer *uwsgi_add_rb_timer(struct rb_root *, time_t, void *); struct uwsgi_rb_timer *uwsgi_min_rb_timer(struct rb_root *); #endif + +void uwsgi_nuclear_blast();