| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/process_proxy/process_proxy.h" | 5 #include "chrome/browser/chromeos/process_proxy/process_proxy.h" |
| 6 | 6 |
| 7 #include <cstdio> | |
| 8 #include <fcntl.h> | 7 #include <fcntl.h> |
| 9 #include <stdlib.h> | 8 #include <stdlib.h> |
| 10 #include <sys/ioctl.h> | 9 #include <sys/ioctl.h> |
| 11 | 10 |
| 12 #include "base/bind.h" | 11 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 14 #include "base/eintr_wrapper.h" | 13 #include "base/eintr_wrapper.h" |
| 15 #include "base/file_util.h" | 14 #include "base/file_util.h" |
| 16 #include "base/process_util.h" | 15 #include "base/process_util.h" |
| 17 #include "base/logging.h" | 16 #include "base/logging.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 // We may receive some output even after Close was called (crosh process does | 112 // We may receive some output even after Close was called (crosh process does |
| 114 // not have to quit instantly, or there may be some trailing data left in | 113 // not have to quit instantly, or there may be some trailing data left in |
| 115 // output stream fds). In that case owner of the callback may be gone so we | 114 // output stream fds). In that case owner of the callback may be gone so we |
| 116 // don't want to send it anything. |callback_set_| is reset when this gets | 115 // don't want to send it anything. |callback_set_| is reset when this gets |
| 117 // closed. | 116 // closed. |
| 118 if (callback_set_) | 117 if (callback_set_) |
| 119 callback_.Run(type, output); | 118 callback_.Run(type, output); |
| 120 } | 119 } |
| 121 | 120 |
| 122 bool ProcessProxy::StopWatching() { | 121 bool ProcessProxy::StopWatching() { |
| 123 if (!watcher_started_) | 122 if (!watcher_started_) |
| 124 return true; | 123 return true; |
| 125 // Signal Watcher that we are done. We use self-pipe trick to unblock watcher. | 124 // Signal Watcher that we are done. We use self-pipe trick to unblock watcher. |
| 126 // Anything may be written to the pipe. | 125 // Anything may be written to the pipe. |
| 127 const char message[] = "q"; | 126 const char message[] = "q"; |
| 128 return file_util::WriteFileDescriptor(shutdown_pipe_[PIPE_END_WRITE], | 127 return file_util::WriteFileDescriptor(shutdown_pipe_[PIPE_END_WRITE], |
| 129 message, sizeof(message)); | 128 message, sizeof(message)); |
| 130 } | 129 } |
| 131 | 130 |
| 132 void ProcessProxy::Close() { | 131 void ProcessProxy::Close() { |
| 133 if (!process_launched_) | 132 if (!process_launched_) |
| 134 return; | 133 return; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 199 |
| 201 if (pt_pair_[PT_SLAVE_FD] == -1) { | 200 if (pt_pair_[PT_SLAVE_FD] == -1) { |
| 202 CloseFdPair(pt_pair); | 201 CloseFdPair(pt_pair); |
| 203 return false; | 202 return false; |
| 204 } | 203 } |
| 205 | 204 |
| 206 return true; | 205 return true; |
| 207 } | 206 } |
| 208 | 207 |
| 209 bool ProcessProxy::LaunchProcess(const std::string& command, int slave_fd, | 208 bool ProcessProxy::LaunchProcess(const std::string& command, int slave_fd, |
| 210 pid_t *pid) { | 209 pid_t* pid) { |
| 211 // Redirect crosh process' output and input so we can read it. | 210 // Redirect crosh process' output and input so we can read it. |
| 212 base::file_handle_mapping_vector fds_mapping; | 211 base::FileHandleMappingVector fds_mapping; |
| 213 fds_mapping.push_back(std::make_pair(slave_fd, STDIN_FILENO)); | 212 fds_mapping.push_back(std::make_pair(slave_fd, STDIN_FILENO)); |
| 214 fds_mapping.push_back(std::make_pair(slave_fd, STDOUT_FILENO)); | 213 fds_mapping.push_back(std::make_pair(slave_fd, STDOUT_FILENO)); |
| 215 fds_mapping.push_back(std::make_pair(slave_fd, STDERR_FILENO)); | 214 fds_mapping.push_back(std::make_pair(slave_fd, STDERR_FILENO)); |
| 216 base::LaunchOptions options; | 215 base::LaunchOptions options; |
| 217 options.fds_to_remap = &fds_mapping; | 216 options.fds_to_remap = &fds_mapping; |
| 218 options.ctrl_terminal_fd = slave_fd; | 217 options.ctrl_terminal_fd = slave_fd; |
| 219 | 218 |
| 220 // Launch the process. | 219 // Launch the process. |
| 221 return base::LaunchProcess(CommandLine(FilePath(command)), options, pid); | 220 return base::LaunchProcess(CommandLine(FilePath(command)), options, pid); |
| 222 } | 221 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 241 | 240 |
| 242 void ProcessProxy::ClearAllFdPairs() { | 241 void ProcessProxy::ClearAllFdPairs() { |
| 243 ClearFdPair(pt_pair_); | 242 ClearFdPair(pt_pair_); |
| 244 ClearFdPair(shutdown_pipe_); | 243 ClearFdPair(shutdown_pipe_); |
| 245 } | 244 } |
| 246 | 245 |
| 247 void ProcessProxy::ClearFdPair(int* pipe) { | 246 void ProcessProxy::ClearFdPair(int* pipe) { |
| 248 pipe[PIPE_END_READ] = kInvalidFd; | 247 pipe[PIPE_END_READ] = kInvalidFd; |
| 249 pipe[PIPE_END_WRITE] = kInvalidFd; | 248 pipe[PIPE_END_WRITE] = kInvalidFd; |
| 250 } | 249 } |
| OLD | NEW |