void SV_CloseAttackLog() { if (attHandle > 0) { SV_WriteAttackLog("-------------------------------------------------------------------------------\n"); SV_WriteAttackLog("End server attack log\n"); SV_WriteAttackLog("-------------------------------------------------------------------------------\n"); Com_Printf("Server attack log closed.\n"); } FS_FCloseFile(attHandle); attHandle = 0; // local handle }
void SV_InitAttackLog() { if (sv_protectLog->string[0] == '\0') { Com_Printf("Not logging server attacks to disk.\n"); } else { // in sync so admins can check this at runtime FS_FOpenFileByMode(sv_protectLog->string, &attHandle, FS_APPEND_SYNC); if (attHandle <= 0) { Com_Printf("WARNING: Couldn't open server attack logfile %s\n", sv_protectLog->string); } else { Com_Printf("Logging server attacks to %s\n", sv_protectLog->string); SV_WriteAttackLog("-------------------------------------------------------------------------------\n"); SV_WriteAttackLog("Start server attack log\n"); SV_WriteAttackLog("-------------------------------------------------------------------------------\n"); } } }
/** * @brief Sends a reliable command string to be interpreted by the client game * module: "cp", "print", "chat", etc * * A NULL client will broadcast to all clients */ void QDECL SV_SendServerCommand(client_t *cl, const char *fmt, ...) { va_list argptr; byte message[MAX_MSGLEN]; client_t *client; int j; va_start(argptr, fmt); Q_vsnprintf((char *)message, sizeof(message), fmt, argptr); va_end(argptr); // do not forward server command messages that would be too big to clients // ( q3infoboom / q3msgboom stuff ) // see http://aluigi.altervista.org/adv/q3msgboom-adv.txt if (strlen((char *)message) > 1022) { SV_WriteAttackLog("Warning: q3infoboom/q3msgboom exploit attack.\n"); // FIXME: add client slot return; } if (cl != NULL) { SV_AddServerCommand(cl, (char *)message); return; } // hack to echo broadcast prints to console if (com_dedicated->integer && !strncmp((char *)message, "print", 5)) { Com_Printf("broadcast: %s\n", SV_ExpandNewlines((char *)message)); } // send the data to all relevent clients for (j = 0, client = svs.clients; j < sv_maxclients->integer ; j++, client++) { if (client->state < CS_PRIMED) { continue; } // don't need to send messages to AI if (client->gentity && (client->gentity->r.svFlags & SVF_BOT)) { continue; } SV_AddServerCommand(client, (char *)message); } }