1800b99b8Sopenharmony_ci/*
2800b99b8Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License.
5800b99b8Sopenharmony_ci * You may obtain a copy of the License at
6800b99b8Sopenharmony_ci *
7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8800b99b8Sopenharmony_ci *
9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and
13800b99b8Sopenharmony_ci * limitations under the License.
14800b99b8Sopenharmony_ci */
15800b99b8Sopenharmony_ci#include "faultloggerd_client.h"
16800b99b8Sopenharmony_ci
17800b99b8Sopenharmony_ci#include <climits>
18800b99b8Sopenharmony_ci#include <cstdint>
19800b99b8Sopenharmony_ci#include <cstdio>
20800b99b8Sopenharmony_ci#include <cstdlib>
21800b99b8Sopenharmony_ci#include <securec.h>
22800b99b8Sopenharmony_ci#include <unistd.h>
23800b99b8Sopenharmony_ci
24800b99b8Sopenharmony_ci#include <sys/socket.h>
25800b99b8Sopenharmony_ci#include <sys/syscall.h>
26800b99b8Sopenharmony_ci#include <sys/un.h>
27800b99b8Sopenharmony_ci#include <sys/stat.h>
28800b99b8Sopenharmony_ci
29800b99b8Sopenharmony_ci#include "dfx_cutil.h"
30800b99b8Sopenharmony_ci#include "dfx_define.h"
31800b99b8Sopenharmony_ci#include "dfx_log.h"
32800b99b8Sopenharmony_ci#include "dfx_util.h"
33800b99b8Sopenharmony_ci#include "faultloggerd_socket.h"
34800b99b8Sopenharmony_ci
35800b99b8Sopenharmony_cistatic const int32_t SOCKET_TIMEOUT = 5;
36800b99b8Sopenharmony_ci
37800b99b8Sopenharmony_cistatic std::string GetSocketConnectionName()
38800b99b8Sopenharmony_ci{
39800b99b8Sopenharmony_ci    char content[NAME_BUF_LEN];
40800b99b8Sopenharmony_ci    GetProcessName(content, sizeof(content));
41800b99b8Sopenharmony_ci    if (std::string(content).find("processdump") != std::string::npos) {
42800b99b8Sopenharmony_ci        return std::string(SERVER_CRASH_SOCKET_NAME);
43800b99b8Sopenharmony_ci    }
44800b99b8Sopenharmony_ci    return std::string(SERVER_SOCKET_NAME);
45800b99b8Sopenharmony_ci}
46800b99b8Sopenharmony_ci
47800b99b8Sopenharmony_ciint32_t RequestFileDescriptor(int32_t type)
48800b99b8Sopenharmony_ci{
49800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
50800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(request));
51800b99b8Sopenharmony_ci    request.type = type;
52800b99b8Sopenharmony_ci    request.pid = getpid();
53800b99b8Sopenharmony_ci    request.tid = gettid();
54800b99b8Sopenharmony_ci    request.uid = getuid();
55800b99b8Sopenharmony_ci    request.time = OHOS::HiviewDFX::GetTimeMilliSeconds();
56800b99b8Sopenharmony_ci    return RequestFileDescriptorEx(&request);
57800b99b8Sopenharmony_ci}
58800b99b8Sopenharmony_ci
59800b99b8Sopenharmony_ciint32_t RequestLogFileDescriptor(struct FaultLoggerdRequest *request)
60800b99b8Sopenharmony_ci{
61800b99b8Sopenharmony_ci    if (request == nullptr) {
62800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: nullptr request", __LINE__);
63800b99b8Sopenharmony_ci        return -1;
64800b99b8Sopenharmony_ci    }
65800b99b8Sopenharmony_ci    request->clientType = (int32_t)FaultLoggerClientType::LOG_FILE_DES_CLIENT;
66800b99b8Sopenharmony_ci    return RequestFileDescriptorEx(request);
67800b99b8Sopenharmony_ci}
68800b99b8Sopenharmony_ci
69800b99b8Sopenharmony_ciint32_t RequestFileDescriptorEx(const struct FaultLoggerdRequest *request)
70800b99b8Sopenharmony_ci{
71800b99b8Sopenharmony_ci    if (request == nullptr) {
72800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: nullptr request", __LINE__);
73800b99b8Sopenharmony_ci        return -1;
74800b99b8Sopenharmony_ci    }
75800b99b8Sopenharmony_ci
76800b99b8Sopenharmony_ci    int sockfd;
77800b99b8Sopenharmony_ci    std::string name = GetSocketConnectionName();
78800b99b8Sopenharmony_ci    if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
79800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
80800b99b8Sopenharmony_ci        return -1;
81800b99b8Sopenharmony_ci    }
82800b99b8Sopenharmony_ci
83800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(write(sockfd, request, sizeof(struct FaultLoggerdRequest)));
84800b99b8Sopenharmony_ci    int fd = ReadFileDescriptorFromSocket(sockfd);
85800b99b8Sopenharmony_ci    DFXLOGD("RequestFileDescriptorEx(%{public}d).", fd);
86800b99b8Sopenharmony_ci    close(sockfd);
87800b99b8Sopenharmony_ci    return fd;
88800b99b8Sopenharmony_ci}
89800b99b8Sopenharmony_ci
90800b99b8Sopenharmony_cistatic bool CheckReadResp(int sockfd)
91800b99b8Sopenharmony_ci{
92800b99b8Sopenharmony_ci    char ControlBuffer[SOCKET_BUFFER_SIZE] = {0};
93800b99b8Sopenharmony_ci    ssize_t nread = OHOS_TEMP_FAILURE_RETRY(read(sockfd, ControlBuffer, sizeof(ControlBuffer) - 1));
94800b99b8Sopenharmony_ci    if (nread != static_cast<ssize_t>(strlen(FAULTLOGGER_DAEMON_RESP))) {
95800b99b8Sopenharmony_ci        DFXLOGE("nread: %{public}zd.", nread);
96800b99b8Sopenharmony_ci        return false;
97800b99b8Sopenharmony_ci    }
98800b99b8Sopenharmony_ci    return true;
99800b99b8Sopenharmony_ci}
100800b99b8Sopenharmony_ci
101800b99b8Sopenharmony_cistatic int32_t RequestFileDescriptorByCheck(const struct FaultLoggerdRequest *request)
102800b99b8Sopenharmony_ci{
103800b99b8Sopenharmony_ci    int32_t fd = -1;
104800b99b8Sopenharmony_ci    if (request == nullptr) {
105800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: nullptr request", __LINE__);
106800b99b8Sopenharmony_ci        return -1;
107800b99b8Sopenharmony_ci    }
108800b99b8Sopenharmony_ci
109800b99b8Sopenharmony_ci    int sockfd = -1;
110800b99b8Sopenharmony_ci    do {
111800b99b8Sopenharmony_ci        std::string name = GetSocketConnectionName();
112800b99b8Sopenharmony_ci        if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
113800b99b8Sopenharmony_ci            DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
114800b99b8Sopenharmony_ci            break;
115800b99b8Sopenharmony_ci        }
116800b99b8Sopenharmony_ci
117800b99b8Sopenharmony_ci        OHOS_TEMP_FAILURE_RETRY(write(sockfd, request, sizeof(struct FaultLoggerdRequest)));
118800b99b8Sopenharmony_ci
119800b99b8Sopenharmony_ci        if (!CheckReadResp(sockfd)) {
120800b99b8Sopenharmony_ci            break;
121800b99b8Sopenharmony_ci        }
122800b99b8Sopenharmony_ci
123800b99b8Sopenharmony_ci        int data = 12345;
124800b99b8Sopenharmony_ci        if (!SendMsgIovToSocket(sockfd, reinterpret_cast<void *>(&data), sizeof(data))) {
125800b99b8Sopenharmony_ci            DFXLOGE("%{public}s :: Failed to sendmsg.", __func__);
126800b99b8Sopenharmony_ci            break;
127800b99b8Sopenharmony_ci        }
128800b99b8Sopenharmony_ci
129800b99b8Sopenharmony_ci        fd = ReadFileDescriptorFromSocket(sockfd);
130800b99b8Sopenharmony_ci        DFXLOGD("RequestFileDescriptorByCheck(%{public}d).", fd);
131800b99b8Sopenharmony_ci    } while (false);
132800b99b8Sopenharmony_ci    close(sockfd);
133800b99b8Sopenharmony_ci    return fd;
134800b99b8Sopenharmony_ci}
135800b99b8Sopenharmony_ci
136800b99b8Sopenharmony_cistatic int SendUidToServer(int sockfd)
137800b99b8Sopenharmony_ci{
138800b99b8Sopenharmony_ci    int mRsp = (int)FaultLoggerCheckPermissionResp::CHECK_PERMISSION_REJECT;
139800b99b8Sopenharmony_ci
140800b99b8Sopenharmony_ci    int data = 12345;
141800b99b8Sopenharmony_ci    if (!SendMsgIovToSocket(sockfd, reinterpret_cast<void *>(&data), sizeof(data))) {
142800b99b8Sopenharmony_ci        DFXLOGE("%{public}s :: Failed to sendmsg.", __func__);
143800b99b8Sopenharmony_ci        return mRsp;
144800b99b8Sopenharmony_ci    }
145800b99b8Sopenharmony_ci
146800b99b8Sopenharmony_ci    char recvbuf[SOCKET_BUFFER_SIZE] = {'\0'};
147800b99b8Sopenharmony_ci    ssize_t count = OHOS_TEMP_FAILURE_RETRY(recv(sockfd, recvbuf, sizeof(recvbuf), 0));
148800b99b8Sopenharmony_ci    if (count < 0) {
149800b99b8Sopenharmony_ci        DFXLOGE("%{public}s :: Failed to recv.", __func__);
150800b99b8Sopenharmony_ci        return mRsp;
151800b99b8Sopenharmony_ci    }
152800b99b8Sopenharmony_ci
153800b99b8Sopenharmony_ci    mRsp = atoi(recvbuf);
154800b99b8Sopenharmony_ci    return mRsp;
155800b99b8Sopenharmony_ci}
156800b99b8Sopenharmony_ci
157800b99b8Sopenharmony_cibool CheckConnectStatus()
158800b99b8Sopenharmony_ci{
159800b99b8Sopenharmony_ci    int sockfd = -1;
160800b99b8Sopenharmony_ci    std::string name = GetSocketConnectionName();
161800b99b8Sopenharmony_ci    if (StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
162800b99b8Sopenharmony_ci        close(sockfd);
163800b99b8Sopenharmony_ci        return true;
164800b99b8Sopenharmony_ci    }
165800b99b8Sopenharmony_ci    return false;
166800b99b8Sopenharmony_ci}
167800b99b8Sopenharmony_ci
168800b99b8Sopenharmony_cistatic int SendRequestToServer(const FaultLoggerdRequest &request)
169800b99b8Sopenharmony_ci{
170800b99b8Sopenharmony_ci    int sockfd = -1;
171800b99b8Sopenharmony_ci    int resRsp = (int)FaultLoggerCheckPermissionResp::CHECK_PERMISSION_REJECT;
172800b99b8Sopenharmony_ci    do {
173800b99b8Sopenharmony_ci        std::string name = GetSocketConnectionName();
174800b99b8Sopenharmony_ci        if (request.clientType == FaultLoggerClientType::SDK_DUMP_CLIENT) {
175800b99b8Sopenharmony_ci            name = std::string(SERVER_SDKDUMP_SOCKET_NAME);
176800b99b8Sopenharmony_ci        }
177800b99b8Sopenharmony_ci
178800b99b8Sopenharmony_ci        if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
179800b99b8Sopenharmony_ci            DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
180800b99b8Sopenharmony_ci            break;
181800b99b8Sopenharmony_ci        }
182800b99b8Sopenharmony_ci        if (OHOS_TEMP_FAILURE_RETRY(write(sockfd, &request,
183800b99b8Sopenharmony_ci            sizeof(struct FaultLoggerdRequest))) != static_cast<long>(sizeof(request))) {
184800b99b8Sopenharmony_ci            DFXLOGE("write failed.");
185800b99b8Sopenharmony_ci            break;
186800b99b8Sopenharmony_ci        }
187800b99b8Sopenharmony_ci
188800b99b8Sopenharmony_ci        if (!CheckReadResp(sockfd)) {
189800b99b8Sopenharmony_ci            break;
190800b99b8Sopenharmony_ci        }
191800b99b8Sopenharmony_ci        resRsp = SendUidToServer(sockfd);
192800b99b8Sopenharmony_ci    } while (false);
193800b99b8Sopenharmony_ci
194800b99b8Sopenharmony_ci    close(sockfd);
195800b99b8Sopenharmony_ci    DFXLOGI("SendRequestToServer :: resRsp(%{public}d).", resRsp);
196800b99b8Sopenharmony_ci    return resRsp;
197800b99b8Sopenharmony_ci}
198800b99b8Sopenharmony_ci
199800b99b8Sopenharmony_cibool RequestCheckPermission(int32_t pid)
200800b99b8Sopenharmony_ci{
201800b99b8Sopenharmony_ci    DFXLOGI("RequestCheckPermission :: %{public}d.", pid);
202800b99b8Sopenharmony_ci    if (pid <= 0) {
203800b99b8Sopenharmony_ci        return false;
204800b99b8Sopenharmony_ci    }
205800b99b8Sopenharmony_ci
206800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
207800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(request));
208800b99b8Sopenharmony_ci
209800b99b8Sopenharmony_ci    request.pid = pid;
210800b99b8Sopenharmony_ci    request.clientType = (int32_t)FaultLoggerClientType::PERMISSION_CLIENT;
211800b99b8Sopenharmony_ci
212800b99b8Sopenharmony_ci    bool ret = false;
213800b99b8Sopenharmony_ci    if (SendRequestToServer(request) == (int)FaultLoggerCheckPermissionResp::CHECK_PERMISSION_PASS) {
214800b99b8Sopenharmony_ci        ret = true;
215800b99b8Sopenharmony_ci    }
216800b99b8Sopenharmony_ci    return ret;
217800b99b8Sopenharmony_ci}
218800b99b8Sopenharmony_ci
219800b99b8Sopenharmony_ciint RequestSdkDump(int32_t pid, int32_t tid, int timeout)
220800b99b8Sopenharmony_ci{
221800b99b8Sopenharmony_ci    return RequestSdkDumpJson(pid, tid, false, timeout);
222800b99b8Sopenharmony_ci}
223800b99b8Sopenharmony_ci
224800b99b8Sopenharmony_ciint RequestSdkDumpJson(int32_t pid, int32_t tid, bool isJson, int timeout)
225800b99b8Sopenharmony_ci{
226800b99b8Sopenharmony_ci    DFXLOGI("RequestSdkDumpJson :: pid(%{public}d), tid(%{public}d).", pid, tid);
227800b99b8Sopenharmony_ci    if (pid <= 0 || tid < 0) {
228800b99b8Sopenharmony_ci        return -1;
229800b99b8Sopenharmony_ci    }
230800b99b8Sopenharmony_ci
231800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
232800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(request));
233800b99b8Sopenharmony_ci    request.isJson = isJson;
234800b99b8Sopenharmony_ci    request.sigCode = DUMP_TYPE_REMOTE;
235800b99b8Sopenharmony_ci    request.pid = pid;
236800b99b8Sopenharmony_ci    request.tid = tid;
237800b99b8Sopenharmony_ci    request.callerPid = getpid();
238800b99b8Sopenharmony_ci    request.callerTid = gettid();
239800b99b8Sopenharmony_ci    request.clientType = (int32_t)FaultLoggerClientType::SDK_DUMP_CLIENT;
240800b99b8Sopenharmony_ci    request.time = OHOS::HiviewDFX::GetTimeMilliSeconds();
241800b99b8Sopenharmony_ci    request.endTime = GetAbsTimeMilliSeconds() + static_cast<uint64_t>(timeout);
242800b99b8Sopenharmony_ci
243800b99b8Sopenharmony_ci    return SendRequestToServer(request);
244800b99b8Sopenharmony_ci}
245800b99b8Sopenharmony_ci
246800b99b8Sopenharmony_ciint RequestPrintTHilog(const char *msg, int length)
247800b99b8Sopenharmony_ci{
248800b99b8Sopenharmony_ci    if (length >= LINE_BUF_SIZE) {
249800b99b8Sopenharmony_ci        return -1;
250800b99b8Sopenharmony_ci    }
251800b99b8Sopenharmony_ci
252800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
253800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(request));
254800b99b8Sopenharmony_ci    request.clientType = (int32_t)FaultLoggerClientType::PRINT_T_HILOG_CLIENT;
255800b99b8Sopenharmony_ci    request.pid = getpid();
256800b99b8Sopenharmony_ci    request.uid = getuid();
257800b99b8Sopenharmony_ci    int sockfd = -1;
258800b99b8Sopenharmony_ci    do {
259800b99b8Sopenharmony_ci        std::string name = GetSocketConnectionName();
260800b99b8Sopenharmony_ci        if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
261800b99b8Sopenharmony_ci            DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
262800b99b8Sopenharmony_ci            break;
263800b99b8Sopenharmony_ci        }
264800b99b8Sopenharmony_ci
265800b99b8Sopenharmony_ci        if (OHOS_TEMP_FAILURE_RETRY(write(sockfd, &request,
266800b99b8Sopenharmony_ci            sizeof(struct FaultLoggerdRequest))) != static_cast<long>(sizeof(request))) {
267800b99b8Sopenharmony_ci            break;
268800b99b8Sopenharmony_ci        }
269800b99b8Sopenharmony_ci
270800b99b8Sopenharmony_ci        if (!CheckReadResp(sockfd)) {
271800b99b8Sopenharmony_ci            break;
272800b99b8Sopenharmony_ci        }
273800b99b8Sopenharmony_ci
274800b99b8Sopenharmony_ci        int nwrite = OHOS_TEMP_FAILURE_RETRY(write(sockfd, msg, strlen(msg)));
275800b99b8Sopenharmony_ci        if (nwrite != static_cast<long>(strlen(msg))) {
276800b99b8Sopenharmony_ci            DFXLOGE("nwrite: %{public}d.", nwrite);
277800b99b8Sopenharmony_ci            break;
278800b99b8Sopenharmony_ci        }
279800b99b8Sopenharmony_ci        close(sockfd);
280800b99b8Sopenharmony_ci        return 0;
281800b99b8Sopenharmony_ci    } while (false);
282800b99b8Sopenharmony_ci    close(sockfd);
283800b99b8Sopenharmony_ci    return -1;
284800b99b8Sopenharmony_ci}
285800b99b8Sopenharmony_ci
286800b99b8Sopenharmony_ciint32_t RequestPipeFd(int32_t pid, int32_t pipeType)
287800b99b8Sopenharmony_ci{
288800b99b8Sopenharmony_ci    if (pipeType < static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_READ_BUF) ||
289800b99b8Sopenharmony_ci        pipeType > static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_DELETE)) {
290800b99b8Sopenharmony_ci        DFXLOGE("%{public}s :: pipeType(%{public}d) failed.", __func__, pipeType);
291800b99b8Sopenharmony_ci        return -1;
292800b99b8Sopenharmony_ci    }
293800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
294800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(struct FaultLoggerdRequest));
295800b99b8Sopenharmony_ci
296800b99b8Sopenharmony_ci    if ((pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF)) ||
297800b99b8Sopenharmony_ci        (pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_JSON_READ_RES))) {
298800b99b8Sopenharmony_ci        request.isJson = true;
299800b99b8Sopenharmony_ci    } else {
300800b99b8Sopenharmony_ci        request.isJson = false;
301800b99b8Sopenharmony_ci    }
302800b99b8Sopenharmony_ci    request.pipeType = pipeType;
303800b99b8Sopenharmony_ci    request.pid = pid;
304800b99b8Sopenharmony_ci    request.callerPid = getpid();
305800b99b8Sopenharmony_ci    request.callerTid = gettid();
306800b99b8Sopenharmony_ci    request.clientType = (int32_t)FaultLoggerClientType::PIPE_FD_CLIENT;
307800b99b8Sopenharmony_ci    if ((pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_READ_BUF)) ||
308800b99b8Sopenharmony_ci        (pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_READ_RES)) ||
309800b99b8Sopenharmony_ci        (pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF)) ||
310800b99b8Sopenharmony_ci        (pipeType == static_cast<int32_t>(FaultLoggerPipeType::PIPE_FD_JSON_READ_RES))) {
311800b99b8Sopenharmony_ci        return RequestFileDescriptorByCheck(&request);
312800b99b8Sopenharmony_ci    }
313800b99b8Sopenharmony_ci    return RequestFileDescriptorEx(&request);
314800b99b8Sopenharmony_ci}
315800b99b8Sopenharmony_ci
316800b99b8Sopenharmony_ciint32_t RequestDelPipeFd(int32_t pid)
317800b99b8Sopenharmony_ci{
318800b99b8Sopenharmony_ci    struct FaultLoggerdRequest request;
319800b99b8Sopenharmony_ci    (void)memset_s(&request, sizeof(request), 0, sizeof(struct FaultLoggerdRequest));
320800b99b8Sopenharmony_ci    request.pipeType = FaultLoggerPipeType::PIPE_FD_DELETE;
321800b99b8Sopenharmony_ci    request.pid = pid;
322800b99b8Sopenharmony_ci    request.clientType = (int32_t)FaultLoggerClientType::PIPE_FD_CLIENT;
323800b99b8Sopenharmony_ci
324800b99b8Sopenharmony_ci    int sockfd;
325800b99b8Sopenharmony_ci    std::string name = GetSocketConnectionName();
326800b99b8Sopenharmony_ci    if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
327800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
328800b99b8Sopenharmony_ci        return -1;
329800b99b8Sopenharmony_ci    }
330800b99b8Sopenharmony_ci
331800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(write(sockfd, &request, sizeof(struct FaultLoggerdRequest)));
332800b99b8Sopenharmony_ci    close(sockfd);
333800b99b8Sopenharmony_ci    return 0;
334800b99b8Sopenharmony_ci}
335800b99b8Sopenharmony_ci
336800b99b8Sopenharmony_ciint ReportDumpStats(const struct FaultLoggerdStatsRequest *request)
337800b99b8Sopenharmony_ci{
338800b99b8Sopenharmony_ci    int sockfd = -1;
339800b99b8Sopenharmony_ci    std::string name = GetSocketConnectionName();
340800b99b8Sopenharmony_ci    if (!StartConnect(sockfd, name.c_str(), SOCKET_TIMEOUT)) {
341800b99b8Sopenharmony_ci        DFXLOGE("[%{public}d]: StartConnect(%{public}d) failed", __LINE__, sockfd);
342800b99b8Sopenharmony_ci        return -1;
343800b99b8Sopenharmony_ci    }
344800b99b8Sopenharmony_ci
345800b99b8Sopenharmony_ci    if (OHOS_TEMP_FAILURE_RETRY(write(sockfd, request,
346800b99b8Sopenharmony_ci        sizeof(struct FaultLoggerdStatsRequest))) != static_cast<long int>(sizeof(struct FaultLoggerdStatsRequest))) {
347800b99b8Sopenharmony_ci        DFXLOGE("ReportDumpCatcherStats: failed to write stats.");
348800b99b8Sopenharmony_ci        close(sockfd);
349800b99b8Sopenharmony_ci        return -1;
350800b99b8Sopenharmony_ci    }
351800b99b8Sopenharmony_ci    close(sockfd);
352800b99b8Sopenharmony_ci    return 0;
353800b99b8Sopenharmony_ci}
354