Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1473)

Unified Diff: runtime/bin/platform_fuchsia.cc

Issue 2581363002: Fuchsia: resolve executable name, fetch environment vars (Closed)
Patch Set: Cleanup Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/file_fuchsia.cc ('k') | runtime/tests/vm/dart/hello_fuchsia_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/platform_fuchsia.cc
diff --git a/runtime/bin/platform_fuchsia.cc b/runtime/bin/platform_fuchsia.cc
index caa5aeff7842f34ed1c27d9ca60fb11dca45c092..53f07ac2aa95ed02bd234c88b0e67d6081528990 100644
--- a/runtime/bin/platform_fuchsia.cc
+++ b/runtime/bin/platform_fuchsia.cc
@@ -10,6 +10,7 @@
#include <string.h> // NOLINT
#include <unistd.h> // NOLINT
+#include "bin/dartutils.h"
#include "bin/fdutils.h"
#include "bin/file.h"
@@ -52,15 +53,59 @@ bool Platform::LocalHostname(char* buffer, intptr_t buffer_length) {
char** Platform::Environment(intptr_t* count) {
- char** result =
- reinterpret_cast<char**>(Dart_ScopeAllocate(1 * sizeof(*result)));
- result[0] = NULL;
+ // Using environ directly is only safe as long as we do not
+ // provide access to modifying environment variables.
+ intptr_t i = 0;
+ char** tmp = environ;
+ while (*(tmp++) != NULL) {
+ i++;
+ }
+ *count = i;
+ char** result;
+ result = reinterpret_cast<char**>(Dart_ScopeAllocate(i * sizeof(*result)));
+ for (intptr_t current = 0; current < i; current++) {
+ result[current] = environ[current];
+ }
return result;
}
const char* Platform::ResolveExecutablePath() {
- return "dart";
+ // The string used on the command line to spawn the executable is in argv_[0].
+ // If that string is a relative or absolute path, i.e. it contains a '/', then
+ // we make the path absolute if it is not already and return it. If argv_[0]
+ // does not contain a '/', we assume it is a program whose location is
+ // resolved via the PATH environment variable, and search for it using the
+ // paths found there.
+ const char* path = getenv("PATH");
+ if ((strchr(argv_[0], '/') != NULL) || (path == NULL)) {
+ if (argv_[0][0] == '/') {
+ return File::GetCanonicalPath(argv_[0]);
+ } else {
+ char* result = DartUtils::ScopedCString(PATH_MAX + 1);
+ char* cwd = DartUtils::ScopedCString(PATH_MAX + 1);
+ getcwd(cwd, PATH_MAX);
+ snprintf(result, PATH_MAX, "%s/%s", cwd, argv_[0]);
+ result[PATH_MAX] = '\0';
+ ASSERT(File::Exists(result));
+ return File::GetCanonicalPath(result);
+ }
+ } else {
+ char* pathcopy = DartUtils::ScopedCopyCString(path);
+ char* result = DartUtils::ScopedCString(PATH_MAX + 1);
+ char* save = NULL;
+ while ((pathcopy = strtok_r(pathcopy, ":", &save)) != NULL) {
+ snprintf(result, PATH_MAX, "%s/%s", pathcopy, argv_[0]);
+ result[PATH_MAX] = '\0';
+ if (File::Exists(result)) {
+ return File::GetCanonicalPath(result);
+ }
+ pathcopy = NULL;
+ }
+ // Couldn't find it. This causes null to be returned for
+ // Platform.resovledExecutable.
rmacnak 2016/12/16 23:05:01 resolved
+ return NULL;
+ }
}
« no previous file with comments | « runtime/bin/file_fuchsia.cc ('k') | runtime/tests/vm/dart/hello_fuchsia_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698