void free_udprelay() { struct ev_loop *loop = EV_DEFAULT; while (server_num-- > 0) { server_ctx_t *server_ctx = server_ctx_list[server_num]; #ifdef MODULE_LOCAL //SSR beg if (server_ctx->protocol_plugin) { server_ctx->protocol_plugin->dispose(server_ctx->protocol); server_ctx->protocol = NULL; free_obfs_class(server_ctx->protocol_plugin); server_ctx->protocol_plugin = NULL; } //SSR end #endif ev_io_stop(loop, &server_ctx->io); close(server_ctx->fd); cache_delete(server_ctx->conn_cache, 0); ss_free(server_ctx); server_ctx_list[server_num] = NULL; } }
static void free_server(server_t *server) { cork_dllist_remove(&server->entries); if (server->remote != NULL) { server->remote->server = NULL; } if (server->e_ctx != NULL) { cipher_context_release(&server->e_ctx->evp); free(server->e_ctx); } if (server->d_ctx != NULL) { cipher_context_release(&server->d_ctx->evp); free(server->d_ctx); } if (server->buf != NULL) { bfree(server->buf); free(server->buf); } // SSR beg if (server->obfs_plugin) { server->obfs_plugin->dispose(server->obfs); server->obfs = NULL; free_obfs_class(server->obfs_plugin); server->obfs_plugin = NULL; } if (server->protocol_plugin) { server->protocol_plugin->dispose(server->protocol); server->protocol = NULL; free_obfs_class(server->protocol_plugin); server->protocol_plugin = NULL; } // SSR end free(server->recv_ctx); free(server->send_ctx); free(server); }