/** * @brief Callback for subsystem failures. Depending on the severity, we may try to * recover, or we may shut the entire engine down and exit. */ static void Error(err_t err, const char *msg) { if (quetoo.debug_mask & DEBUG_BREAKPOINT) { SDL_TriggerBreakpoint(); } Print(va("^1%s\n", msg)); if (err == ERROR_DROP && !jmp_set) { err = ERROR_FATAL; } switch (err) { case ERROR_DROP: Sv_ShutdownServer(msg); Cl_Disconnect(); quetoo.recursive_error = false; longjmp(env, err); break; case ERROR_FATAL: default: Sys_Backtrace(); Shutdown(msg); exit(err); break; } }
/* * Sv_Shutdown * * Called when server is shutting down due to error or an explicit `quit`. */ void Sv_Shutdown(const char *msg) { Sv_ShutdownServer(msg); Sv_ShutdownMasters(); Net_Config(NS_SERVER, false); Sb_Init(&net_message, net_message_buffer, sizeof(net_message_buffer)); memset(&svs, 0, sizeof(svs)); }
/* * @brief Called when server is shutting down due to error or an explicit `quit`. */ void Sv_Shutdown(const char *msg) { Sv_ShutdownServer(msg); Sv_ShutdownConsole(); memset(&svs, 0, sizeof(svs)); Cmd_RemoveAll(CMD_SERVER); Mem_FreeTag(MEM_TAG_SERVER); }
/* * @brief Called when server is shutting down due to error or an explicit `quit`. */ void Sv_Shutdown(const char *msg) { Sv_ShutdownServer(msg); Sv_ShutdownMasters(); Net_Config(NS_UDP_SERVER, false); Mem_InitBuffer(&net_message, net_message_buffer, sizeof(net_message_buffer)); memset(&svs, 0, sizeof(svs)); Cmd_RemoveAll(CMD_SERVER); Mem_FreeTag(MEM_TAG_SERVER); }
/* * @brief */ static void Cl_Connect_f(void) { if (Cmd_Argc() != 2) { Com_Print("Usage: %s <address>\n", Cmd_Argv(0)); return; } if (Com_WasInit(QUETOO_SERVER)) { // if running a local server, kill it Sv_ShutdownServer("Server quit\n"); } Cl_Disconnect(); strncpy(cls.server_name, Cmd_Argv(1), sizeof(cls.server_name)); cls.server_name[sizeof(cls.server_name) - 1] = '\0'; cls.state = CL_CONNECTING; cls.connect_time = 0; // fire immediately }