static void signal_cb(uv_signal_t *handle, int signum) { if (signum == SIGINT || signum == SIGQUIT) { char *name = signum == SIGINT ? "SIGINT" : "SIGQUIT"; logger_log(LOG_INFO, "Received %s, scheduling shutdown...", name); close_signal(); if (concurrency > 1) { struct server_context *servers = handle->data; for (int i = 0; i < concurrency; i++) { struct server_context *server = &servers[i]; uv_async_send(&server->async_handle); } } else { struct server_context *ctx = handle->data; uv_close((uv_handle_t *)&ctx->tcp, NULL); udprelay_close(ctx); } } if (signum == SIGTERM) { logger_log(LOG_INFO, "Received SIGTERM, scheduling shutdown..."); if (daemon_mode) { delete_pidfile(pidfile); } exit(0); } }
static void consumer_close(uv_async_t *handle) { struct server_context *server = container_of(handle, struct server_context, async_handle); uv_close((uv_handle_t*) &server->tcp, NULL); uv_close((uv_handle_t*) &server->async_handle, NULL); if (server->udprelay) { udprelay_close(server); } if (server->nameserver_num >= 0) { struct resolver_context *res = handle->loop->data; resolver_shutdown(res); } }