Index: code/server/server.h =================================================================== --- code/server/server.h (revision 1499) +++ code/server/server.h (working copy) @@ -257,6 +257,7 @@ extern cvar_t *sv_timeout; extern cvar_t *sv_zombietime; extern cvar_t *sv_rconPassword; +extern cvar_t *sv_rconLog; extern cvar_t *sv_privatePassword; extern cvar_t *sv_allowDownload; extern cvar_t *sv_maxclients; Index: code/server/sv_init.c =================================================================== --- code/server/sv_init.c (revision 1499) +++ code/server/sv_init.c (working copy) @@ -665,6 +665,7 @@ // server vars sv_rconPassword = Cvar_Get ("rconPassword", "", CVAR_TEMP ); + sv_rconLog = Cvar_Get ("sv_rconLog", "", CVAR_ARCHIVE ); sv_privatePassword = Cvar_Get ("sv_privatePassword", "", CVAR_TEMP ); sv_fps = Cvar_Get ("sv_fps", "20", CVAR_TEMP ); sv_timeout = Cvar_Get ("sv_timeout", "200", CVAR_TEMP ); Index: code/server/sv_main.c =================================================================== --- code/server/sv_main.c (revision 1499) +++ code/server/sv_main.c (working copy) @@ -34,6 +34,7 @@ cvar_t *sv_timeout; // seconds without any message cvar_t *sv_zombietime; // seconds to sink messages after disconnect cvar_t *sv_rconPassword; // password for remote server commands +cvar_t *sv_rconLog; // log file for remote server commands cvar_t *sv_privatePassword; // password for the privateClient slots cvar_t *sv_allowDownload; cvar_t *sv_maxclients; @@ -463,6 +464,7 @@ char sv_outputbuf[SV_OUTPUTBUF_LENGTH]; static unsigned int lasttime = 0; char *cmd_aux; + fileHandle_t rconLog = 0; // TTimo - https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=534 time = Com_Milliseconds(); @@ -471,15 +473,34 @@ } lasttime = time; + if(strlen(sv_rconLog->string)) { + rconLog = FS_FOpenFileAppend(sv_rconLog->string); + if (!rconLog) { + Com_Printf("Warning: Unable to open sv_rconLog: \"%s\"", sv_rconLog->string); + Cvar_Set ("sv_rconLog", ""); + } + } + + const char *message = ""; if ( !strlen( sv_rconPassword->string ) || strcmp (Cmd_Argv(1), sv_rconPassword->string) ) { valid = qfalse; - Com_Printf ("Bad rcon from %s:\n%s\n", NET_AdrToString (from), Cmd_Argv(2) ); + message = va("Bad rcon from %s: %s\n", NET_AdrToString (from), Cmd_ArgsFrom(2)); } else { valid = qtrue; - Com_Printf ("Rcon from %s:\n%s\n", NET_AdrToString (from), Cmd_Argv(2) ); + message = va("Rcon from %s: %s\n", NET_AdrToString (from), Cmd_ArgsFrom(2)); } + Com_Printf (message); + if (rconLog) { + qtime_t qt; + Com_RealTime(&qt); + char *timestamp = va( "%02i/%02i/%02i %02i:%02i:%02i ", qt.tm_mday, qt.tm_mon, qt.tm_year-100, qt.tm_hour, qt.tm_min, qt.tm_sec ); + FS_Write(timestamp, strlen(timestamp), rconLog); + FS_Write(message, strlen(message), rconLog); + FS_FCloseFile(rconLog); + } + // start redirecting all print outputs to the packet svs.redirectAddress = from; Com_BeginRedirect (sv_outputbuf, SV_OUTPUTBUF_LENGTH, SV_FlushRedirect);