summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2007-12-21 21:24:49 +0000
committerAndrey Nazarov <skuller@skuller.net>2007-12-21 21:24:49 +0000
commitb1fa1be8b67e6d34a3d11fe4bfb9cd27191e2b28 (patch)
tree878887f017a82f7b861464c683d9a908e6d0a18e
parenta79ed051848531afb9a479f280bbcc39a4c29f44 (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.c77
-rw-r--r--source/cmd.c2
-rw-r--r--source/com_local.h2
-rw-r--r--source/common.c162
-rw-r--r--source/files.c14
-rw-r--r--source/sys_unix.c17
-rw-r--r--source/sys_win.c9
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