diff options
author | Andrey Nazarov <skuller@skuller.net> | 2009-06-03 18:18:55 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2009-06-03 18:18:55 +0000 |
commit | 9d9b671cc77440e9b3bfcd74288f09a720c0ee6b (patch) | |
tree | ecd94136c7742b1aab73f4e43f9e454cd0c63eba /source/cmd.c | |
parent | bd27c070620fdc96c5c3e222b3bfe43657ce90c2 (diff) |
Don't cap maxmsglen on loopback connections.
Use seperate buffer for stuffcmd processing on client so that something like ‘map foobar;wait;wait;wait;give shells’ works (original Q2 used deferred buffer for this).
Don't include netgraph code into release builds.
Made ‘changing’ and ‘precache’ commands not available from console, since they may confuse the client when typed manually.
Client now handles newlines embedded into ‘cstring’ and ‘cstring2’ layout commands properly.
Fixed a crash when displaying inventory.
Detect zero bytes embedded into config files and refuse to execute them.
Diffstat (limited to 'source/cmd.c')
-rw-r--r-- | source/cmd.c | 113 |
1 files changed, 59 insertions, 54 deletions
diff --git a/source/cmd.c b/source/cmd.c index 8e9ac11..35c6ddf 100644 --- a/source/cmd.c +++ b/source/cmd.c @@ -40,6 +40,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. char cmd_buffer_text[CMD_BUFFER_SIZE]; cmdbuf_t cmd_buffer; +// points to the buffer current command is executed from +cmdbuf_t *cmd_current; + /* ============ Cmd_Wait_f @@ -50,11 +53,13 @@ bind g "impulse 5 ; +attack ; wait ; -attack ; impulse 2" ============ */ static void Cmd_Wait_f( void ) { - if( Cmd_Argc() > 1 ) { - cmd_buffer.waitCount = atoi( Cmd_Argv( 1 ) ); - } else { - cmd_buffer.waitCount = 1; + int count; + + count = atoi( Cmd_Argv( 1 ) ); + if( count < 1 ) { + count = 1; } + cmd_current->waitCount += count; } /* @@ -64,6 +69,7 @@ Cbuf_Init */ void Cbuf_Init( void ) { memset( &cmd_buffer, 0, sizeof( cmd_buffer ) ); + cmd_buffer.from = FROM_CONSOLE; cmd_buffer.text = cmd_buffer_text; cmd_buffer.maxsize = sizeof( cmd_buffer_text ); cmd_buffer.exec = Cmd_ExecuteString; @@ -76,7 +82,7 @@ Cbuf_AddText Adds command text at the end of the buffer ============ */ -void Cbuf_AddTextEx( cmdbuf_t *buf, const char *text ) { +void Cbuf_AddText( cmdbuf_t *buf, const char *text ) { size_t l = strlen( text ); if( buf->cursize + l > buf->maxsize ) { @@ -107,7 +113,7 @@ Adds command text at the beginning of command buffer. Adds a \n to the text. ============ */ -void Cbuf_InsertTextEx( cmdbuf_t *buf, const char *text ) { +void Cbuf_InsertText( cmdbuf_t *buf, const char *text ) { size_t l = strlen( text ); // add the entire text of the file @@ -127,31 +133,10 @@ void Cbuf_InsertTextEx( cmdbuf_t *buf, const char *text ) { /* ============ -Cbuf_ExecuteText -============ -*/ -void Cbuf_ExecuteText( cbufExecWhen_t exec_when, const char *text ) { - switch( exec_when ) { - case EXEC_NOW: - Cmd_ExecuteString( text ); - break; - case EXEC_INSERT: - Cbuf_InsertText( text ); - break; - case EXEC_APPEND: - Cbuf_AddText( text ); - break; - default: - Com_Error( ERR_FATAL, "%s: bad exec_when", __func__ ); - } -} - -/* -============ Cbuf_Execute ============ */ -void Cbuf_ExecuteEx( cmdbuf_t *buf ) { +void Cbuf_Execute( cmdbuf_t *buf ) { int i; char *text; char line[MAX_STRING_CHARS]; @@ -197,8 +182,8 @@ void Cbuf_ExecuteEx( cmdbuf_t *buf ) { } // execute the command line - buf->exec( line ); - + cmd_current = buf; + buf->exec( buf, line ); } buf->aliasCount = 0; // don't allow infinite alias loops @@ -536,6 +521,10 @@ int cmd_optind; char *cmd_optarg; char *cmd_optopt; +from_t Cmd_From( void ) { + return cmd_current->from; +} + size_t Cmd_ArgOffset( int arg ) { if( arg < 0 ) { return 0; @@ -1279,24 +1268,11 @@ void Cmd_Command_g( genctx_t *ctx ) { } } -/* -============ -Cmd_ExecuteString - -A complete command line has been parsed, so try to execute it -============ -*/ -void Cmd_ExecuteString( const char *text ) { +void Cmd_ExecuteCommand( cmdbuf_t *buf ) { cmd_function_t *cmd; cmdalias_t *a; cvar_t *v; - - Cmd_TokenizeString( text, qtrue ); - - // execute the command line - if( !cmd_argc ) { - return; // no tokens - } + char *text; // check functions cmd = Cmd_Find( cmd_argv[0] ); @@ -1316,18 +1292,18 @@ void Cmd_ExecuteString( const char *text ) { // check aliases a = Cmd_AliasFind( cmd_argv[0] ); if( a ) { - if( cmd_buffer.aliasCount == ALIAS_LOOP_COUNT ) { + if( buf->aliasCount == ALIAS_LOOP_COUNT ) { Com_WPrintf( "Runaway alias loop\n" ); return; } text = Cmd_MacroExpandString( a->value, qtrue ); if( text ) { - cmd_buffer.aliasCount++; - Cbuf_InsertText( text ); + buf->aliasCount++; + Cbuf_InsertText( buf, text ); } return; } - + // check variables v = Cvar_FindVar( cmd_argv[0] ); if( v ) { @@ -1345,6 +1321,24 @@ void Cmd_ExecuteString( const char *text ) { } /* +============ +Cmd_ExecuteString + +A complete command line has been parsed, so try to execute it +============ +*/ +void Cmd_ExecuteString( cmdbuf_t *buf, const char *text ) { + Cmd_TokenizeString( text, qtrue ); + + // execute the command line + if( !cmd_argc ) { + return; // no tokens + } + + Cmd_ExecuteCommand( buf ); +} + +/* =============== Cmd_Exec_f =============== @@ -1352,6 +1346,8 @@ Cmd_Exec_f static void Cmd_Exec_f( void ) { char buffer[MAX_QPATH]; char *f; + size_t len; + int i; if( Cmd_Argc() != 2 ) { Com_Printf( "%s <filename> : execute a script file\n", Cmd_Argv( 0 ) ); @@ -1360,24 +1356,33 @@ static void Cmd_Exec_f( void ) { Cmd_ArgvBuffer( 1, buffer, sizeof( buffer ) ); - FS_LoadFile( buffer, ( void ** )&f ); + len = FS_LoadFile( buffer, ( void ** )&f ); if( !f ) { // try with *.cfg extension COM_DefaultExtension( buffer, ".cfg", sizeof( buffer ) ); - FS_LoadFile( buffer, ( void ** )&f ); + len = FS_LoadFile( buffer, ( void ** )&f ); if( !f ) { Com_Printf( "Couldn't exec %s\n", buffer ); return; } } + for( i = 0; i < len; i++ ) { + if( f[i] == 0 ) { + Com_Printf( "Refusing to exec binary file\n" ); + goto finish; + } + } + Com_Printf( "Execing %s\n", buffer ); // FIXME: bad thing to do in place COM_Compress( f ); - Cbuf_InsertText( f ); + // FIXME: always insert into generic command buffer + Cbuf_InsertText( &cmd_buffer, f ); +finish: FS_FreeFile( f ); } @@ -1548,8 +1553,8 @@ static void Cmd_MacroList_f( void ) { } static void Cmd_Text_f( void ) { - Cbuf_AddText( Cmd_Args() ); - Cbuf_AddText( "\n" ); + Cbuf_AddText( cmd_current, Cmd_Args() ); + Cbuf_AddText( cmd_current, "\n" ); } static void Cmd_Complete_f( void ) { |