diff options
author | Andrey Nazarov <skuller@skuller.net> | 2007-12-21 21:24:49 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2007-12-21 21:24:49 +0000 |
commit | b1fa1be8b67e6d34a3d11fe4bfb9cd27191e2b28 (patch) | |
tree | 878887f017a82f7b861464c683d9a908e6d0a18e | |
parent | a79ed051848531afb9a479f280bbcc39a4c29f44 (diff) |
Use Sys_Setenv for setting environment variables in a safe way.
Moved `writeconfig' command to client code section.
Moved `setenv' command to common code section.
Properly handle `--help' -and `--version' arguments on Unix.
-rw-r--r-- | source/cl_main.c | 77 | ||||
-rw-r--r-- | source/cmd.c | 2 | ||||
-rw-r--r-- | source/com_local.h | 2 | ||||
-rw-r--r-- | source/common.c | 162 | ||||
-rw-r--r-- | source/files.c | 14 | ||||
-rw-r--r-- | source/sys_unix.c | 17 | ||||
-rw-r--r-- | source/sys_win.c | 9 |
7 files changed, 101 insertions, 182 deletions
diff --git a/source/cl_main.c b/source/cl_main.c index b27b1dd..3a2da20 100644 --- a/source/cl_main.c +++ b/source/cl_main.c @@ -297,27 +297,6 @@ void CL_ForwardToServer_f( void ) { } } -void CL_Setenv_f( void ) { - int argc = Cmd_Argc(); - - if ( argc > 2 ) { - char buffer[ MAX_STRING_CHARS ]; - - Q_concat( buffer, sizeof( buffer ), Cmd_Argv( 1 ), "=", - Cmd_ArgsFrom( 2 ), NULL ); - - putenv( buffer ); - } else if ( argc == 2 ) { - char * env = getenv( Cmd_Argv( 1 ) ); - - if ( env ) { - Com_Printf( "%s=%s\n", Cmd_Argv( 1 ), env ); - } else { - Com_Printf( "%s undefined\n", Cmd_Argv( 1 ) ); - } - } -} - /* ================== CL_Pause_f @@ -1976,6 +1955,58 @@ static void CL_DumpLayout_f( void ) { Com_Printf( "Dumped layout program to %s.\n", buffer ); } +/* +=============== +CL_WriteConfig + +Writes key bindings and archived cvars to config.cfg +=============== +*/ +static qboolean CL_WriteConfig( const char *path ) { + fileHandle_t f; + + FS_FOpenFile( path, &f, FS_MODE_WRITE ); + if( !f ) { + Com_WPrintf( "Couldn't write %s\n", path ); + return qfalse; + } + + FS_FPrintf( f, "// generated by q2pro, do not modify\n" ); + + Key_WriteBindings( f ); + Cvar_WriteVariables( f ); + + FS_FCloseFile( f ); + + return qtrue; +} + +/* +=============== +CL_WriteConfig_f +=============== +*/ +static void CL_WriteConfig_f( void ) { + char buffer[MAX_QPATH]; + + if( Cmd_Argc() > 2 ) { + Com_Printf( "Usage: %s [cfgfile]\n", Cmd_Argv( 0 ) ); + return; + } + + if( Cmd_Argc() < 2 ) { + strcpy( buffer, COM_CONFIG_NAME ); + } else { + Cmd_ArgvBuffer( 1, buffer, sizeof( buffer ) ); + COM_AppendExtension( buffer, ".cfg", sizeof( buffer ) ); + } + + if( CL_WriteConfig( buffer ) ) { + Com_Printf( "Wrote %s\n", buffer ); + } +} + + static int CL_Mapname_m( char *buffer, int size ) { if( !cl.mapname[0] ) { return Q_strncpyz( buffer, "nomap", size ); @@ -2206,13 +2237,13 @@ static const cmdreg_t c_client[] = { { "passive", CL_PassiveConnect_f }, { "reconnect", CL_Reconnect_f }, { "rcon", CL_Rcon_f }, - { "setenv", CL_Setenv_f }, { "precache", CL_Precache_f }, { "download", CL_Download_f }, { "serverstatus", CL_ServerStatus_f, CL_Connect_g }, { "dumpclients", CL_DumpClients_f }, { "dumpstatusbar", CL_DumpStatusbar_f }, { "dumplayout", CL_DumpLayout_f }, + { "writeconfig", CL_WriteConfig_f, Cmd_Exec_g }, { "vid_restart", CL_RestartRefresh_f }, // @@ -2751,6 +2782,8 @@ void CL_Shutdown( void ) { Con_Shutdown(); CL_ShutdownRefresh(); + CL_WriteConfig( COM_CONFIG_NAME ); + Cvar_Set( "cl_running", "0" ); isdown = qfalse; diff --git a/source/cmd.c b/source/cmd.c index b565988..43fb9c8 100644 --- a/source/cmd.c +++ b/source/cmd.c @@ -1350,7 +1350,7 @@ static void Cmd_Exec_f( void ) { FS_FreeFile( f ); } -static const char *Cmd_Exec_g( const char *partial, int state ) { +const char *Cmd_Exec_g( const char *partial, int state ) { return Com_FileNameGeneratorByFilter( "", "*.cfg", partial, qtrue, state ); } diff --git a/source/com_local.h b/source/com_local.h index 9b0d514..ed45dbf 100644 --- a/source/com_local.h +++ b/source/com_local.h @@ -126,6 +126,7 @@ void Cmd_AliasSet( const char *name, const char *cmd ); const char *Cmd_Command_g( const char *text, int state ); const char *Cmd_Alias_g( const char *text, int state ); const char *Cmd_Mixed_g( const char *partial, int state ); +const char *Cmd_Exec_g( const char *partial, int state ); // attempts to match a partial command for automatic command line completion // returns NULL if nothing fits @@ -1005,6 +1006,7 @@ uint32 Sys_Realtime( void ); char *Sys_GetClipboardData( void ); void Sys_SetClipboardData( const char *data ); void Sys_Sleep( int msec ); +void Sys_Setenv( const char *name, const char *value ); void Hunk_Begin( mempool_t *pool, int maxsize ); void *Hunk_Alloc( mempool_t *pool, int size ); diff --git a/source/common.c b/source/common.c index 4086c7c..fc06ef5 100644 --- a/source/common.c +++ b/source/common.c @@ -447,63 +447,6 @@ void Com_Quit( void ) { } -// ============================================================================ - -#ifndef DEDICATED_ONLY - -/* -=============== -Com_WriteConfiguration - -Writes key bindings and archived cvars to config.cfg -=============== -*/ -static qboolean Com_WriteConfiguration( const char *path ) { - fileHandle_t f; - - FS_FOpenFile( path, &f, FS_MODE_WRITE ); - if( !f ) { - Com_WPrintf( "Couldn't write %s\n", path ); - return qfalse; - } - - FS_FPrintf( f, "// generated by q2pro, do not modify\n" ); - - Key_WriteBindings( f ); - Cvar_WriteVariables( f ); - - FS_FCloseFile( f ); - - return qtrue; -} - -/* -=============== -Com_WriteConfig_f -=============== -*/ -static void Com_WriteConfig_f( void ) { - char buffer[MAX_QPATH]; - - if( Cmd_Argc() > 2 ) { - Com_Printf( "Usage: %s [cfgfile]\n", Cmd_Argv( 0 ) ); - return; - } - - if( Cmd_Argc() < 2 ) { - strcpy( buffer, COM_CONFIG_NAME ); - } else { - Cmd_ArgvBuffer( 1, buffer, sizeof( buffer ) ); - COM_AppendExtension( buffer, ".cfg", sizeof( buffer ) ); - } - - if( Com_WriteConfiguration( buffer ) ) { - Com_Printf( "Wrote %s\n", buffer ); - } -} - -#endif - /* ============================================================================== @@ -1051,6 +994,24 @@ static void Com_LastError_f( void ) { } } +static void Com_Setenv_f( void ) { + int argc = Cmd_Argc(); + + if( argc > 2 ) { + Sys_Setenv( Cmd_Argv( 1 ), Cmd_ArgsFrom( 2 ) ); + } else if( argc == 2 ) { + char *env = getenv( Cmd_Argv( 1 ) ); + + if( env ) { + Com_Printf( "%s=%s\n", Cmd_Argv( 1 ), env ); + } else { + Com_Printf( "%s undefined\n", Cmd_Argv( 1 ) ); + } + } else { + Com_Printf( "Usage: %s <name> [value]\n", Cmd_Argv( 0 ) ); + } +} + #ifdef _DEBUG /* @@ -1085,88 +1046,12 @@ void Com_Freeze_f( void ) { time = Sys_Milliseconds() + seconds * 1000; while( Sys_Milliseconds() < time ) ; - } void Com_Crash_f( void ) { *( uint32 * )0 = 0x123456; } -static void Com_VsnprintfTest_f( void ) { - char buffer[32]; - int ret; - qboolean fail; - - /* test if returned length is valid, no overflow, large buffer */ - Com_Printf( "test 1\n" ); - fail = qfalse; - memset( buffer, '@', sizeof( buffer ) ); - ret = Com_sprintf( buffer, sizeof( buffer ), "%s", "abcd" ); - if( ret != 4 ) { - Com_Printf( "returned %d instead of %d\n", ret, 4 ); - fail = qtrue; - } - if( buffer[4] != 0 ) { - Com_Printf( "buffer left unterminated\n" ); - fail = qtrue; - } - if( buffer[5] != '@' ) { - Com_Printf( "buffer overflowed\n" ); - fail = qtrue; - } - if( !fail ) { - Com_Printf( "succeeded\n" ); - } else { - Com_Printf( "failed\n" ); - } - - /* test if returned length is valid, no overflow, small buffer */ - Com_Printf( "test 2\n" ); - fail = qfalse; - memset( buffer, '@', sizeof( buffer ) ); - ret = Com_sprintf( buffer, 5, "%s", "abcd" ); - if( ret != 4 ) { - Com_Printf( "returned %d instead of %d\n", ret, 4 ); - } - if( buffer[4] != 0 ) { - Com_Printf( "buffer left unterminated\n" ); - fail = qtrue; - } - if( buffer[5] != '@' ) { - Com_Printf( "buffer overflowed\n" ); - fail = qtrue; - } - if( !fail ) { - Com_Printf( "succeeded\n" ); - } else { - Com_Printf( "failed\n" ); - } - - /* test if returned length is valid, with overflow */ - Com_Printf( "test 3\n" ); - fail = qfalse; - memset( buffer, '@', sizeof( buffer ) ); - ret = Com_sprintf( buffer, 5, "%s", "abcdefgh" ); - if( ret != 4 ) { - Com_Printf( "returned %d instead of %d\n", ret, 4 ); - fail = qtrue; - } - if( buffer[4] != 0 ) { - Com_Printf( "buffer left unterminated\n" ); - fail = qtrue; - } - if( buffer[5] != '@' ) { - Com_Printf( "buffer overflowed\n" ); - fail = qtrue; - } - - if( !fail ) { - Com_Printf( "succeeded\n" ); - } else { - Com_Printf( "failed\n" ); - } -} - #endif const char *Com_FileNameGenerator( const char *path, const char *ext, @@ -1388,11 +1273,7 @@ void Qcommon_Init( int argc, char **argv ) { Cmd_AddCommand ("z_stats", Z_Stats_f); -#ifndef DEDICATED_ONLY - if( !dedicated->integer ) { - Cmd_AddCommand( "writeconfig", Com_WriteConfig_f ); - } -#endif + Cmd_AddCommand( "setenv", Com_Setenv_f ); Cmd_AddMacro( "com_date", Com_Date_m ); Cmd_AddMacro( "com_time", Com_Time_m ); @@ -1648,11 +1529,6 @@ Qcommon_Shutdown ================= */ void Qcommon_Shutdown( qboolean fatalError ) { -#ifndef DEDICATED_ONLY - if( !fatalError && dedicated && !dedicated->integer ) { - Com_WriteConfiguration( COM_CONFIG_NAME ); - } -#endif NET_Shutdown(); LogFile_Close(); FS_Shutdown( qtrue ); diff --git a/source/files.c b/source/files.c index beef344..4eeff95 100644 --- a/source/files.c +++ b/source/files.c @@ -2399,14 +2399,10 @@ static void FS_DefaultGamedir( void ) { sys_basedir->string, "/" BASEGAME, NULL ); } -#if( _MSC_VER >= 1400 ) - _putenv_s( "QUAKE2_HOME", fs_gamedir ); -#else - putenv( va( "QUAKE2_HOME=%s", fs_gamedir ) ); -#endif - Cvar_Set( "game", "" ); Cvar_Set( "gamedir", "" ); + + Sys_Setenv( "QUAKE2_HOME", fs_gamedir ); } @@ -2447,11 +2443,7 @@ static void FS_SetupGamedir( void ) { FS_AddGameDirectory( "%s/%s", sys_homedir->string, fs_game->string ); } -#if( _MSC_VER >= 1400 ) - _putenv_s( "QUAKE2_HOME", fs_gamedir ); -#else - putenv( va( "QUAKE2_HOME=%s", fs_gamedir ) ); -#endif + Sys_Setenv( "QUAKE2_HOME", fs_gamedir ); } qboolean FS_SafeToRestart( void ) { diff --git a/source/sys_unix.c b/source/sys_unix.c index 6f36c61..071c9c4 100644 --- a/source/sys_unix.c +++ b/source/sys_unix.c @@ -679,6 +679,10 @@ void Sys_Sleep( int msec ) { nanosleep( &req, NULL ); } +void Sys_Setenv( const char *name, const char *value ) { + setenv( name, value, 1 ); +} + /* ================ Sys_FillAPI @@ -1101,19 +1105,22 @@ main ================= */ int main( int argc, char **argv ) { - int i; - - for( i = 1; i < argc; i++ ) { + if( argc > 1 ) { if( !strcmp( argv[1], "-v" ) || !strcmp( argv[1], "--version" ) ) { printf( APPLICATION " " VERSION " " __DATE__ " " BUILDSTRING " " CPUSTRING "\n" ); return 0; } + if( !strcmp( argv[1], "-h" ) || !strcmp( argv[1], "--help" ) ) { + printf( "Usage: %s [+command arguments] [...]\n", argv[0] ); + return 0; + } } if( !getuid() || !geteuid() ) { - Sys_Error( "You can not run " APPLICATION " as superuser " - "for security reasons!" ); + printf( "You can not run " APPLICATION " as superuser " + "for security reasons!" ); + return 1; } Qcommon_Init( argc, argv ); diff --git a/source/sys_win.c b/source/sys_win.c index 03464da..0d14246 100644 --- a/source/sys_win.c +++ b/source/sys_win.c @@ -774,6 +774,15 @@ void Sys_Sleep( int msec ) { Sleep( msec ); } +void Sys_Setenv( const char *name, const char *value ) { +#if( _MSC_VER >= 1400 ) + _putenv_s( name, value ); +#else + _putenv( va( "%s=%s", name, value ) ); +#endif +} + + /* ================ Sys_Init |