/* * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /////////////////////////////////////////////////////////////////////////////// /// \ingroup tag_SS_LoggerService /// \brief TODO /// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// #include "ss_logger_error_event_storage.h" #include #include #include #include #include #include #include #include "ss_logger_util.h" #include "ss_logger_error_event_archive.h" #include "ss_logger_fs_directory.h" #include "ss_logger_common.h" CLoggerErrorEventStorage::CLoggerErrorEventStorage() : m_parentMcQueue(NULL), m_thread(-1), m_sendQueue(-1), m_receiveQueue(-1), m_destination(""), m_mutexInit(-1), m_pLoggerCfg(NULL), m_logTime(0) { m_responseVec.clear(); m_mqattr.mq_flags = 0; m_mqattr.mq_maxmsg = 1; m_mqattr.mq_msgsize = 32; m_mqattr.mq_curmsgs = 0; } CLoggerErrorEventStorage::~CLoggerErrorEventStorage() { // LCOV_EXCL_START 14:globle instance AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert this->Cleanup(); } // LCOV_EXCL_STOP EFrameworkunifiedStatus CLoggerErrorEventStorage::Initialize(HANDLE f_hApp, std::string f_ParentName, CLoggerCfg *f_pLoggerCfg) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; pthread_attr_t l_attr; struct sched_param l_params; /* Open the queue */ if (NULL == (m_pLoggerCfg = f_pLoggerCfg)) { // LCOV_EXCL_BR_LINE 200:As it is not always NULL // LCOV_EXCL_START 200:As it is not always NULL AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusNullPointer; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Parameter f_pLoggerCfg is NULL."); // LCOV_EXCL_STOP } else if (eFrameworkunifiedStatusOK != (l_eStatus = m_pLoggerCfg->GetLoggerStorageInfo(m_loggerStorageInfo))) { // LCOV_EXCL_BR_LINE 200:To ensure success // NOLINT[whitespace/line_length] // LCOV_EXCL_START 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetLoggerStorageInfo(m_loggerStorageInfo)"); // LCOV_EXCL_STOP } else if (NULL == (m_parentMcQueue = McOpenSender(f_ParentName.c_str()))) { // LCOV_EXCL_BR_LINE 4:NSFW // LCOV_EXCL_START 4:NSFW AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusErrOther; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. McOpenSender(f_ParentName)"); // LCOV_EXCL_STOP } else if (-1 == (this->m_sendQueue = mq_open(m_loggerStorageInfo.Name.c_str(), O_CREAT | O_WRONLY, 0666, &m_mqattr))) { // LCOV_EXCL_BR_LINE 5:C code eror // NOLINT[whitespace/line_length] // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusErrOther; FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. mq_open(ERROR_EVENT_STORAGE_QUEUE_NAME,O_CREAT | O_WRONLY, 0666, NULL)"); // LCOV_EXCL_STOP } else if (-1 == (this->m_receiveQueue = mq_open(m_loggerStorageInfo.Name.c_str(), O_RDONLY))) { // LCOV_EXCL_BR_LINE 5:C code eror // NOLINT[whitespace/line_length] // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusSessionLimitMaxedOut; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_open(ERROR_EVENT_STORAGE_QUEUE_NAME,O_RDONLY)"); // LCOV_EXCL_STOP } else if (EOK != (m_mutexInit = pthread_mutex_init(&this->m_mutex, NULL))) { // LCOV_EXCL_BR_LINE 5:C code eror // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusFail; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. pthread_mutex_init(&this->m_mutex, NULL)"); // LCOV_EXCL_STOP } else if (EOK != pthread_attr_init(&l_attr)) { // LCOV_EXCL_BR_LINE 5:C code eror // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusSemUnlockFail; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. pthread_attr_init()"); // LCOV_EXCL_STOP } else if (EOK != pthread_attr_getschedparam(&l_attr, &l_params)) { // LCOV_EXCL_BR_LINE 5:C code eror // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusSemCloseFail; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. pthread_attr_getschedparam()"); // LCOV_EXCL_STOP } else { l_params.sched_priority = m_loggerStorageInfo.Priority; if (EOK != pthread_attr_setinheritsched(&l_attr, PTHREAD_EXPLICIT_SCHED)) { // LCOV_EXCL_BR_LINE 5:C code eror // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. pthread_attr_setinheritsched()"); // LCOV_EXCL_STOP } else if (EOK != pthread_attr_setschedparam(&l_attr, &l_params)) { // LCOV_EXCL_BR_LINE 5:C code eror l_eStatus = eFrameworkunifiedStatusDbResultError; FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error but continue. pthread_attr_setschedparam(), priority = %d: %s", m_loggerStorageInfo.Priority, strerror(errno)); // LCOV_EXCL_BR_LINE 11:Unexpected branch l_eStatus = eFrameworkunifiedStatusOK; } if (EOK != pthread_create(&this->m_thread, &l_attr, &CLoggerErrorEventStorage::ThreadFunctionWrapper, this)) { // LCOV_EXCL_BR_LINE 5:C code eror // NOLINT[whitespace/line_length] // LCOV_EXCL_START 5:C code eror AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusDbRecNotFound; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. pthread_create()"); // LCOV_EXCL_STOP } else { l_eStatus = eFrameworkunifiedStatusOK; } } if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 200:To ensure success AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert this->Cleanup(); // LCOV_EXCL_LINE 200:To ensure success } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-: %d", l_eStatus); return (l_eStatus); } EFrameworkunifiedStatus CLoggerErrorEventStorage::Start( std::string f_target, TArtifactResponseVec f_responseVector, uint32_t f_time) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; /* Start the thread*/ if (EOK == pthread_mutex_lock(&this->m_mutex)) { // LCOV_EXCL_BR_LINE 200:To ensure success this->m_destination = f_target; this->m_responseVec = f_responseVector; this->m_logTime = f_time; (void) pthread_mutex_unlock(&this->m_mutex); } UI_8 l_cmd[MAX_QUEUE_MSG_SIZE]; l_cmd[0] = 1; if (-1 == mq_send(this->m_sendQueue, reinterpret_cast(l_cmd), m_mqattr.mq_msgsize, 0)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_send(this->m_sendQueue %d) return %s", m_sendQueue, strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-: %d", l_eStatus); return (l_eStatus); } void CLoggerErrorEventStorage::ThreadFunction(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); char l_data[MAX_QUEUE_MSG_SIZE] = { }; SI_32 l_bytesRead = -1; SI_32 l_oldState; ELoggerStorageThreadCommands l_cmdId = eLoggerStorageThreadCmdWriteFailed; EFrameworkunifiedStatus l_eStatus; (void) pthread_setname_np(pthread_self(), ERROR_EVENT_STORAGE_QUEUE_NAME); pthread_cleanup_push(&CLoggerErrorEventStorage::CleanupWrapper, this); while (-1 // LCOV_EXCL_BR_LINE 200: mq_send can not send size of -1 != (l_bytesRead = static_cast(mq_receive(this->m_receiveQueue, reinterpret_cast(l_data), (size_t) m_mqattr.mq_msgsize, NULL)))) { std::string l_target; TArtifactResponseVec l_responseVec; uint32_t l_logTime; uint8_t status; Clock_getSystemTimeY2K38(&l_logTime, &status); (void) pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &l_oldState); if (EOK == pthread_mutex_lock(&this->m_mutex)) { // LCOV_EXCL_BR_LINE 5: pthread_mutex_lock's error case. l_target = this->m_destination; l_responseVec = this->m_responseVec; l_logTime = this->m_logTime; this->m_responseVec.clear(); this->m_destination = ""; (void) pthread_mutex_unlock(&this->m_mutex); } (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &l_oldState); if (access(l_target.c_str(), F_OK) == 0) { if (CFSDirectory::IsDirectory(l_target)) { // LCOV_EXCL_BR_LINE 6: can not be a dir // LCOV_EXCL_START 6: new file create, it can not be find AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert BOOL isDeleteFiles = FALSE; SI_32 l_filesCopied = this->CopyFiles(l_target, l_responseVec, isDeleteFiles); switch (l_filesCopied) { case -1: /*Error while moving files*/ l_cmdId = eLoggerStorageThreadCmdWriteFailed; break; case 0: /*No files where moved*/ l_cmdId = eLoggerStorageThreadCmdNoWritten; break; default: if (l_filesCopied > 0) { l_cmdId = eLoggerStorageThreadCmdOK; FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. %d files successfully copied.", l_filesCopied); } break; } // LCOV_EXCL_STOP } } else { if (eFrameworkunifiedStatusOK != (l_eStatus = this->PackageAndPlaceArtifacts(l_target, l_responseVec, l_logTime))) { /*Write Error.*/ l_cmdId = eLoggerStorageThreadCmdWriteFailed; } else { l_cmdId = eLoggerStorageThreadCmdOK; FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Archive successfully written."); } if (eFrameworkunifiedStatusOK != RemoveDeprecatedArtifacts(l_responseVec)) { FRAMEWORKUNIFIEDLOG( ZONE_WARN, __FUNCTION__, " Warning. Wasn't able to delete all deprecated log artifacts."); } } std::string l_usb_path; size_t l_usb_path_length = 0; if (m_pLoggerCfg != NULL) { // LCOV_EXCL_BR_LINE 6: m_pLoggerCfg can not be null l_usb_path = m_pLoggerCfg->getUsb0MountPath(); l_usb_path_length = l_usb_path.length(); if ((l_usb_path_length > 1) && (l_usb_path[l_usb_path.length() - 1] == '/')) { l_usb_path_length--; } } if ((l_usb_path_length > 0) && (l_target.compare(0, l_usb_path_length, l_usb_path, 0, l_usb_path_length) != 0)) { l_usb_path_length = 0; } if ((l_usb_path_length == 0) && (l_target.compare(0, sizeof(DEBUG_USB_PATH) - 1, DEBUG_USB_PATH, 0, sizeof(DEBUG_USB_PATH) - 1) == 0)) { l_usb_path = DEBUG_USB_PATH; l_usb_path_length = sizeof(DEBUG_USB_PATH) - 1; } if (l_usb_path_length > 1) { // if USB path is '/' only, length is 1. // So conditions to be syncfs is greater than 1 // sync usb device DIR* l_dirp = opendir(l_usb_path.c_str()); if (l_dirp != NULL) { // LCOV_EXCL_BR_LINE 5: c code error case int fd = dirfd(l_dirp); if (fd != -1) { // LCOV_EXCL_BR_LINE 5: c code error case if (syncfs(fd) == -1) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. syncfs failed path=%s [%s]", l_usb_path.c_str(), strerror(errno)); } } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. syncfs get fd failed path=%s, [%s]", l_usb_path.c_str(), strerror(errno)); } closedir(l_dirp); } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. syncfs opendir failed path=%s, [%s]", l_usb_path.c_str(), strerror(errno)); } { #define USB_MEMORY_SYNC_WAITTIME 8 // 8 sec const struct timespec intval = { USB_MEMORY_SYNC_WAITTIME, 0 }; FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "%d sec:Waiting for USB Memory Synchronization.(%s)", USB_MEMORY_SYNC_WAITTIME, l_usb_path.c_str()); nanosleep(&intval, NULL); } } if (eFrameworkunifiedStatusOK != McSend(this->m_parentMcQueue, m_loggerStorageInfo.Name.c_str(), l_cmdId, 0, NULL)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. McSend(this->m_parentMcQueue)"); } } pthread_cleanup_pop(1); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } void CLoggerErrorEventStorage::Cleanup(void) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); if (-1 != this->m_receiveQueue) { // LCOV_EXCL_BR_LINE 200: m_receiveQueue cam not be -1 if (-1 == mq_close(this->m_receiveQueue)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_close()"); } this->m_receiveQueue = -1; } if (-1 != this->m_sendQueue) { // LCOV_EXCL_BR_LINE 200: m_sendQueue cam not be -1 if (-1 == mq_close(this->m_sendQueue)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_close()"); } this->m_sendQueue = -1; if (-1 == mq_unlink(m_loggerStorageInfo.Name.c_str())) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_unlink()"); } } if (-1 != m_mutexInit) { // LCOV_EXCL_BR_LINE 200: m_mutexInit cam not be -1 if (EOK != pthread_mutex_destroy(&this->m_mutex)) { // LCOV_EXCL_BR_LINE 5: c code error case // LCOV_EXCL_START 5: c code error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. mq_unlink()"); // LCOV_EXCL_STOP } m_mutexInit = -1; } if (NULL != m_parentMcQueue) { // LCOV_EXCL_BR_LINE 200: m_parentMcQueue cam not be null if (eFrameworkunifiedStatusOK != McClose(m_parentMcQueue)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. McClose()"); } this->m_parentMcQueue = NULL; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } void* CLoggerErrorEventStorage::ThreadFunctionWrapper(void* param) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); CLoggerErrorEventStorage* l_pObj = reinterpret_cast(param); l_pObj->ThreadFunction(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return NULL; } void CLoggerErrorEventStorage::CleanupWrapper(void* param) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); CLoggerErrorEventStorage* l_pObj = reinterpret_cast(param); l_pObj->Cleanup(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } /////////////////////////////////////////////////////////////////////////// // Function : PackageAndPlaceArtifacts // brief : This function creates an archive for all collected artifacts // and places the archive in the required location depending // on the event type and required naming criteria. /////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CLoggerErrorEventStorage::PackageAndPlaceArtifacts( std::string f_archiveDestination, TArtifactResponseVec &f_responseVector, uint32_t f_logTime) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_coreFileName = ""; SI_32 l_ret = 0; if (f_archiveDestination.size() == 0) { FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Unknown package file path and name. Logging artifacts not stored!"); l_eStatus = eFrameworkunifiedStatusFail; } else { CErrorEventArchive l_archiver; l_eStatus = l_archiver.openArchive(f_archiveDestination); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6: it can not be fail // LCOV_EXCL_START 6: it can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Failed to create logging archive: %s. Log archive will not be stored!", f_archiveDestination.c_str()); // LCOV_EXCL_STOP } else { for (UI_32 i = 0; (i < f_responseVector.size()); i++) { if (f_responseVector[i].Filepath != std::string("")) { std::string l_destName = f_responseVector[i].Filepath; if ((f_responseVector[i].Filepath.find(".bmp") // LCOV_EXCL_BR_LINE 200: no bmp file be set == f_responseVector[i].Filepath.find_last_of('.')) && (f_responseVector[i].Filepath.find(".bmp") != std::string::npos)) { // LCOV_EXCL_START 200: no bmp file be set AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert char buffer[20]; struct tm local_time; Clock_getLocalTimeY2K38(&f_logTime, &local_time); if (0 != strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S.bmp", &local_time)) { l_destName = buffer; } // LCOV_EXCL_STOP } else { l_destName = f_responseVector[i].Filepath.substr( f_responseVector[i].Filepath.find_last_of('/') + 1); } if (f_responseVector[i].ArtifactId == eArtifactIdPstoreLog) { // LCOV_EXCL_BR_LINE 200: can not be eArtifactIdPstoreLog // NOLINT[whitespace/line_length] AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_destName = KERNEL_LOG_PATH_DIR; // LCOV_EXCL_LINE 200: can not be eArtifactIdPstoreLog } l_eStatus = l_archiver.addToArchive(f_responseVector[i].Filepath, l_destName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 200: can not be fail // LCOV_EXCL_START 200: can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. Failed to add artifact: %s to archive %s. Continuing with next artifact.", f_responseVector[i].Filepath.c_str(), f_archiveDestination.c_str()); // LCOV_EXCL_STOP } l_ret++; if ((l_ret % m_loggerStorageInfo.TimeoutAfter) == 0) { usleep(m_loggerStorageInfo.Timeout); } } } if (eFrameworkunifiedStatusOK != l_archiver.closeArchive()) { // LCOV_EXCL_BR_LINE 200: closeArchive can not be fail // LCOV_EXCL_START 200: closeArchive can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusFail; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. l_archiver.closeArchive()"); // LCOV_EXCL_STOP } else { // Cleanup artifacts that are no longer required. int rc = access(f_archiveDestination.c_str(), F_OK); if (0 != rc) { // LCOV_EXCL_BR_LINE 5: f_archiveDestination is aways exist // LCOV_EXCL_START 5: f_archiveDestination is aways exist AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Archive verification failed. Errno: %d, %s.", errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; // LCOV_EXCL_STOP } else { TEXT(__FUNCTION__, " Error Event: A archive successfully written to: %s.", f_archiveDestination.c_str()); l_eStatus = eFrameworkunifiedStatusOK; } } } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// /// File Copy /// arg: /// isDeleteFiles : TRUE - delete original files after copy. /// FALSE - not delete after copy. /// returns: /// -1: error while writing /// else, number of files written /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// // LCOV_EXCL_START 8: can not be called SI_32 CLoggerErrorEventStorage::CopyFiles( std::string f_destination, TArtifactResponseVec &f_responseVector, BOOL isDeleteFiles) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); SI_32 l_ret = 0; BOOL l_isFaile = FALSE; for (UI_32 i = 0; i < f_responseVector.size(); i++) { if (f_responseVector[i].Filepath != "") { if (CFSDirectory::IsDirectory(f_responseVector[i].Filepath)) { DIR * l_pDir = opendir(f_responseVector[i].Filepath.c_str()); if (l_pDir == NULL) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not open directory: %s", f_responseVector[i].Filepath.c_str()); } else { struct dirent l_pDirent; struct dirent* next; while (0 == readdir_r(l_pDir, &l_pDirent, &next) && next != NULL) { if ((0 != strcmp(l_pDirent.d_name, ".")) && /* Ignore special . directory. */ (0 != strcmp(l_pDirent.d_name, "..")) && /* Ignore special .. directory. */ (0 != strcmp(l_pDirent.d_name, "lost+found")) && /* Ignore lost+found. */ ('.' != l_pDirent.d_name[0])) { /* Ignore hidden files */ std::string l_fileSource = f_responseVector[i].Filepath; std::string l_fileDestination = f_destination; l_fileSource.append("/"); l_fileSource.append(l_pDirent.d_name); l_fileDestination.append("/"); l_fileDestination.append(l_pDirent.d_name); EFrameworkunifiedStatus loggerserviceRet = eFrameworkunifiedStatusOK; if (isDeleteFiles == TRUE) { loggerserviceRet = CLoggerUtil::MoveUntyped(l_fileSource, l_fileDestination); } else { loggerserviceRet = CLoggerUtil::CopyUntyped(l_fileSource, l_fileDestination); } if (eFrameworkunifiedStatusOK == loggerserviceRet) { l_ret++; if ((l_ret % m_loggerStorageInfo.TimeoutAfter) == 0) { usleep(m_loggerStorageInfo.Timeout); } } else { l_isFaile = TRUE; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not move: %s", l_fileSource.c_str()); } } } (void) closedir(l_pDir); } } else { std::string l_filename = f_responseVector[i].Filepath.substr( f_responseVector[i].Filepath.find_last_of('/')); std::string l_destination = std::string(f_destination).append( l_filename); if (eFrameworkunifiedStatusOK == CLoggerUtil::MoveUntyped(f_responseVector[i].Filepath, l_destination)) { l_ret++; if ((l_ret % m_loggerStorageInfo.TimeoutAfter) == 0) { usleep(m_loggerStorageInfo.Timeout); } } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not move: %s", f_responseVector[i].Filepath.c_str()); l_isFaile = TRUE; } } } } if (l_isFaile) l_ret = -1; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } // LCOV_EXCL_STOP EFrameworkunifiedStatus CLoggerErrorEventStorage::RemoveDeprecatedArtifacts( TArtifactResponseVec &f_responseVector) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; BOOL l_success = TRUE; for (UI_32 i = 0; i < f_responseVector.size(); i++) { if ((f_responseVector[i].Filepath != "") && (TRUE == f_responseVector[i].Remove)) { if (CFSDirectory::IsDirectory(f_responseVector[i].Filepath)) { if (TRUE != CFSDirectory::RemoveDirectory(f_responseVector[i].Filepath)) { FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, " Warning. Directory %s failed to be deleted.", f_responseVector[i].Filepath.c_str()); l_success &= FALSE; } else { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Directory %s has been successfully deleted.", f_responseVector[i].Filepath.c_str()); } } else { errno = 0; if (0 != remove(f_responseVector[i].Filepath.c_str())) { // LCOV_EXCL_BR_LINE 5: c code error case // LCOV_EXCL_START 5: c code error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert if (errno == ENOENT) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. %s not available. Skipping file deletion.", f_responseVector[i].Filepath.c_str()); } else { FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, " Warning. File %s failed to be deleted.", f_responseVector[i].Filepath.c_str()); l_success &= FALSE; } errno = 0; // LCOV_EXCL_STOP } else { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. File %s has been successfully deleted.", f_responseVector[i].Filepath.c_str()); } } } } l_eStatus = (l_success == TRUE) ? eFrameworkunifiedStatusOK : eFrameworkunifiedStatusFail; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; }