Browse Source

engine: refactor rcon redirect, don't make it depend on global object

pull/2/head
Alibek Omarov 11 months ago
parent
commit
36c2f9e9f2
  1. 2
      engine/common/common.h
  2. 2
      engine/common/system.c
  3. 2
      engine/server/server.h
  4. 69
      engine/server/sv_client.c
  5. 2
      engine/server/sv_main.c

2
engine/common/common.h

@ -793,7 +793,7 @@ void VID_Init( void );
void UI_SetActiveMenu( qboolean fActive ); void UI_SetActiveMenu( qboolean fActive );
void UI_ShowConnectionWarning( void ); void UI_ShowConnectionWarning( void );
void Cmd_Null_f( 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 ); qboolean COM_ParseVector( char **pfile, float *v, size_t size );
void COM_NormalizeAngles( vec3_t angles ); void COM_NormalizeAngles( vec3_t angles );
int COM_FileSize( const char *filename ); int COM_FileSize( const char *filename );

2
engine/common/system.c

@ -562,7 +562,7 @@ void Sys_Print( const char *pMsg )
Sys_PrintLog( pMsg ); Sys_PrintLog( pMsg );
Rcon_Print( pMsg ); Rcon_Print( &host.rd, pMsg );
} }
/* /*

2
engine/server/server.h

@ -564,7 +564,7 @@ qboolean SV_IsPlayerIndex( int idx );
int SV_CalcPing( sv_client_t *cl ); int SV_CalcPing( sv_client_t *cl );
void SV_InitClientMove( void ); void SV_InitClientMove( void );
void SV_UpdateServerInfo( 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_RejectConnection( netadr_t from, const char *fmt, ... ) _format( 2 );
void SV_GetPlayerCount( int *clients, int *bots ); void SV_GetPlayerCount( int *clients, int *bots );

69
engine/server/sv_client.c

@ -639,7 +639,7 @@ void SV_DropClient( sv_client_t *cl, qboolean crash )
cl->frames = NULL; cl->frames = NULL;
if( NET_CompareBaseAdr( cl->netchan.remote_address, host.rd.address )) if( NET_CompareBaseAdr( cl->netchan.remote_address, host.rd.address ))
SV_EndRedirect(); SV_EndRedirect( &host.rd );
// throw away any residual garbage in the channel. // throw away any residual garbage in the channel.
Netchan_Clear( &cl->netchan ); 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 ) rd->target = target;
return; rd->buffer = buffer;
rd->buffersize = buffersize;
host.rd.target = target; rd->flush = flush;
host.rd.buffer = buffer; rd->address = adr;
host.rd.buffersize = buffersize; rd->buffer[0] = 0;
host.rd.flush = flush; if( rd->lines == 0 )
host.rd.address = adr; rd->lines = -1;
host.rd.buffer[0] = 0;
if( host.rd.lines == 0 )
host.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 )) if( sv.current_client && FBitSet( sv.current_client->flags, FCL_FAKECLIENT ))
return; 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; return;
if( host.rd.flush ) if( rd->flush )
host.rd.flush( host.rd.address, host.rd.target, host.rd.buffer ); rd->flush( rd->address, rd->target, rd->buffer );
host.rd.target = 0; rd->target = RD_NONE;
host.rd.buffer = NULL; rd->buffer = NULL;
host.rd.buffersize = 0; rd->buffersize = 0;
host.rd.flush = NULL; rd->flush = NULL;
} }
/* /*
@ -733,25 +730,27 @@ Rcon_Print
Print message to rcon buffer and send to rcon redirect target 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;
{
size_t len = Q_strncat( host.rd.buffer, pMsg, host.rd.buffersize );
if( len && host.rd.buffer[len-1] == '\n' ) 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' )
{ {
host.rd.flush( host.rd.address, host.rd.target, host.rd.buffer ); rd->flush( rd->address, rd->target, rd->buffer );
if( host.rd.lines > 0 ) if( rd->lines > 0 )
host.rd.lines--; rd->lines--;
host.rd.buffer[0] = 0; rd->buffer[0] = 0;
if( !host.rd.lines ) if( !rd->lines )
Msg( "End of redirection!\n" ); Msg( "End of redirection!\n" );
} }
}
} }
/* /*
@ -1090,7 +1089,7 @@ void SV_RemoteCommand( netadr_t from, sizebuf_t *msg )
if( Rcon_Validate( )) 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; remaining[0] = 0;
for( i = 2; i < Cmd_Argc(); i++ ) for( i = 2; i < Cmd_Argc(); i++ )
@ -1101,7 +1100,7 @@ void SV_RemoteCommand( netadr_t from, sizebuf_t *msg )
} }
Cmd_ExecuteString( remaining ); Cmd_ExecuteString( remaining );
SV_EndRedirect(); SV_EndRedirect( &host.rd );
} }
else Con_Printf( S_ERROR "Bad rcon_password.\n" ); else Con_Printf( S_ERROR "Bad rcon_password.\n" );
} }

2
engine/server/sv_main.c

@ -1103,7 +1103,7 @@ void SV_Shutdown( const char *finalmsg )
Con_Printf( "%s", finalmsg ); Con_Printf( "%s", finalmsg );
// rcon will be disconnected // rcon will be disconnected
SV_EndRedirect(); SV_EndRedirect( &host.rd );
if( svs.clients ) if( svs.clients )
SV_FinalMessage( finalmsg, false ); SV_FinalMessage( finalmsg, false );

Loading…
Cancel
Save