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

Unified Diff: runtime/bin/process_android.cc

Issue 3001963002: [dart:io] Namespaces for file IO (Closed)
Patch Set: Fuchsia fix Created 3 years, 4 months 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/process.cc ('k') | runtime/bin/process_fuchsia.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/process_android.cc
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 45e48baaa1a75e5c23e3ff4bde2a116f65995f3b..b2a41162215943b7daf1596df6bfee07aa43dae5 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -17,10 +17,12 @@
#include <unistd.h> // NOLINT
#include "bin/dartutils.h"
+#include "bin/directory.h"
#include "bin/fdutils.h"
#include "bin/file.h"
#include "bin/lockers.h"
#include "bin/log.h"
+#include "bin/namespace.h"
#include "bin/reference_counting.h"
#include "bin/thread.h"
@@ -242,7 +244,8 @@ Monitor* ExitCodeHandler::monitor_ = new Monitor();
class ProcessStarter {
public:
- ProcessStarter(const char* path,
+ ProcessStarter(Namespace* namespc,
+ const char* path,
char* arguments[],
intptr_t arguments_length,
const char* working_directory,
@@ -255,7 +258,8 @@ class ProcessStarter {
intptr_t* id,
intptr_t* exit_event,
char** os_error_message)
- : path_(path),
+ : namespc_(namespc),
+ path_(path),
working_directory_(working_directory),
mode_(mode),
in_(in),
@@ -431,6 +435,11 @@ class ProcessStarter {
}
}
+ const char* ResolvePath() {
+ const char* resolved_path = File::GetCanonicalPath(namespc_, path_);
+ return resolved_path == NULL ? path_ : resolved_path;
+ }
+
void ExecProcess() {
if (TEMP_FAILURE_RETRY(dup2(write_out_[0], STDIN_FILENO)) == -1) {
ReportChildError();
@@ -445,7 +454,7 @@ class ProcessStarter {
}
if (working_directory_ != NULL &&
- TEMP_FAILURE_RETRY(chdir(working_directory_)) == -1) {
+ !Directory::SetCurrent(namespc_, working_directory_)) {
ReportChildError();
}
@@ -453,8 +462,9 @@ class ProcessStarter {
environ = program_environment_;
}
+ const char* resolved_path = ResolvePath();
VOID_TEMP_FAILURE_RETRY(
- execvp(path_, const_cast<char* const*>(program_arguments_)));
+ execvp(resolved_path, const_cast<char* const*>(program_arguments_)));
ReportChildError();
}
@@ -496,14 +506,15 @@ class ProcessStarter {
}
if ((working_directory_ != NULL) &&
- (TEMP_FAILURE_RETRY(chdir(working_directory_)) == -1)) {
+ !Directory::SetCurrent(namespc_, working_directory_)) {
ReportChildError();
}
// Report the final PID and do the exec.
ReportPid(getpid()); // getpid cannot fail.
- VOID_TEMP_FAILURE_RETRY(
- execvp(path_, const_cast<char* const*>(program_arguments_)));
+ const char* resolved_path = ResolvePath();
+ VOID_TEMP_FAILURE_RETRY(execvp(
+ resolved_path, const_cast<char* const*>(program_arguments_)));
ReportChildError();
} else {
// Exit the intermediate process.
@@ -655,8 +666,8 @@ class ProcessStarter {
// the OS error message to the exec control pipe and exit.
int child_errno = errno;
const int kBufferSize = 1024;
- char os_error_message[kBufferSize];
- Utils::StrError(errno, os_error_message, kBufferSize);
+ char error_buf[kBufferSize];
+ char* os_error_message = Utils::StrError(errno, error_buf, kBufferSize);
int bytes_written = FDUtils::WriteToBlocking(exec_control_[1], &child_errno,
sizeof(child_errno));
if (bytes_written == sizeof(child_errno)) {
@@ -716,6 +727,7 @@ class ProcessStarter {
char** program_arguments_;
char** program_environment_;
+ Namespace* namespc_;
const char* path_;
const char* working_directory_;
ProcessStartMode mode_;
@@ -730,7 +742,8 @@ class ProcessStarter {
DISALLOW_IMPLICIT_CONSTRUCTORS(ProcessStarter);
};
-int Process::Start(const char* path,
+int Process::Start(Namespace* namespc,
+ const char* path,
char* arguments[],
intptr_t arguments_length,
const char* working_directory,
@@ -743,9 +756,9 @@ int Process::Start(const char* path,
intptr_t* id,
intptr_t* exit_event,
char** os_error_message) {
- ProcessStarter starter(path, arguments, arguments_length, working_directory,
- environment, environment_length, mode, in, out, err,
- id, exit_event, os_error_message);
+ ProcessStarter starter(namespc, path, arguments, arguments_length,
+ working_directory, environment, environment_length,
+ mode, in, out, err, id, exit_event, os_error_message);
return starter.Start();
}
« no previous file with comments | « runtime/bin/process.cc ('k') | runtime/bin/process_fuchsia.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698