Add android::base::GetExecutablePath, switch adb and fastboot over.

We'd long had two copies of this stuff, so rather than rewrite both
Linux versions to use android::base::Readlink, let's kill the duplication
too...

Bug: http://b/30988271
Change-Id: I4de58a94a22a4b1faf969a6fc70ca1560a4d5121
diff --git a/file.cpp b/file.cpp
index 3963081..03ce4ea 100644
--- a/file.cpp
+++ b/file.cpp
@@ -30,6 +30,13 @@
 #include "android-base/utf8.h"
 #include "utils/Compat.h"
 
+#if defined(__APPLE__)
+#import <Carbon/Carbon.h>
+#endif
+#if defined(_WIN32)
+#include <windows.h>
+#endif
+
 namespace android {
 namespace base {
 
@@ -197,5 +204,32 @@
 }
 #endif
 
+std::string GetExecutablePath() {
+#if defined(__linux__)
+  std::string path;
+  android::base::Readlink("/proc/self/exe", &path);
+  return path;
+#elif defined(__APPLE__)
+  // TODO: use _NSGetExecutablePath instead (http://b/31240820)?
+  CFBundleRef mainBundle = CFBundleGetMainBundle();
+  CFURLRef executableURL = CFBundleCopyExecutableURL(mainBundle);
+  CFStringRef executablePathString = CFURLCopyFileSystemPath(executableURL, kCFURLPOSIXPathStyle);
+  CFRelease(executableURL);
+
+  char path[PATH_MAX + 1];
+  CFStringGetFileSystemRepresentation(executablePathString, path, sizeof(PATH_MAX)-1);
+  CFRelease(executablePathString);
+  return path;
+#elif defined(_WIN32)
+  char path[PATH_MAX + 1];
+  DWORD result = GetModuleFileName(NULL, path, sizeof(path) - 1);
+  if (result == 0 || result == sizeof(path) - 1) return "";
+  path[PATH_MAX - 1] = 0;
+  return path;
+#else
+#error unknown OS
+#endif
+}
+
 }  // namespace base
 }  // namespace android