diff --git a/engine/common/common.h b/engine/common/common.h index 45b1d19c..5de2ab6f 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -793,7 +793,7 @@ void VID_Init( void ); void UI_SetActiveMenu( qboolean fActive ); void UI_ShowConnectionWarning( void ); void Cmd_Null_f( void ); -void Rcon_Print( const char *pMsg ); +void Rcon_Print( host_redirect_t *rd, const char *pMsg ); qboolean COM_ParseVector( char **pfile, float *v, size_t size ); void COM_NormalizeAngles( vec3_t angles ); int COM_FileSize( const char *filename ); diff --git a/engine/common/system.c b/engine/common/system.c index 717861f2..f04a2d74 100644 --- a/engine/common/system.c +++ b/engine/common/system.c @@ -562,7 +562,7 @@ void Sys_Print( const char *pMsg ) Sys_PrintLog( pMsg ); - Rcon_Print( pMsg ); + Rcon_Print( &host.rd, pMsg ); } /* diff --git a/engine/server/server.h b/engine/server/server.h index aa05c6d5..b7f40ff7 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -564,7 +564,7 @@ qboolean SV_IsPlayerIndex( int idx ); int SV_CalcPing( sv_client_t *cl ); void SV_InitClientMove( void ); void SV_UpdateServerInfo( void ); -void SV_EndRedirect( void ); +void SV_EndRedirect( host_redirect_t *rd ); void SV_RejectConnection( netadr_t from, const char *fmt, ... ) _format( 2 ); void SV_GetPlayerCount( int *clients, int *bots ); diff --git a/engine/server/sv_client.c b/engine/server/sv_client.c index 3ea5e1e6..b947362e 100644 --- a/engine/server/sv_client.c +++ b/engine/server/sv_client.c @@ -639,7 +639,7 @@ void SV_DropClient( sv_client_t *cl, qboolean crash ) cl->frames = NULL; if( NET_CompareBaseAdr( cl->netchan.remote_address, host.rd.address )) - SV_EndRedirect(); + SV_EndRedirect( &host.rd ); // throw away any residual garbage in the channel. Netchan_Clear( &cl->netchan ); @@ -676,22 +676,19 @@ SVC COMMAND REDIRECT ============================================================================== */ -void SV_BeginRedirect( netadr_t adr, rdtype_t target, char *buffer, size_t buffersize, void (*flush)) +static void SV_BeginRedirect( host_redirect_t *rd, netadr_t adr, rdtype_t target, char *buffer, size_t buffersize, void (*flush)) { - if( !target || !buffer || !buffersize || !flush ) - return; - - host.rd.target = target; - host.rd.buffer = buffer; - host.rd.buffersize = buffersize; - host.rd.flush = flush; - host.rd.address = adr; - host.rd.buffer[0] = 0; - if( host.rd.lines == 0 ) - host.rd.lines = -1; + rd->target = target; + rd->buffer = buffer; + rd->buffersize = buffersize; + rd->flush = flush; + rd->address = adr; + rd->buffer[0] = 0; + if( rd->lines == 0 ) + rd->lines = -1; } -void SV_FlushRedirect( netadr_t adr, int dest, char *buf ) +static void SV_FlushRedirect( netadr_t adr, int dest, char *buf ) { if( sv.current_client && FBitSet( sv.current_client->flags, FCL_FAKECLIENT )) return; @@ -712,18 +709,18 @@ void SV_FlushRedirect( netadr_t adr, int dest, char *buf ) } } -void SV_EndRedirect( void ) +void SV_EndRedirect( host_redirect_t *rd ) { - if( host.rd.lines > 0 ) + if( rd->lines > 0 ) return; - if( host.rd.flush ) - host.rd.flush( host.rd.address, host.rd.target, host.rd.buffer ); + if( rd->flush ) + rd->flush( rd->address, rd->target, rd->buffer ); - host.rd.target = 0; - host.rd.buffer = NULL; - host.rd.buffersize = 0; - host.rd.flush = NULL; + rd->target = RD_NONE; + rd->buffer = NULL; + rd->buffersize = 0; + rd->flush = NULL; } /* @@ -733,24 +730,26 @@ Rcon_Print Print message to rcon buffer and send to rcon redirect target ================ */ -void Rcon_Print( const char *pMsg ) +void Rcon_Print( host_redirect_t *rd, const char *pMsg ) { - if( host.rd.target && host.rd.lines && host.rd.flush && host.rd.buffer ) + size_t len; + + if( !rd->target || !rd->lines || !rd->flush || !rd->buffer ) + return; + + len = Q_strncat( rd->buffer, pMsg, rd->buffersize ); + + if( len && rd->buffer[len - 1] == '\n' ) { - size_t len = Q_strncat( host.rd.buffer, pMsg, host.rd.buffersize ); + rd->flush( rd->address, rd->target, rd->buffer ); - if( len && host.rd.buffer[len-1] == '\n' ) - { - host.rd.flush( host.rd.address, host.rd.target, host.rd.buffer ); + if( rd->lines > 0 ) + rd->lines--; - if( host.rd.lines > 0 ) - host.rd.lines--; + rd->buffer[0] = 0; - host.rd.buffer[0] = 0; - - if( !host.rd.lines ) - Msg( "End of redirection!\n" ); - } + if( !rd->lines ) + Msg( "End of redirection!\n" ); } } @@ -1090,7 +1089,7 @@ void SV_RemoteCommand( netadr_t from, sizebuf_t *msg ) if( Rcon_Validate( )) { - SV_BeginRedirect( from, RD_PACKET, outputbuf, sizeof( outputbuf ) - 16, SV_FlushRedirect ); + SV_BeginRedirect( &host.rd, from, RD_PACKET, outputbuf, sizeof( outputbuf ) - 16, SV_FlushRedirect ); remaining[0] = 0; for( i = 2; i < Cmd_Argc(); i++ ) @@ -1101,7 +1100,7 @@ void SV_RemoteCommand( netadr_t from, sizebuf_t *msg ) } Cmd_ExecuteString( remaining ); - SV_EndRedirect(); + SV_EndRedirect( &host.rd ); } else Con_Printf( S_ERROR "Bad rcon_password.\n" ); } diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 8040d60e..aaa3dea7 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -1103,7 +1103,7 @@ void SV_Shutdown( const char *finalmsg ) Con_Printf( "%s", finalmsg ); // rcon will be disconnected - SV_EndRedirect(); + SV_EndRedirect( &host.rd ); if( svs.clients ) SV_FinalMessage( finalmsg, false );