14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#ifndef PROCESS_JS_CHILDPROCESS_H 174d6c458bSopenharmony_ci#define PROCESS_JS_CHILDPROCESS_H 184d6c458bSopenharmony_ci 194d6c458bSopenharmony_ci#include <string> 204d6c458bSopenharmony_ci#include <sys/types.h> 214d6c458bSopenharmony_ci 224d6c458bSopenharmony_ci#include "napi/native_api.h" 234d6c458bSopenharmony_ci#include "napi/native_node_api.h" 244d6c458bSopenharmony_cinamespace OHOS::JsSysModule::Process { 254d6c458bSopenharmony_ci struct WaitInfo { 264d6c458bSopenharmony_ci napi_async_work worker {nullptr}; 274d6c458bSopenharmony_ci napi_deferred deferred {nullptr}; 284d6c458bSopenharmony_ci int status {0}; 294d6c458bSopenharmony_ci }; 304d6c458bSopenharmony_ci 314d6c458bSopenharmony_ci struct StdInfo { 324d6c458bSopenharmony_ci napi_async_work worker {nullptr}; 334d6c458bSopenharmony_ci napi_deferred deferred {nullptr}; 344d6c458bSopenharmony_ci napi_value promise {nullptr}; 354d6c458bSopenharmony_ci std::string stdData {}; 364d6c458bSopenharmony_ci bool *isNeedRun {nullptr}; 374d6c458bSopenharmony_ci int64_t maxBuffSize {}; 384d6c458bSopenharmony_ci int fd {}; 394d6c458bSopenharmony_ci int pid {}; 404d6c458bSopenharmony_ci }; 414d6c458bSopenharmony_ci 424d6c458bSopenharmony_ci struct OptionsInfo { 434d6c458bSopenharmony_ci napi_async_work worker {nullptr}; 444d6c458bSopenharmony_ci bool *isNeedRun {nullptr}; 454d6c458bSopenharmony_ci int32_t timeout {}; 464d6c458bSopenharmony_ci int32_t killSignal {}; 474d6c458bSopenharmony_ci int64_t maxBuffer {}; 484d6c458bSopenharmony_ci pid_t pid {}; 494d6c458bSopenharmony_ci }; 504d6c458bSopenharmony_ci 514d6c458bSopenharmony_ci class ChildProcess { 524d6c458bSopenharmony_ci public: 534d6c458bSopenharmony_ci /** 544d6c458bSopenharmony_ci * Create child process object. 554d6c458bSopenharmony_ci */ 564d6c458bSopenharmony_ci explicit ChildProcess() {} 574d6c458bSopenharmony_ci 584d6c458bSopenharmony_ci /** 594d6c458bSopenharmony_ci * Close the target process. 604d6c458bSopenharmony_ci */ 614d6c458bSopenharmony_ci void Close(); 624d6c458bSopenharmony_ci 634d6c458bSopenharmony_ci /** 644d6c458bSopenharmony_ci * Send a signal to process. 654d6c458bSopenharmony_ci * 664d6c458bSopenharmony_ci * @param env NAPI environment parameters. 674d6c458bSopenharmony_ci * @param signal Number or string represents the signal sent. 684d6c458bSopenharmony_ci */ 694d6c458bSopenharmony_ci void Kill(napi_env env, const napi_value signo); 704d6c458bSopenharmony_ci 714d6c458bSopenharmony_ci /** 724d6c458bSopenharmony_ci * Wait for the child process to finish running, and return a promise object 734d6c458bSopenharmony_ci * whose value is the exit code of the child process. 744d6c458bSopenharmony_ci * 754d6c458bSopenharmony_ci * @param env NAPI environment parameters. 764d6c458bSopenharmony_ci */ 774d6c458bSopenharmony_ci napi_value Wait(napi_env env); 784d6c458bSopenharmony_ci 794d6c458bSopenharmony_ci /** 804d6c458bSopenharmony_ci * Get the standard output of the child process. 814d6c458bSopenharmony_ci * 824d6c458bSopenharmony_ci * @param env NAPI environment parameters. 834d6c458bSopenharmony_ci */ 844d6c458bSopenharmony_ci napi_value GetOutput(napi_env env) const; 854d6c458bSopenharmony_ci 864d6c458bSopenharmony_ci /** 874d6c458bSopenharmony_ci * Get the standard error output of the child process. 884d6c458bSopenharmony_ci * 894d6c458bSopenharmony_ci * @param env NAPI environment parameters. 904d6c458bSopenharmony_ci */ 914d6c458bSopenharmony_ci napi_value GetErrorOutput(napi_env env) const; 924d6c458bSopenharmony_ci 934d6c458bSopenharmony_ci /** 944d6c458bSopenharmony_ci * Get kill status. 954d6c458bSopenharmony_ci * 964d6c458bSopenharmony_ci * @param env NAPI environment parameters. 974d6c458bSopenharmony_ci */ 984d6c458bSopenharmony_ci napi_value GetKilled(napi_env env) const; 994d6c458bSopenharmony_ci 1004d6c458bSopenharmony_ci /** 1014d6c458bSopenharmony_ci * Get the specific pid value. 1024d6c458bSopenharmony_ci * 1034d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1044d6c458bSopenharmony_ci */ 1054d6c458bSopenharmony_ci napi_value Getpid(napi_env env) const; 1064d6c458bSopenharmony_ci 1074d6c458bSopenharmony_ci /** 1084d6c458bSopenharmony_ci * Get the parent process ID. 1094d6c458bSopenharmony_ci * 1104d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1114d6c458bSopenharmony_ci */ 1124d6c458bSopenharmony_ci napi_value Getppid(napi_env env) const; 1134d6c458bSopenharmony_ci 1144d6c458bSopenharmony_ci /** 1154d6c458bSopenharmony_ci * Get exit status. 1164d6c458bSopenharmony_ci * 1174d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1184d6c458bSopenharmony_ci */ 1194d6c458bSopenharmony_ci napi_value GetExitCode(napi_env env) const; 1204d6c458bSopenharmony_ci 1214d6c458bSopenharmony_ci /** 1224d6c458bSopenharmony_ci * Initialization option information. 1234d6c458bSopenharmony_ci * 1244d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1254d6c458bSopenharmony_ci * @param options Option parameter. 1264d6c458bSopenharmony_ci */ 1274d6c458bSopenharmony_ci void InitOptionsInfo(napi_env env, napi_value options); 1284d6c458bSopenharmony_ci 1294d6c458bSopenharmony_ci /** 1304d6c458bSopenharmony_ci * Start a subprocess to execute shell commands. 1314d6c458bSopenharmony_ci * 1324d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1334d6c458bSopenharmony_ci * @param command Command parameters. 1344d6c458bSopenharmony_ci */ 1354d6c458bSopenharmony_ci void Spawn(napi_env env, napi_value command); 1364d6c458bSopenharmony_ci 1374d6c458bSopenharmony_ci /** 1384d6c458bSopenharmony_ci * ChildProcess destructor. 1394d6c458bSopenharmony_ci */ 1404d6c458bSopenharmony_ci virtual ~ChildProcess(); 1414d6c458bSopenharmony_ci 1424d6c458bSopenharmony_ci private: 1434d6c458bSopenharmony_ci static void ReadStdOut(napi_env env, void* data); 1444d6c458bSopenharmony_ci static void EndStdOut(napi_env env, napi_status status, void* buffer); 1454d6c458bSopenharmony_ci static void ReadStdErr(napi_env env, void* data); 1464d6c458bSopenharmony_ci static void EndStdErr(napi_env env, napi_status status, void* buffer); 1474d6c458bSopenharmony_ci static void TimeoutListener(napi_env env, void* data); 1484d6c458bSopenharmony_ci std::string RequireStrValue(napi_env env, const napi_value strValue); 1494d6c458bSopenharmony_ci int GetValidSignal(napi_env env, const napi_value signo); 1504d6c458bSopenharmony_ci void CreateWorker(napi_env env); 1514d6c458bSopenharmony_ci 1524d6c458bSopenharmony_ci OptionsInfo* optionsInfo_ {nullptr}; 1534d6c458bSopenharmony_ci StdInfo* stdOutInfo_ {nullptr}; 1544d6c458bSopenharmony_ci StdInfo* stdErrInfo_ {nullptr}; 1554d6c458bSopenharmony_ci 1564d6c458bSopenharmony_ci int exitCode_ {}; 1574d6c458bSopenharmony_ci int stdOutFd_[2] {}; 1584d6c458bSopenharmony_ci int stdErrFd_[2] {}; 1594d6c458bSopenharmony_ci int ppid_ {}; 1604d6c458bSopenharmony_ci 1614d6c458bSopenharmony_ci bool isNeedRun_ {true}; 1624d6c458bSopenharmony_ci bool killed_ {}; 1634d6c458bSopenharmony_ci bool isWait_ {true}; 1644d6c458bSopenharmony_ci }; 1654d6c458bSopenharmony_ci} // namespace OHOS::JsSysModule::Process 1664d6c458bSopenharmony_ci#endif // PROCESS_JS_CHILDPROCESS_H 167