]> git.cworth.org Git - apitrace/blobdiff - os_posix.cpp
Automatically detect whether trace is zlib or snappy compressed
[apitrace] / os_posix.cpp
index 4c16096de0d38f052fca40881b494dd7516b5069..cb9b7e59113130b5f696f21a41769aa5c463fc7a 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright 2010 VMware, Inc.
+ * Copyright 2010-2011 VMware, Inc.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -23,6 +23,7 @@
  *
  **************************************************************************/
 
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/time.h>
 #include <pthread.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef __APPLE__
+#include <mach-o/dyld.h>
+#endif
 
 #include "os.hpp"
 
+
 namespace OS {
 
 
@@ -57,16 +65,33 @@ ReleaseMutex(void)
 bool
 GetProcessName(char *str, size_t size)
 {
-    ssize_t len;
     char szProcessPath[PATH_MAX + 1];
     char *lpProcessName;
 
     // http://stackoverflow.com/questions/1023306/finding-current-executables-path-without-proc-self-exe
-    len = readlink("/proc/self/exe", szProcessPath, sizeof(szProcessPath) - 1);
-    if (len == -1) {
+#ifdef __APPLE__
+    uint32_t len = sizeof szProcessPath;
+    if (_NSGetExecutablePath(szProcessPath, &len) != 0) {
         *str = 0;
         return false;
     }
+#else
+    ssize_t len;
+    len = readlink("/proc/self/exe", szProcessPath, sizeof(szProcessPath) - 1);
+    if (len == -1) {
+        // /proc/self/exe is not available on setuid processes, so fallback to
+        // /proc/self/cmdline.
+        int fd = open("/proc/self/cmdline", O_RDONLY);
+        if (fd >= 0) {
+            len = read(fd, szProcessPath, sizeof(szProcessPath) - 1);
+            close(fd);
+        }
+    }
+    if (len <= 0) {
+        snprintf(str, size, "%i", (int)getpid());
+        return true;
+    }
+#endif
     szProcessPath[len] = 0;
 
     lpProcessName = strrchr(szProcessPath, '/');