diff options
author | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2006-02-26 18:44:15 +0000 |
---|---|---|
committer | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2006-02-26 18:44:15 +0000 |
commit | 3cbb3f928dda70718ed5f4158f4b2254078301d8 (patch) | |
tree | 239d09d003642adc121f936dd6a2e2da7dbc6aed /code/unix | |
parent | 71a5742b26ac3bca97a64b7aa3dad376b802ed2d (diff) | |
download | ioquake3-aero-3cbb3f928dda70718ed5f4158f4b2254078301d8.tar.gz ioquake3-aero-3cbb3f928dda70718ed5f4158f4b2254078301d8.zip |
* Resolve symlinks to the binary. This prevents the situation where a symlink
to ioq3 in e.g. /usr/local/bin/ cannot locate the data files since it thinks
/usr/local/bin/ is the directory the actual binary sits.
git-svn-id: svn://svn.icculus.org/quake3/trunk@586 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/unix')
-rw-r--r-- | code/unix/unix_main.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/code/unix/unix_main.c b/code/unix/unix_main.c index 20a90a0..b60a326 100644 --- a/code/unix/unix_main.c +++ b/code/unix/unix_main.c @@ -1335,6 +1335,54 @@ void Sys_PrintBinVersion( const char* name ) { fprintf( stdout, "%s\n\n", sep ); } +/* +================= +Sys_BinName + +This resolves any symlinks to the binary. It's disabled for debug +builds because there are situations where you are likely to want +to symlink to binaries and /not/ have the links resolved. +================= +*/ +char *Sys_BinName( const char *arg0 ) +{ +#ifdef NDEBUG + int n; + char src[ PATH_MAX ]; + char dir[ PATH_MAX ]; + qboolean links = qfalse; +#endif + + static char dst[ PATH_MAX ]; + + Q_strncpyz( dst, arg0, PATH_MAX ); + +#ifdef NDEBUG + while( ( n = readlink( dst, src, PATH_MAX ) ) >= 0 ) + { + src[ n ] = '\0'; + + Q_strncpyz( dir, dirname( dst ), PATH_MAX ); + Q_strncpyz( dst, dir, PATH_MAX ); + Q_strcat( dst, PATH_MAX, "/" ); + Q_strcat( dst, PATH_MAX, src ); + + links = qtrue; + } + + if( links ) + { + Q_strncpyz( dst, Sys_Cwd( ), PATH_MAX ); + Q_strcat( dst, PATH_MAX, "/" ); + Q_strcat( dst, PATH_MAX, dir ); + Q_strcat( dst, PATH_MAX, "/" ); + Q_strcat( dst, PATH_MAX, src ); + } +#endif + + return dst; +} + void Sys_ParseArgs( int argc, char* argv[] ) { if ( argc==2 ) @@ -1342,7 +1390,7 @@ void Sys_ParseArgs( int argc, char* argv[] ) { if ( (!strcmp( argv[1], "--version" )) || ( !strcmp( argv[1], "-v" )) ) { - Sys_PrintBinVersion( argv[0] ); + Sys_PrintBinVersion( Sys_BinName( argv[0] ) ); Sys_Exit(0); } } @@ -1365,7 +1413,7 @@ int main ( int argc, char* argv[] ) Sys_ParseArgs( argc, argv ); // bk010104 - added this for support - strncat(cdpath, argv[0], sizeof(cdpath)-1); + strncat(cdpath, Sys_BinName( argv[0] ), sizeof(cdpath)-1); Sys_SetDefaultCDPath(dirname(cdpath)); Sys_SetDefaultInstallPath(DEFAULT_BASEDIR); |