1 /* 2 * Copyright (c) 2025 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 FAULT_COREDUMP_SERVICE_H 17 #define FAULT_COREDUMP_SERVICE_H 18 19 #include "csignal" 20 #include "cstdint" 21 #include "fault_logger_service.h" 22 23 namespace OHOS { 24 namespace HiviewDFX { 25 struct CoredumpProcessInfo { 26 int32_t processDumpPid; 27 int32_t coredumpSocketId; 28 int endTime; 29 bool cancelFlag; 30 CoredumpProcessInfoCoredumpProcessInfo31 CoredumpProcessInfo(int32_t processDump, int32_t connectionFd, int time, bool flag) 32 : processDumpPid(processDump), coredumpSocketId(connectionFd), endTime(time), cancelFlag(flag) {} 33 }; 34 35 class RecorderProcessMap { 36 public: 37 RecorderProcessMap(const RecorderProcessMap&) = delete; 38 RecorderProcessMap& operator=(const RecorderProcessMap&) = delete; 39 40 bool IsEmpty(); 41 bool HasTargetPid(int32_t targetPid); 42 void AddProcessMap(int32_t targetPid, const CoredumpProcessInfo& processInfo); 43 bool ClearTargetPid(int32_t targetPid); 44 bool GetCoredumpSocketId(int32_t targetPid, int32_t& coredumpSocketId); 45 bool GetCancelFlag(int32_t targetPid, bool& flag); 46 bool GetProcessDumpPid(int32_t targetPid, int32_t& processDumpPid); 47 bool SetCancelFlag(int32_t targetPid, bool flag); 48 bool SetProcessDumpPid(int32_t targetPid, int32_t processDumpPid); 49 static RecorderProcessMap& GetInstance(); 50 51 private: 52 RecorderProcessMap() = default; 53 std::unordered_map<int32_t, CoredumpProcessInfo> coredumpProcessMap; 54 }; 55 56 #ifndef is_ohos_lite 57 class CoredumpService : public FaultLoggerService<CoreDumpRequestData> { 58 public: CoredumpService()59 CoredumpService() : coredumpRecorder(RecorderProcessMap::GetInstance()) {} 60 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 61 const CoreDumpRequestData& requestData) override; 62 63 private: 64 static int32_t Filter(const std::string& socketName, const CoreDumpRequestData& requestData, uint32_t uid); 65 void StartDelayTask(std::function<void()> workFunc, int32_t delayTime); 66 int32_t DoCoredumpRequest(const std::string& socketName, int32_t connectionFd, 67 const CoreDumpRequestData& requestData); 68 int32_t CancelCoredumpRequest(int32_t connectionFd, const CoreDumpRequestData& requestData); 69 RecorderProcessMap& coredumpRecorder; 70 }; 71 72 73 class CoredumpStatusService : public FaultLoggerService<CoreDumpStatusData> { 74 public: CoredumpStatusService()75 CoredumpStatusService() : coredumpRecorder(RecorderProcessMap::GetInstance()) {} 76 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 77 const CoreDumpStatusData& requestData) override; 78 79 private: 80 bool HandleProcessDumpPid(int32_t targetPid, int32_t processDumpPid); 81 RecorderProcessMap& coredumpRecorder; 82 }; 83 #endif 84 } 85 } 86 87 #endif