r586 - trunk/code/unix

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Feb 26 13:44:15 EST 2006


Author: tma
Date: 2006-02-26 13:44:15 -0500 (Sun, 26 Feb 2006)
New Revision: 586

Modified:
   trunk/code/unix/unix_main.c
Log:
* 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.


Modified: trunk/code/unix/unix_main.c
===================================================================
--- trunk/code/unix/unix_main.c	2006-02-26 02:31:32 UTC (rev 585)
+++ trunk/code/unix/unix_main.c	2006-02-26 18:44:15 UTC (rev 586)
@@ -1335,6 +1335,54 @@
   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 @@
     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 @@
 
   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);




More information about the quake3-commits mailing list