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