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 3 // found in the LICENSE file. 4 5 #ifndef CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_H_ 6 #define CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_H_ 7 8 #include <fcntl.h> 9 #include <signal.h> 10 11 #include <cstdio> 12 #include <string> 13 14 #include "base/memory/ref_counted.h" 15 #include "chromeos/process_proxy/process_output_watcher.h" 16 17 namespace base { 18 class TaskRunner; 19 class Thread; 20 } // namespace base 21 22 namespace chromeos { 23 24 // Proxy to a single ChromeOS process. 25 // This is refcounted. Note that output watcher, when it gets triggered owns a 26 // a callback with ref to this, so in order for this to be freed, the watcher 27 // must be destroyed. This is done in Close. 28 class ProcessProxy : public base::RefCountedThreadSafe<ProcessProxy> { 29 public: 30 ProcessProxy(); 31 32 // Opens a process using command |command|. |pid| is set to new process' pid. 33 bool Open(const std::string& command, pid_t* pid); 34 35 // Triggers watcher object on |watch_thread|. |watch_thread| gets blocked, so 36 // it should not be one of commonly used threads. It should be thread created 37 // specifically for running process output watcher. 38 bool StartWatchingOnThread(base::Thread* watch_thread, 39 const ProcessOutputCallback& callback); 40 41 // Sends some data to the process. 42 bool Write(const std::string& text); 43 44 // Closes the process. 45 // Must be called if we want this to be eventually deleted. 46 void Close(); 47 48 // Notifies underlaying process of terminal size change. 49 bool OnTerminalResize(int width, int height); 50 51 private: 52 friend class base::RefCountedThreadSafe<ProcessProxy>; 53 // We want this be used as ref counted object only. 54 ~ProcessProxy(); 55 56 // Create master and slave end of pseudo terminal that will be used to 57 // communicate with process. 58 // pt_pair[0] -> master, pt_pair[1] -> slave. 59 // pt_pair must be allocated (to size at least 2). 60 bool CreatePseudoTerminalPair(int *pt_pair); 61 62 bool LaunchProcess(const std::string& command, int slave_fd, pid_t* pid); 63 64 // Gets called by output watcher when the process writes something to its 65 // output streams. 66 void OnProcessOutput(ProcessOutputType type, const std::string& output); 67 void CallOnProcessOutputCallback(ProcessOutputType type, 68 const std::string& output); 69 70 bool StopWatching(); 71 72 // Methods for cleaning up pipes. 73 void CloseAllFdPairs(); 74 // Expects array of 2 file descripters. 75 void CloseFdPair(int* pipe); 76 // Expects pointer to single file descriptor. 77 void CloseFd(int* fd); 78 void ClearAllFdPairs(); 79 // Expects array of 2 file descripters. 80 void ClearFdPair(int* pipe); 81 82 bool process_launched_; 83 pid_t pid_; 84 85 bool callback_set_; 86 ProcessOutputCallback callback_; 87 scoped_refptr<base::TaskRunner> callback_runner_; 88 89 bool watcher_started_; 90 91 int pt_pair_[2]; 92 int shutdown_pipe_[2]; 93 94 DISALLOW_COPY_AND_ASSIGN(ProcessProxy); 95 }; 96 97 } // namespace chromeos 98 99 #endif // CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_H_ 100