Change the MacOSX Symbols::DownloadObjectAndSymbolFile to look up
authorJason Molenda <jmolenda@apple.com>
Tue, 30 Oct 2012 21:26:30 +0000 (21:26 +0000)
committerJason Molenda <jmolenda@apple.com>
Tue, 30 Oct 2012 21:26:30 +0000 (21:26 +0000)
"~rc" via getpwnam() instead of doing tilde expansion and doing soft-link
dereferencing via realpath() - if we're pointing to a softlink, leave it
as-is.
<rdar://problem/12597698>

llvm-svn: 167052

lldb/source/Host/macosx/Symbols.cpp

index a8fa1c0..a358336 100644 (file)
@@ -11,6 +11,7 @@
 
 // C Includes
 #include <dirent.h>
+#include <pwd.h>
 #include "llvm/Support/MachO.h"
 
 // C++ Includes
@@ -696,12 +697,27 @@ Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec, bool force_lookup
             
             if (!g_dsym_for_uuid_exe_exists)
             {
-                dsym_for_uuid_exe_spec.SetFile("~rc/bin/dsymForUUID", true);
+                dsym_for_uuid_exe_spec.SetFile("/usr/local/bin/dsymForUUID", false);
                 g_dsym_for_uuid_exe_exists = dsym_for_uuid_exe_spec.Exists();
                 if (!g_dsym_for_uuid_exe_exists)
                 {
-                    dsym_for_uuid_exe_spec.SetFile("/usr/local/bin/dsymForUUID", false);
-                    g_dsym_for_uuid_exe_exists = dsym_for_uuid_exe_spec.Exists();
+                    int bufsize;
+                    if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) != -1)
+                    {
+                        char buffer[bufsize];
+                        struct passwd pwd;
+                        struct passwd *tilde_rc = NULL;
+                        // we are a library so we need to use the reentrant version of getpwnam()
+                        if (getpwnam_r ("rc", &pwd, buffer, bufsize, &tilde_rc) == 0 
+                            && tilde_rc 
+                            && tilde_rc->pw_dir)
+                        {
+                            std::string dsymforuuid_path(tilde_rc->pw_dir);
+                            dsymforuuid_path += "/bin/dsymForUUID";
+                            dsym_for_uuid_exe_spec.SetFile(dsymforuuid_path.c_str(), false);
+                            g_dsym_for_uuid_exe_exists = dsym_for_uuid_exe_spec.Exists();
+                        }
+                    }
                 }
             }
             if (!g_dsym_for_uuid_exe_exists && g_dbgshell_command != NULL)