1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef PROCESS_JS_CHILDPROCESS_H 17 #define PROCESS_JS_CHILDPROCESS_H 18 19 #include <string> 20 #include <sys/types.h> 21 22 #include "napi/native_api.h" 23 #include "napi/native_node_api.h" 24 namespace OHOS::JsSysModule::Process { 25 struct WaitInfo { 26 napi_async_work worker {nullptr}; 27 napi_deferred deferred {nullptr}; 28 int status {0}; 29 }; 30 31 struct StdInfo { 32 napi_async_work worker {nullptr}; 33 napi_deferred deferred {nullptr}; 34 napi_value promise {nullptr}; 35 std::string stdData {}; 36 bool *isNeedRun {nullptr}; 37 int64_t maxBuffSize {}; 38 int fd {}; 39 int pid {}; 40 }; 41 42 struct OptionsInfo { 43 napi_async_work worker {nullptr}; 44 bool *isNeedRun {nullptr}; 45 int32_t timeout {}; 46 int32_t killSignal {}; 47 int64_t maxBuffer {}; 48 pid_t pid {}; 49 }; 50 51 class ChildProcess { 52 public: 53 /** 54 * Create child process object. 55 */ ChildProcess()56 explicit ChildProcess() {} 57 58 /** 59 * Close the target process. 60 */ 61 void Close(); 62 63 /** 64 * Send a signal to process. 65 * 66 * @param env NAPI environment parameters. 67 * @param signal Number or string represents the signal sent. 68 */ 69 void Kill(napi_env env, const napi_value signo); 70 71 /** 72 * Wait for the child process to finish running, and return a promise object 73 * whose value is the exit code of the child process. 74 * 75 * @param env NAPI environment parameters. 76 */ 77 napi_value Wait(napi_env env); 78 79 /** 80 * Get the standard output of the child process. 81 * 82 * @param env NAPI environment parameters. 83 */ 84 napi_value GetOutput(napi_env env) const; 85 86 /** 87 * Get the standard error output of the child process. 88 * 89 * @param env NAPI environment parameters. 90 */ 91 napi_value GetErrorOutput(napi_env env) const; 92 93 /** 94 * Get kill status. 95 * 96 * @param env NAPI environment parameters. 97 */ 98 napi_value GetKilled(napi_env env) const; 99 100 /** 101 * Get the specific pid value. 102 * 103 * @param env NAPI environment parameters. 104 */ 105 napi_value Getpid(napi_env env) const; 106 107 /** 108 * Get the parent process ID. 109 * 110 * @param env NAPI environment parameters. 111 */ 112 napi_value Getppid(napi_env env) const; 113 114 /** 115 * Get exit status. 116 * 117 * @param env NAPI environment parameters. 118 */ 119 napi_value GetExitCode(napi_env env) const; 120 121 /** 122 * Initialization option information. 123 * 124 * @param env NAPI environment parameters. 125 * @param options Option parameter. 126 */ 127 void InitOptionsInfo(napi_env env, napi_value options); 128 129 /** 130 * Start a subprocess to execute shell commands. 131 * 132 * @param env NAPI environment parameters. 133 * @param command Command parameters. 134 */ 135 void Spawn(napi_env env, napi_value command); 136 137 /** 138 * ChildProcess destructor. 139 */ 140 virtual ~ChildProcess(); 141 142 private: 143 static void ReadStdOut(napi_env env, void* data); 144 static void EndStdOut(napi_env env, napi_status status, void* buffer); 145 static void ReadStdErr(napi_env env, void* data); 146 static void EndStdErr(napi_env env, napi_status status, void* buffer); 147 static void TimeoutListener(napi_env env, void* data); 148 std::string RequireStrValue(napi_env env, const napi_value strValue); 149 int GetValidSignal(napi_env env, const napi_value signo); 150 void CreateWorker(napi_env env); 151 152 OptionsInfo* optionsInfo_ {nullptr}; 153 StdInfo* stdOutInfo_ {nullptr}; 154 StdInfo* stdErrInfo_ {nullptr}; 155 156 int exitCode_ {}; 157 int stdOutFd_[2] {}; 158 int stdErrFd_[2] {}; 159 int ppid_ {}; 160 161 bool isNeedRun_ {true}; 162 bool killed_ {}; 163 bool isWait_ {true}; 164 }; 165 } // namespace OHOS::JsSysModule::Process 166 #endif // PROCESS_JS_CHILDPROCESS_H 167