1/*
2 * Copyright (c) 2021-2024 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#ifndef DFX_FAULTLOGGERD_H
16#define DFX_FAULTLOGGERD_H
17
18#include <cinttypes>
19#include <map>
20#include <string>
21
22#include "faultloggerd_client.h"
23#include "fault_logger_pipe.h"
24
25namespace OHOS {
26namespace HiviewDFX {
27class DumpStats {
28public:
29    int32_t pid = 0;
30    uint64_t requestTime = 0;
31    uint64_t signalTime = 0;
32    uint64_t processdumpStartTime = 0;
33    uint64_t processdumpFinishTime = 0;
34    uint64_t dumpCatcherFinishTime = 0;
35    int32_t result = 0;
36    std::string summary;
37    std::string callerProcessName;
38    std::string callerElfName;
39    std::string targetProcessName;
40};
41class FaultLoggerDaemon {
42public:
43    FaultLoggerDaemon();
44    virtual ~FaultLoggerDaemon() {};
45    int32_t StartServer();
46    virtual bool InitEnvironment();
47    void RecordFileCreation(int32_t type, int32_t pid);
48    void ClearTimeOutRecords();
49    bool IsCrashed(int32_t pid);
50
51    int32_t CreateFileForRequest(int32_t type, int32_t pid, int32_t tid, uint64_t time) const;
52#ifdef FAULTLOGGERD_FUZZER
53    bool HandleStaticForFuzzer(int32_t type, uint32_t callerUid);
54    void HandleRequestForFuzzer(int32_t epollFd, int32_t connectionFd,
55                                const FaultLoggerdRequest *requestConst, FaultLoggerdRequest *request);
56#endif
57
58private:
59    void AddEvent(int32_t epollFd, int32_t addFd, uint32_t event);
60    void DelEvent(int32_t epollFd, int32_t delFd, uint32_t event);
61    void HandleAccept(int32_t epollFd, int32_t socketFd);
62    void HandleRequest(int32_t epollFd, int32_t connectionFd);
63
64    void RemoveTempFileIfNeed() const;
65    void HandleDefaultClientRequest(int32_t connectionFd, const FaultLoggerdRequest* request);
66    void HandleLogFileDesClientRequest(int32_t connectionFd, const FaultLoggerdRequest* request);
67    void HandlePrintTHilogClientRequest(int32_t const connectionFd, FaultLoggerdRequest* request);
68    FaultLoggerCheckPermissionResp SecurityCheck(int32_t connectionFd, FaultLoggerdRequest* request);
69    void HandlePermissionRequest(int32_t connectionFd, FaultLoggerdRequest* request);
70    void HandleSdkDumpRequest(int32_t connectionFd, FaultLoggerdRequest* request);
71    void HandlePipeFdClientRequest(int32_t connectionFd, FaultLoggerdRequest* request);
72    void HandleReadBuf(int& fd, int32_t connectionFd, FaultLoggerdRequest* request,
73        FaultLoggerPipe2* faultLoggerPipe);
74    void HandleWriteBuf(int& fd, FaultLoggerPipe2* faultLoggerPipe);
75    void HandleReadRes(int& fd, int32_t connectionFd, FaultLoggerdRequest* request,
76        FaultLoggerPipe2* faultLoggerPipe);
77    void HandleWriteRes(int& fd, FaultLoggerPipe2* faultLoggerPipe);
78    void HandleJsonReadBuf(int& fd, int32_t connectionFd, FaultLoggerdRequest* request,
79        FaultLoggerPipe2* faultLoggerPipe);
80    void HandleJsonWriteBuf(int& fd, FaultLoggerPipe2* faultLoggerPipe);
81    void HandleJsonReadRes(int& fd, int32_t connectionFd, FaultLoggerdRequest* request,
82        FaultLoggerPipe2* faultLoggerPipe);
83    void HandleJsonWriteRes(int& fd, FaultLoggerPipe2* faultLoggerPipe);
84    void HandleDelete(FaultLoggerdRequest* request);
85    void HandleRequestByPipeType(int& fd, int32_t connectionFd, FaultLoggerdRequest* request,
86        FaultLoggerPipe2* faultLoggerPipe);
87    void HandleExceptionRequest(int32_t connectionFd, FaultLoggerdRequest* request);
88    void HandleRequestByClientType(int32_t connectionFd, FaultLoggerdRequest* request);
89    bool CheckRequestCredential(int32_t connectionFd, FaultLoggerdRequest* request);
90    virtual bool CreateSockets();
91    virtual bool CreateEventFd();
92    void CleanupSockets();
93    virtual void WaitForRequest();
94    void CleanupEventFd();
95    void HandleDumpStats(int32_t connectionFd, FaultLoggerdStatsRequest* request);
96    void RemoveTimeoutDumpStats();
97    void ReportDumpStats(const DumpStats& stat);
98
99private:
100    int32_t defaultSocketFd_ = -1;
101    int32_t crashSocketFd_ = -1;
102    int32_t sdkdumpSocketFd_ = -1;
103    int32_t eventFd_ = -1;
104    bool isBeta_ = false;
105    std::map<int32_t, int32_t> connectionMap_;
106    std::map<int32_t, int64_t> crashTimeMap_;
107    std::vector<DumpStats> stats_;
108};
109} // namespace HiviewDFX
110} // namespace OHOS
111#endif
112