summaryrefslogtreecommitdiffstats
path: root/video_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'video_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp')
-rwxr-xr-xvideo_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp1147
1 files changed, 0 insertions, 1147 deletions
diff --git a/video_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp b/video_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp
deleted file mode 100755
index 71a969a..0000000
--- a/video_in_hal/systemservice/interface_unified/library/src/ss_system_process.cpp
+++ /dev/null
@@ -1,1147 +0,0 @@
-/*
- * @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_SystemManagerIf
-/// \brief This file provides support for the System Manager client interface.
-///
-///////////////////////////////////////////////////////////////////////////////
-
-#include "system_service/ss_system_process.h"
-#include <errno.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <limits.h>
-#include <pwd.h>
-#include <grp.h>
-#include <elfio/elfio_dump.hpp>
-
-#include <string.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <assert.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <vector>
-#include "ss_system_if_interfaceunifiedlog.h"
-
-const char* iProcess_DEFAULT_PROCESS_USER_NAME = "default_user";
-uid_t iProcess_DEFAULT_PROCESS_USER = 4999;
-gid_t iPrpocess_DEFAULT_PROCESS_GROUP = 4999;
-
-/**
- * Process: Called when the class is instantiated.
- *
- * @return
- */
-Process::Process(int cpu_assign) :
- m_lValidationTag(lProcess_VALIDATION_VALUE),
- m_cpu_assign(cpu_assign),
- m_tProcessId(-1),
- m_eProcessLoadMode(NOWAIT),
- m_strFile(""),
- m_strProcessName(""),
- m_iErrorCode(0),
- m_fAutoKill(TRUE),
- m_iReturnCode(0) {
-}
-
-
-/**
- * ~Process: Called when the object is destroyed.
- *
- * @return
- */
-Process::~Process() {
- // ASSERT_VALID (this);
-
- //
- // Set the validation tag to NOT valid
- m_lValidationTag = 0;
-
- //
- // Cleanup after ourselves...
- //
- if ((m_fAutoKill) && (m_tProcessId != -1) && (m_tProcessId != getpid())) {
- KillProcess(); // Then remove the process from PosixBasedOS001
- }
-}
-
-/**
- * Process: Used to create an object and copy another
- * object to the new object.
- *
- * @param p_rhs_i Reference to the class being copied from.
- * @return Process( const
- */
-Process::Process(const Process& p_rhs_i) {
- // Copy data from the specified object to this object.
- Copy(p_rhs_i);
-}
-
-
-/**
- * operator=: Called when one object is assigned
- * to another object.
- *
- * @param p_rhs_i Reference to the class being copied from.
- * @return Process&
- */
-Process& Process::operator= (const Process& p_rhs_i) {
- // Don't do anything if we're being copied on to ourselves.
- if (this == &p_rhs_i) return (*this);
-
- // Copy data from the specified object to this object.
- Copy(p_rhs_i);
-
- return (*this);
-}
-
-
-/**
- * Copy: Copies data members from the specified object to this object.
- * No attempt is made to free dynamically allocated objects within
- * this object (you must do that before calling this function).
- *
- * @param p_rhs_i
- * @return void
- */
-void Process::Copy(const Process& p_rhs_i) {
- // Copy data from the specified object to this object.
- m_lValidationTag = p_rhs_i.m_lValidationTag;
-
- m_tProcessId = p_rhs_i.m_tProcessId;
- m_eProcessLoadMode = p_rhs_i.m_eProcessLoadMode;
- m_strFile = p_rhs_i.m_strFile;
- m_strlstArgv = p_rhs_i.m_strlstArgv;
- m_strProcessName = p_rhs_i.m_strProcessName;
- m_iErrorCode = p_rhs_i.m_iErrorCode;
- m_fAutoKill = p_rhs_i.m_fAutoKill;
- m_iReturnCode = p_rhs_i.m_iReturnCode;
-}
-
-/**
- * GetProcessReturnCode: This function will return the processes
- * exit/return code. This is not the value of ERRNO as returned by
- * GetLastPosixBasedOS001ErrorCode().
- *
- * @return code from the process
- */
-int Process::GetProcessReturnCode() {
- int iProcessReturn = 0;
- if (waitpid(m_tProcessId, &iProcessReturn, WNOHANG) > 0) {
- m_iReturnCode = WEXITSTATUS(iProcessReturn);
- }
-
- return m_iReturnCode;
-}
-
-static int getIdsFromUserName(const char* user_name, uid_t *uid, gid_t *gid) {
- int ret = -1;
-
- try {
- if (NULL == user_name) {
- *uid = geteuid();
- *gid = getegid();
- } else {
- static __thread size_t bufSize = 0;
- static __thread char *buf = NULL;
- struct passwd pwd;
- struct passwd *result;
-
- if (0 == bufSize) {
- struct stat statInfo;
-
- bufSize = -1;
-
- if (0 != stat("/etc/passwd", &statInfo) || 0 >= statInfo.st_size) {
- throw "/etc/passwd is not exist";
- }
-
- bufSize = statInfo.st_size * 2;
-
- // Since SystemManager is a resident service,
- // the area secured here is not explicity released by free()
- // in anticipation of release at the end of the process
- buf = reinterpret_cast<char *>(malloc(sizeof(char) * bufSize));
- if (NULL == buf) {
- throw "malloc()";
- }
- }
-
- if (NULL == buf) {
- throw "buf = NULL";
- }
-
- ret = getpwnam_r(user_name, &pwd, buf, bufSize, &result);
- if (ret == 0 && result != NULL) {
- *uid = pwd.pw_uid;
- *gid = pwd.pw_gid;
- } else {
- throw "getpwnam_r()";
- }
- }
-
- ret = 0;
- }
-
- catch (const char *e) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "ERROR:%s", e);
- }
-
- return ret;
-}
-
-/**
- * CreateProcess: This method will create a PosixBasedOS001 process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- * Upon successful creation of the process, the scheduling policy and priority
- * of the process will be set to the provided values. The user can change these
- * values through the SetSchedulingPolicy() and SetPriority() method calls.
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_strlstArgv_i List of ARGV values for new process
- * @param p_eMode_i Mode to create and load new process
- * WAIT - The invoked program is loaded into available memory, is executed,
- * and then the original program resumes execution.
- * NOWAIT - Causes the current program to execute concurrently with the new child process.
- * @param p_strProcessName_i This is the name that will be registered to the OS for this process
- * @param p_eSchedulingPolicy_i Scheduling Policy for this process
- * FIFO - A fixed priority scheduler in which the highest ready process runs until it
- * blocks or is preempted by a higher priority process.
- * ROUND_ROBIN - The same as FIFO, except processes at the same priority level time-slice.
- * OTHER - A general time sharing scheduler in which a process decays in priority if it
- * consumes too much processor before blocking. It reverts to its default priority
- * when it blocks. Should it fail to run over a 2 second period and it has decayed
- * then it's boosted one priority level up to a maximum of its default priority.
- * @param p_iPriority_i Priority for this process
- * @param p_lSpawnFlags_i Spawning flags. These are PosixBasedOS001 specific....
- * @return void
- */
-void Process::CreateProcess(
- const SS_String& p_strFile_i, // Path and Filename of executable to create process for
- const StringList& p_strlstArgv_i, // List of ARGV values for new process
- const eProcessLoadMode p_eMode_i, // Mode to create and load new process
- const SS_String& p_strProcessName_i, // This is the name that will be registered to the OS for this process
- const eProcessSchedulingPolicy p_eSchedulingPolicy_i, // Scheduling Policy for this process
- const int p_iPriority_i, // Priority for this process
- const char* unix_user_name,
- const long p_lSpawnFlags_i // Posix Spawning flags. These are PosixBasedOS001 specific.... // NOLINT (runtime/int)
-) {
- //========================================================================================
- // Perform some idiot checking of the parameters that are passed in.
- // Check the priority level that is being set to make sure it is in bounds.
- // Then save off the calling parameters into the objects member variables.
- // Also check the number of valid calling (argv[]) parameters passed in
- //========================================================================================
- m_iErrorCode = 0; // Initialize to NO ERROR
- m_iReturnCode = 0; // Initialize value (0 usually means good in unix/PosixBasedOS001)
-
- //
- // Process filename os provided
- //
- if (p_strFile_i.empty()) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-
- //
- // Save off process calling arguments
- //
- m_eProcessLoadMode = p_eMode_i;
-
- m_strFile = p_strFile_i;
-
- if (!p_strProcessName_i.empty())
- m_strProcessName = p_strProcessName_i;
-
- //
- // Copy Argument List...
- //
- SetCallingArgumentList(p_strlstArgv_i);
-
- //
- // Valid number of calling arguments
- //
- int iNumberElements = m_strlstArgv.size();
- if (iNumberElements > (iProcess_MAXIMUM_NUMBER_OF_PROCESS_ARGUMENTS - 3)) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-
-
- //========================================================================================
- // Initialize to the beginning of the provided argument list.
- // Allocate an array of buffer pointers that will be used for the ARGV calling parameters
- // for the specified process.
- // Set the ARGV[0] equal to the process name being created
- // Set the ARGV[1] equal to the process name to be registered with the OS.
- // If p_strProcessName_is NULL, do not set the cArgv[1] parameter
- // Populate the array that will hold the argument list for the new process we are creating.
- //========================================================================================
- //
-
- int iLoop = 1;
- char * cArgv[iProcess_MAXIMUM_NUMBER_OF_PROCESS_ARGUMENTS];
-
- cArgv[0] = basename(const_cast<char *>(p_strFile_i.c_str())); // Set the executable filename
-
- // Go through the list of provided argv calling parameters to the CreateProcess
- // function, and copy the arguments to the ARGV[] calling argument which will be passed
- // into the process being created.
- StringListIter at = m_strlstArgv.begin();
- for (; at != m_strlstArgv.end(); at++, iLoop++) {
- cArgv[iLoop] = const_cast<char *>(at->c_str());
- }
-
- cArgv[iLoop] = NULL;
-
- try {
- CL_ProcessAttr_t clAttr;
- CL_ProcessSchedPolicy_t clPolicy = CL_PROCESS_SCHED_POLICY_OTHER;
- int clPriority = 0;
-
- if (0 != CL_ProcessCreateAttrInit(&clAttr)) {
- throw "CL_ProcessCreateAttrInit()";
- }
-
-
- // In order to collect even the child processes of the service, all are group leaders.
- if (0 != CL_ProcessCreateAttrSetGroup(&clAttr, 1)) {
- throw "CL_ProcessCreateAttrInit()";
- }
-
- if (0 != CL_ProcessCreateAttrSetCpuAssign(&clAttr, m_cpu_assign)) {
- throw "CL_ProcessCreateAttrSetCpuAssign()";
- }
-
- switch (p_eSchedulingPolicy_i) {
- case FIFO:
- clPolicy = CL_PROCESS_SCHED_POLICY_FIFO;
- break;
- case ROUND_ROBIN:
- clPolicy = CL_PROCESS_SCHED_POLICY_RR;
- break;
- case OTHER:
- clPolicy = CL_PROCESS_SCHED_POLICY_OTHER;
- break;
- default:
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "p_eSchedulingPolicy_i = %d", p_eSchedulingPolicy_i);
- break;
- }
-
- switch (p_eSchedulingPolicy_i) {
- case FIFO:
- case ROUND_ROBIN:
- if ((1 > p_iPriority_i) || (p_iPriority_i > 99)) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "p_eSchedulingPolicy_i = %d", p_eSchedulingPolicy_i);
- } else {
- clPriority = p_iPriority_i;
- }
- break;
- case OTHER:
- default:
- if ((-20 > p_iPriority_i) || (p_iPriority_i > 19)) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "p_eSchedulingPolicy_i = %d", p_eSchedulingPolicy_i);
- } else {
- clPriority = p_iPriority_i;
- }
- break;
- }
-
- if (0 != CL_ProcessCreateAttrSetSchedule(&clAttr, clPolicy, clPriority)) {
- throw "CL_ProcessCreateAttrSetSchedule()";
- }
-
- uid_t uid = 0;
- gid_t gid = 0;
-
- if (0 != getIdsFromUserName(unix_user_name, &uid, &gid)) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "unexpected unix_user_name [%s]", unix_user_name);
- uid = geteuid();
- gid = getegid();
- }
- if (uid == 0) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "!! uid=root %s", m_strFile.c_str());
- uid = UINT_MAX;
- }
- if (0 != CL_ProcessCreateAttrSetUid(&clAttr, uid)) {
- throw "CL_ProcessCreateAttrSetUid()";
- }
-
- if (0 != CL_ProcessCreateAttrSetGid(&clAttr, gid)) {
- throw "CL_ProcessCreateAttrSetGid()";
- }
-
- if (0 != CL_ProcessCreateAttrSetDisableCloseFds(&clAttr)) {
- throw "CL_ProcessCreateAttrSetDisableCloseFds()";
- }
- char environment_string[2048] = {0}; // Size is provisional
- fprintf(stderr, "[%s](%d)Process Create Target : %s \n", __func__, __LINE__, m_strFile.c_str());
-
- CheckLdPreLoad(&m_strFile, environment_string);
-
- CreateProcess(&m_strFile, const_cast<char* const*>(cArgv), environment_string, &clAttr);
- }
-
- catch(const char *e) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "%s", e);
- }
-}
-
-/**
- * CreateProcess: This method will create a process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- * @param p_str_file Path and Filename of executable to create process for
- * @param c_argv use process arguments
- * @param environment_string Set LD_PRELOAD string
- * @param cl_attr CL_ProcessAttr_t
- * @return void
- */
-void Process::CreateProcess(const SS_String *p_str_file, char* const*c_argv, char* environment_string,
- const CL_ProcessAttr_t *cl_attr) {
- try {
- if ((p_str_file == NULL) || (c_argv == NULL) || (cl_attr == NULL)) {
- throw "CreateProcess() Invaild Param";
- }
-
- int process_id = -1;
- if (environment_string[0] == '\0') {
- // If there is no LD_PRELOAD setting, set envp to NULL
- process_id = CL_ProcessCreate(p_str_file->c_str(), c_argv, NULL, cl_attr);
- } else {
- // vector holding preferences
- std::vector<SS_String> *vec_environ = GetEnvironVector();
-
- // Set LD_PRELOAD string as the last element
- SS_String ld_preload_string = SS_String(environment_string);
- vec_environ->push_back(environment_string);
-
- // Number of acquired environment variables + 1(For terminal) memory allocation
- size_t env_num = sizeof(char*) * (vec_environ->size() + 1);
- char **p_environment = static_cast<char **>(malloc(env_num));
- memset(p_environment, 0x00, env_num);
-
- // Create environment variable list
- int i = 0;
- char **p_environment_tmp = p_environment;
- for (std::vector<SS_String>::iterator itr = vec_environ->begin(); itr != vec_environ->end(); itr++, i++) {
- p_environment_tmp[i] = static_cast<char *>(malloc(sizeof(char) * (itr->length() + 1)));
-
- snprintf(p_environment_tmp[i], itr->length() + 1, "%s", itr->c_str());
- }
-
- // Set envp for environment variable
- process_id = CL_ProcessCreate(p_str_file->c_str(), c_argv, p_environment, cl_attr);
-
- // Free memory
- i = 0;
- p_environment_tmp = p_environment;
- for (std::vector<SS_String>::iterator itr = vec_environ->begin(); itr != vec_environ->end(); itr++, i++) {
- free(p_environment_tmp[i]);
- }
-
- free(p_environment);
- delete(vec_environ);
- }
-
- if (process_id == -1) {
- throw "CL_ProcessCreate()";
- }
-
- m_tProcessId = process_id;
- }
- catch (const char *e) {
- FRAMEWORKUNIFIEDLOG(ZONE_ERR, __PRETTY_FUNCTION__, "%s", e);
- }
-}
-/**
- * CreateProcess: This method will create a PosixBasedOS001 process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_strProcessName This is the name that will be registered to the OS for this process
- * @return void
- */
-void Process::CreateProcess(const SS_String& p_strFile_i, const SS_String& p_strProcessName,
- const char* unix_user_name, const long p_lSpawnFlags_i) { // NOLINT (runtime/int)
- StringList strlstArgv;
-
- try {
- CreateProcess(p_strFile_i,
- strlstArgv,
- NOWAIT,
- p_strProcessName,
- FIFO,
- iProcess_DEFAULT_PROCESS_PRIORITY,
- unix_user_name,
- p_lSpawnFlags_i);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-/**
- * CreateProcess: This method will create a process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_strProcessName This is the name that will be registered to the OS for this process
- * @param p_iPriority_i Priority of process
- * @return void
- */
-void Process::CreateProcess(const SS_String& p_strFile_i, const SS_String& p_strProcessName, const int p_iPriority_i,
- const char* unix_user_name, const long p_lSpawnFlags_i) { // NOLINT (runtime/int)
- StringList strlstArgv;
-
- try {
- eProcessSchedulingPolicy policy;
-
- if (0 < p_iPriority_i) {
- policy = FIFO;
- } else {
- policy = OTHER;
- }
-
- CreateProcess(p_strFile_i,
- strlstArgv,
- NOWAIT,
- p_strProcessName,
- policy,
- p_iPriority_i,
- unix_user_name,
- p_lSpawnFlags_i);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-/**
- * CreateProcess: This method will create a process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_lSpawnFlags_i Spawning flags. These are PosixBasedOS001 specific.
- * @return void
- */
-void Process::CreateProcess(const SS_String& p_strFile_i, const char* unix_user_name, const long p_lSpawnFlags_i) { // NOLINT (runtime/int)
- StringList strlstArgv;
-
- try {
- CreateProcess(p_strFile_i,
- strlstArgv,
- NOWAIT,
- basename(const_cast<char *>(p_strFile_i.c_str())),
- FIFO,
- iProcess_DEFAULT_PROCESS_PRIORITY,
- unix_user_name,
- p_lSpawnFlags_i);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-
-/**
- * CreateProcess: This method will create a process with the executable provided and mode as a calling parameter.
- * The caller can also provide a list of arguments that will be provided to the executable at startup.
- * The calling p_strProcessName parameter is a textual name that will be
- * associated with the newly created process by the OS. The process state information
- * will be maintained by this object.
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_strProcessName This is the name that will be registered to the OS for this process
- * @param p_strlstArgv_i List of ARGV values for new process
- * @param p_lSpawnFlags_i Spawning flags. These are PosixBasedOS001 specific.
- * @return void
- */
-void Process::CreateProcess(const SS_String& p_strFile_i, const SS_String& p_strProcessName_i,
- const StringList& p_strlstArgv_i, const char* unix_user_name, const long p_lSpawnFlags_i) { // NOLINT (runtime/int)
- try {
- CreateProcess(p_strFile_i,
- p_strlstArgv_i,
- NOWAIT,
- p_strProcessName_i,
- FIFO,
- iProcess_DEFAULT_PROCESS_PRIORITY,
- unix_user_name,
- p_lSpawnFlags_i);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-void Process::CreateProcess(const SS_String& p_strFile_i, const SS_String& p_strProcessName_i, const int p_iPriority_i,
- const StringList& p_strlstArgv_i, const char* unix_user_name, const long p_lSpawnFlags_i) { // NOLINT (runtime/int)
- try {
- eProcessSchedulingPolicy policy;
-
- if (0 < p_iPriority_i) {
- policy = FIFO;
- } else {
- policy = OTHER;
- }
-
- CreateProcess(p_strFile_i,
- p_strlstArgv_i,
- NOWAIT,
- p_strProcessName_i,
- policy,
- p_iPriority_i,
- unix_user_name,
- p_lSpawnFlags_i);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-/**
- * CreateProcessWait: This method will create a process with the executable provided.
- * The process state information will be maintained by this object.
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @return void
- */
-void Process::CreateProcessWait(const SS_String& p_strFile_i) {
- StringList strlstArgv;
-
- try {
- CreateProcess(p_strFile_i,
- strlstArgv,
- WAIT,
- basename(const_cast<char *>(p_strFile_i.c_str())),
- FIFO,
- iProcess_DEFAULT_PROCESS_PRIORITY,
- iProcess_DEFAULT_PROCESS_USER_NAME,
- iProcess_DEFAULT_PROCESS_FLAGS);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-/**
- * CreateProcessWait: This method will create a PosixBasedOS001 process with the executable provided.
- * The process state information will be maintained by this object.
- *
- *
- * @param p_strFile_i Path and Filename of executable to create process for
- * @param p_strlstArguments_i List of process calling arguments
- * @return void
- */
-void Process::CreateProcessWait(const SS_String& p_strFile_i, const StringList& p_strlstArguments_i) {
- try {
- CreateProcess(p_strFile_i,
- p_strlstArguments_i,
- WAIT,
- basename(const_cast<char *>(p_strFile_i.c_str())),
- FIFO,
- iProcess_DEFAULT_PROCESS_PRIORITY,
- iProcess_DEFAULT_PROCESS_USER_NAME,
- iProcess_DEFAULT_PROCESS_FLAGS);
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-
-/**
- * KillProcess: This method will delete the process represented by this object. All variables associated
- * with this object will be initialized to a know value.
- *
- * @param
- * @return void
- */
-void Process::KillProcess(int signal) {
- //=====================================================================================
- // Intialize the objects m_iErrorCode member variable to 0 (no error).
- // Then try to delete the process that this object represents.
- m_iErrorCode = 0;
-
- if (DoesProcessExist()) {
- if (-1 == killpg(m_tProcessId, signal)) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
- }
-
- //
- // If no errors, clear out any process specific member variables for this object
- //
- m_tProcessId = -1;
- m_strProcessName = "";
-}
-
-/**
- * SetSchedulingPolicy: This method will change the scheduling policy for the process this
- * object represents.
- *
- * @param p_eSchedulingPolicy_i Scheduling policy
- * @return void
- */
-void Process::SetSchedulingPolicy(
- const eProcessSchedulingPolicy p_eSchedulingPolicy_i // Scheduling policy
-) {
- //=======================================================================================
- // Attempt to change the scheduling policy for the process that this object
- // represents. If the change fails, restore the previous settings.
- //
- m_iErrorCode = 0;
- struct sched_param cur_sch_params;
- sched_getparam(m_tProcessId, &cur_sch_params);
- if (0 != sched_setscheduler(m_tProcessId, ConvertToPosixBasedOS001SchedularPolicy(p_eSchedulingPolicy_i),
- &cur_sch_params)) {
- m_iErrorCode = errno;
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-/**
- * SetPriority: This method will change the priority for the process this
- * object represents.
- *
- * @param p_iPriority_i Scheduling Policy for this process
- * @return void
- */
-void Process::SetPriority(const int p_iPriority_i) {
- //=======================================================================================
- // Attempt to change the priority for the process that this object
- // represents. If the change fails, restore the previous settings.
- //
- m_iErrorCode = 0;
- struct sched_param cur_sch_params;
- sched_getparam(m_tProcessId, &cur_sch_params);
- cur_sch_params.sched_priority = p_iPriority_i;
-
- if (-1 == sched_setparam(m_tProcessId, &cur_sch_params)) {
- m_iErrorCode = errno;
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-/**
- * IncreasePriorityByOne: This method will increase the priority for the process this
- * object represents by one.
- *
- * @param
- * @return void
- */
-void Process::IncreasePriorityByOne(void) {
- //================================================================================
- // Retrieve the current priority of the process. Check to see if already at max.
- // If so just return. Otherwise increase by one and set the priority...
- //
- try {
- int iCurrentPriority = GetPriority();
- if (iCurrentPriority < iProcess_MAXIMUM_PROCESS_PRIORITY) {
- SetPriority(iCurrentPriority + 1);
- }
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-/**
- * DecreasePriorityByOne: This method will decrease the priority for the process this
- * object represents by one.
- *
- *
- * @return void
- */
-void Process::DecreasePriorityByOne(void) {
- //================================================================================
- // Retrieve the current priority of the process. Check to see if already at minimum.
- // If so just return. Otherwise decrease by one and set the priority...
- //
- try {
- int iCurrentPriority = GetPriority();
- if (iCurrentPriority > 1) {
- SetPriority(iCurrentPriority - 1);
- }
- }
- catch (...) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-}
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ConvertToPosixBasedOS001SchedularPolicy
-//
-// This method will return to the caller the equivalent PosixBasedOS001 schedular policy for the process
-// that this object represents
-//
-//
-// Calling Arguments:
-// NONE
-//
-// Return Argument:
-// FIFO, // A fixed priority scheduler in which the highest ready process runs until it
-// // blocks or is preempted by a higher priority process.
-// ROUND_ROBIN, // The same as FIFO, except processes at the same priority level time-slice.
-// OTHER // A general time sharing scheduler in which a process decays in priority if it
-// // consumes too much processor before blocking. It reverts to its default priority
-// // when it blocks. Should it fail to run over a 2 second period and it has decayed
-// // then it's boosted one priority level up to a maximum of its default priority.
-//
-int const Process::ConvertToPosixBasedOS001SchedularPolicy(const eProcessSchedulingPolicy p_eSchedulingPolicy_i) {
- int iReturnValue = SCHED_RR; // Default is RR
- switch (p_eSchedulingPolicy_i) {
- case FIFO:
- {
- iReturnValue = SCHED_FIFO;
- break;
- }
-
- case ROUND_ROBIN:
- {
- iReturnValue = SCHED_RR;
- break;
- }
-
- case OTHER:
- {
- iReturnValue = SCHED_OTHER;
- break;
- }
- }
-
- return iReturnValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ConvertFromPosixBasedOS001SchedularPolicy
-//
-// This method will return to the caller the eProcessSchedulingPolicy based on the PosixBasedOS001 schedular
-// policy for the process that this object represents
-//
-//
-// Calling Arguments:
-// PosixBasedOS001 Scheduling Policy
-//
-// Return Argument:
-// FIFO, // A fixed priority scheduler in which the highest ready process runs until it
-// // blocks or is preempted by a higher priority process.
-// ROUND_ROBIN, // The same as FIFO, except processes at the same priority level time-slice.
-// OTHER // A general time sharing scheduler in which a process decays in priority if it
-// // consumes too much processor before blocking. It reverts to its default priority
-// // when it blocks. Should it fail to run over a 2 second period and it has decayed
-// // then it's boosted one priority level up to a maximum of its default priority.
-//
-Process::eProcessSchedulingPolicy const Process::ConvertFromPosixBasedOS001SchedularPolicy
- (const int p_iPosixBasedOS001chedulingPolicy_i) {
- eProcessSchedulingPolicy ePolicy = ROUND_ROBIN; // Default is RR
- switch (p_iPosixBasedOS001chedulingPolicy_i) {
- case SCHED_FIFO:
- {
- ePolicy = FIFO;
- break;
- }
-
- case SCHED_RR:
- {
- ePolicy = ROUND_ROBIN;
- break;
- }
- case SCHED_OTHER:
- {
- ePolicy = OTHER;
- break;
- }
- } // Switch
-
- return ePolicy;
-}
-
-
-/**
- * DoesProcessExist: This method will return a BOOLean indicating whether this
- * process exists.
- *
- * @return BOOL TRUE - Process Exists, FALSE - Process does not exist
- */
-BOOL Process::DoesProcessExist(void) {
- struct sched_param cur_sch_params;
- if (-1 >= sched_getparam(m_tProcessId, &cur_sch_params)) { // or the segment data
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-
-/**
- * SetProcessName: This method will set this objects process name member variable to the
- * provided string value.
- *
- * @param p_strProcessName_i Process Name to set the m_strProcessName member variable to
- * @return void
- */
-void Process::SetProcessName(const SS_String& p_strProcessName_i) {
- //
- // Idiot checking
- //
- assert(!p_strProcessName_i.empty());
-
- m_strProcessName = p_strProcessName_i;
-}
-
-/**
- * GetSchedulingPolicy: This method will return to the caller the
- * currently configured process scheduling policy.
- *
- * @return Process::eProcessSchedulingPolicy const
- */
-Process::eProcessSchedulingPolicy const Process::GetSchedulingPolicy(void) {
- int policy = 0;
- if (-1 == (policy = sched_getscheduler(m_tProcessId))) {
- m_iErrorCode = errno;
- return ROUND_ROBIN; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-
- return (ConvertFromPosixBasedOS001SchedularPolicy (policy));
-}
-
-
-
-/**
- * GetPriority: This method will return to the caller the currently configured
- * process priority.
- *
- * @return int const
- */
-int const Process::GetPriority(void) {
- struct sched_param cur_sch_params;
- if (-1 >= sched_getparam(m_tProcessId, &cur_sch_params)) {
- m_iErrorCode = errno;
- return -1; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-
- return (cur_sch_params.sched_priority);
-}
-
-
-
-/**
- * SetCallingArgumentList: This method will set the calling argument list
- * that this object represents.
- *
- * @param p_pcArgv_i Pointer to NULL terminated argument list.
- * @param p_iArgc_i Number of parameters
- * @return void
- */
-void Process::SetCallingArgumentList(const char *p_pcArgv_i[], const int p_iArgc_i) {
- ////////////////////////////////////////////////////////////////////////
- // Set the executable filename first. This is always the 1st argument
- // in the argument list. Then set the argument list for the process
- // which is held in m_strlstArgv.
- //
- if (p_iArgc_i > (iProcess_MAXIMUM_NUMBER_OF_PROCESS_ARGUMENTS - 3)) {
- return; // PAD THIS IS BAD!!! TODO: Change this to something meaningful
- }
-
- //
- // First make sure that the argument list is empty.
- //
- if (!m_strlstArgv.empty()) {
- m_strlstArgv.clear(); // Remove all elements from the current list
- } // Process Argument list is NOT empty
-
- //
- // Once empty, put the new arguments into the list
- //
- StringListIter at = m_strlstArgv.begin();
- int iLoop;
- for (iLoop = 0; iLoop < p_iArgc_i; iLoop ++) {
- at = m_strlstArgv.insert(at, p_pcArgv_i[iLoop]);
- }
-}
-
-
-/**
- * SetCallingArgumentList: This method will set the calling argument
- * list that this object represents.
- *
- * @param p_strlstParameters_i List of parameters
- * @return void
- */
-void Process::SetCallingArgumentList(const StringList& p_strlstParameters_i) {
- if (p_strlstParameters_i.size()) {
- m_strlstArgv.clear(); // Empty the current list.
- m_strlstArgv = p_strlstParameters_i;
- }
-}
-
-/**
- * Search if libTestFwCommon.so is dynamically linked.
- *
- * @param process_path Search target binary path
- * @return bool
- */
-static bool CheckLinkedTestfwLibrary(SS_String *process_path) {
- if (NULL == process_path) {
- fprintf(stderr, "[%s](%d)Invaild Param.\n", __func__, __LINE__);
- return false;
- }
-
- ELFIO::elfio reader;
- if (!reader.load(process_path->c_str())) {
- fprintf(stderr, "[%s](%d)%s is not ELF!\n", __func__, __LINE__, process_path->c_str());
- return false;
- }
-
- ELFIO::Elf_Half n = reader.sections.size();
- for ( ELFIO::Elf_Half i = 0; i < n; ++i ) {
- ELFIO::section* sec = reader.sections[i];
- if ( SHT_DYNAMIC == sec->get_type() ) {
- ELFIO::dynamic_section_accessor dynamic(reader, sec);
-
- ELFIO::Elf_Xword dynamic_num = dynamic.get_entries_num();
- if ( dynamic_num > 0 ) {
- for ( ELFIO::Elf_Xword i = 0; i < dynamic_num; ++i ) {
- ELFIO::Elf_Xword dynamic_tag = 0;
- ELFIO::Elf_Xword dynamic_value = 0;
- SS_String dynamic_str;
- dynamic.get_entry(i, dynamic_tag, dynamic_value, dynamic_str);
-
- // Search if the acquired dynamic section string contains libTestFwCommon.so
- if (SS_String::npos != dynamic_str.find("libTestFwCommon.so")) {
- fprintf(stderr, "[%s](%d)libTestFwCommon is linked.\n", __func__, __LINE__);
- return true;
- }
-
- // Check for continuation of dynamic section element
- if ( DT_NULL == dynamic_tag ) {
- break;
- }
- }
- } else {
- // If dynamic section is not found
- fprintf(stderr, "[%s](%d)dynamic symbol is not find.\n", __func__, __LINE__);
- }
- }
- }
-
- fprintf(stderr, "[%s](%d)libTestFwCommon is not find. \n", __func__, __LINE__);
- return false;
-}
-
-/**
- * This method is a private method to be called from CreateProcess func.
- * Check environment variable MOCK_LIBRARY where Mock Library Name to set in LD_PRELOAD is set
- * and output character string to set in LD_PRELOAD if there is setting.
- *
- * @param process_path,environment_string
- * @return void
- */
-void Process::CheckLdPreLoad(SS_String *process_path, char *environment_string) {
- if ((process_path == NULL || environment_string == NULL)) {
- fprintf(stderr, "[%s](%d)Invaild Param.\n", __func__, __LINE__);
- return;
- }
-
- // Check if environment variable MOCK_LIBRARY for LD_PRELOAD setting is set
- char *value_mock_library = getenv("MOCK_LIBRARY");
-
- if (value_mock_library != NULL) {
- // When MOCK_LIBRARY is set
- fprintf(stderr, "[%s](%d)MOCK_LIBRARY = %s \n", __func__, __LINE__, value_mock_library);
-
- // Check whether the process to be started is a core unit or TestFW, and execute LD_PRELOAD if libTestFwCommon.so is linked
- if (CheckLinkedTestfwLibrary(process_path)) {
- SS_String key_value;
- SS_String key_ld_preload = "LD_PRELOAD=";
-
- // Create LD_PRELOAD setting string
- // LD_PRELOAD is enabled when the string is an envp argument in the form "LD_PRELOAD=hoge_mock.so hoge_mock.so ..."
- key_value = key_ld_preload + value_mock_library;
- strncpy(environment_string, key_value.c_str(), key_value.length());
- fprintf(stderr, "[%s](%d)Set envp: %s \n", __func__, __LINE__, environment_string);
- return;
- } else {
- // If the unit does not require LD_PRELOAD setting, set envairoment_string to NULL.
- fprintf(stderr, "[%s](%d)Core Unit is not setting LD_PRELOAD\n", __func__, __LINE__);
- return;
- }
- } else {
- // If it is not set to MOCK_LIBRARY, it is not necessary to set LD_PRELOAD, so set envairoment_string to NULL.
- fprintf(stderr, "[%s](%d)The MOCK_LIBRARY variable was unestablished.\n", __func__, __LINE__);
- return;
- }
-}
-
-/**
- * Acquire the character string of the environment variable and set it in String Vector
- * and return in a pointer of Vector.
- *
- * @param process_path,environment_string
- * @return vector<SS_String> pointer
- */
-extern char ** environ;
-std::vector<SS_String> *Process::GetEnvironVector(void) {
- // If LD_PRELOAD is set, copy existing environment settings and set to environment_pointer
-
- std::vector<SS_String>* vector_environ = new std::vector<SS_String>;
-
- char **environ_tmp = environ;
-
- // Insert environ_string into the vector table
- int i = 0;
- while (environ_tmp[i] != NULL) {
- SS_String str_env(environ_tmp[i]);
- vector_environ->push_back(str_env);
- i++;
- }
-
- return vector_environ;
-}
-// ----------------------------------------