1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci#include "event_log_catcher.h" 16020a203aSopenharmony_ci 17020a203aSopenharmony_ci#include <string> 18020a203aSopenharmony_ci 19020a203aSopenharmony_ci#include <climits> 20020a203aSopenharmony_ci#include <fcntl.h> 21020a203aSopenharmony_ci#include <sys/stat.h> 22020a203aSopenharmony_ci#include <sys/types.h> 23020a203aSopenharmony_ci#include <unistd.h> 24020a203aSopenharmony_ci 25020a203aSopenharmony_ci#include "securec.h" 26020a203aSopenharmony_ci 27020a203aSopenharmony_ci#include "common_utils.h" 28020a203aSopenharmony_ci#include "defines.h" 29020a203aSopenharmony_ci#include "file_util.h" 30020a203aSopenharmony_ci#include "hiview_logger.h" 31020a203aSopenharmony_cinamespace OHOS { 32020a203aSopenharmony_cinamespace HiviewDFX { 33020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D01, "EventLogger-EventLogCatcher"); 34020a203aSopenharmony_cinamespace { 35020a203aSopenharmony_ci constexpr char SED_EXEC_PATH[] = "/system/bin/sed"; 36020a203aSopenharmony_ci} 37020a203aSopenharmony_ci 38020a203aSopenharmony_cistd::string EventLogCatcher::GetName() const 39020a203aSopenharmony_ci{ 40020a203aSopenharmony_ci return name_; 41020a203aSopenharmony_ci} 42020a203aSopenharmony_ci 43020a203aSopenharmony_ciint EventLogCatcher::GetLogSize() const 44020a203aSopenharmony_ci{ 45020a203aSopenharmony_ci return logSize_; 46020a203aSopenharmony_ci}; 47020a203aSopenharmony_ci 48020a203aSopenharmony_civoid EventLogCatcher::SetLogSize(int size) 49020a203aSopenharmony_ci{ 50020a203aSopenharmony_ci logSize_ = size; 51020a203aSopenharmony_ci} 52020a203aSopenharmony_ci 53020a203aSopenharmony_cibool EventLogCatcher::Initialize(const std::string &strParam1 __UNUSED, int intParam1 __UNUSED, int intParam2 __UNUSED) 54020a203aSopenharmony_ci{ 55020a203aSopenharmony_ci useStreamFilter_ = CommonUtils::IsSpecificCmdExist(SED_EXEC_PATH); 56020a203aSopenharmony_ci catcherStartTime_ = time(nullptr); 57020a203aSopenharmony_ci return true; 58020a203aSopenharmony_ci} 59020a203aSopenharmony_ci 60020a203aSopenharmony_ciint EventLogCatcher::Catch(int fd __UNUSED, int jsonFd __UNUSED) 61020a203aSopenharmony_ci{ 62020a203aSopenharmony_ci return 0; 63020a203aSopenharmony_ci} 64020a203aSopenharmony_ci 65020a203aSopenharmony_civoid EventLogCatcher::Stop() 66020a203aSopenharmony_ci{ 67020a203aSopenharmony_ci needStop_ = true; 68020a203aSopenharmony_ci} 69020a203aSopenharmony_ci 70020a203aSopenharmony_ciint EventLogCatcher::AppendFile(int fd, const std::string &fileName) const 71020a203aSopenharmony_ci{ 72020a203aSopenharmony_ci char buf[BUF_SIZE_4096] = {0}; 73020a203aSopenharmony_ci 74020a203aSopenharmony_ci if (fd < 0) { 75020a203aSopenharmony_ci HIVIEW_LOGW("parameter err, fd:%{public}d, filename:%{public}s.", fd, fileName.c_str()); 76020a203aSopenharmony_ci return 0; 77020a203aSopenharmony_ci } 78020a203aSopenharmony_ci 79020a203aSopenharmony_ci char path[PATH_MAX] = {0}; 80020a203aSopenharmony_ci if (realpath(fileName.c_str(), path) == nullptr) { 81020a203aSopenharmony_ci std::string errStr = "canonicalize failed, file name is " + fileName + 82020a203aSopenharmony_ci ", errno is " + std::to_string(errno) + "\r\n"; 83020a203aSopenharmony_ci HIVIEW_LOGW("%{public}s", errStr.c_str()); 84020a203aSopenharmony_ci FileUtil::SaveStringToFd(fd, errStr); 85020a203aSopenharmony_ci return 0; 86020a203aSopenharmony_ci } 87020a203aSopenharmony_ci 88020a203aSopenharmony_ci if (fileName != std::string(path)) { 89020a203aSopenharmony_ci HIVIEW_LOGW("fail to check consistency."); 90020a203aSopenharmony_ci return 0; 91020a203aSopenharmony_ci } 92020a203aSopenharmony_ci 93020a203aSopenharmony_ci int srcFd = open(path, O_RDONLY); 94020a203aSopenharmony_ci if (srcFd < 0) { 95020a203aSopenharmony_ci HIVIEW_LOGW("open %{public}s failed. errno is %{public}d", fileName.c_str(), errno); 96020a203aSopenharmony_ci return 0; 97020a203aSopenharmony_ci } 98020a203aSopenharmony_ci 99020a203aSopenharmony_ci int wn = 0; 100020a203aSopenharmony_ci while (true) { 101020a203aSopenharmony_ci int rn = read(srcFd, buf, sizeof(buf)); 102020a203aSopenharmony_ci if (rn == -1) { 103020a203aSopenharmony_ci if (errno == EAGAIN) { 104020a203aSopenharmony_ci continue; 105020a203aSopenharmony_ci } else { 106020a203aSopenharmony_ci break; 107020a203aSopenharmony_ci } 108020a203aSopenharmony_ci } else if (rn == 0) { 109020a203aSopenharmony_ci break; 110020a203aSopenharmony_ci } 111020a203aSopenharmony_ci wn += write(fd, buf, rn); 112020a203aSopenharmony_ci } 113020a203aSopenharmony_ci close(srcFd); 114020a203aSopenharmony_ci return wn; 115020a203aSopenharmony_ci} 116020a203aSopenharmony_ci 117020a203aSopenharmony_cistd::string EventLogCatcher::GetDescription() const 118020a203aSopenharmony_ci{ 119020a203aSopenharmony_ci return description_; 120020a203aSopenharmony_ci} 121020a203aSopenharmony_ci 122020a203aSopenharmony_ciint EventLogCatcher::GetFdSize(int32_t fd) 123020a203aSopenharmony_ci{ 124020a203aSopenharmony_ci struct stat fileStat; 125020a203aSopenharmony_ci if (fstat(fd, &fileStat) == -1) { 126020a203aSopenharmony_ci return 0; 127020a203aSopenharmony_ci } 128020a203aSopenharmony_ci return fileStat.st_size; 129020a203aSopenharmony_ci} 130020a203aSopenharmony_ci} // namespace HiviewDFX 131020a203aSopenharmony_ci} // namespace OHOS 132