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 |