1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <cstdio>
17 #include <sys/stat.h>
18
19 #include "app_manager.h"
20 #include "component_manager.h"
21 #include "exception_manager.h"
22 #include "multimode_manager.h"
23 #include "report.h"
24 #include "scene_delegate.h"
25 #include "string_ex.h"
26 #include "tree_manager.h"
27 #include "wukong_define.h"
28 #include "wukong_logger.h"
29 #include "wukong_shell_command.h"
30 #include "wukong_util.h"
31 #include "parameters.h"
32
33 using namespace OHOS::WuKong;
34
35 static const unsigned int NUMBER_TWO = 2;
36
FreeSingtion()37 static bool FreeSingtion()
38 {
39 AppManager::DestroyInstance();
40 ComponentManager::DestroyInstance();
41 ExceptionManager::DestroyInstance();
42 MultimodeManager::DestroyInstance();
43 Report::DestroyInstance();
44 SceneDelegate::DestroyInstance();
45 TreeManager::DestroyInstance();
46 WuKongUtil::DestroyInstance();
47 return true;
48 }
49
WuKongMutexFile()50 static void WuKongMutexFile()
51 {
52 int fileExist = access("/dev/shm", F_OK);
53 if (fileExist == 0) {
54 DEBUG_LOG("File exist. Now create wukong test mutex.");
55 } else {
56 const int wuKongGm = mkdir("/dev/shm", 0777);
57 DEBUG_LOG("File create. Now create wukong test mutex.");
58 if (wuKongGm == -1) {
59 DEBUG_LOG("Error creating directory!");
60 }
61 }
62 }
63
InitSemaphore(NamedSemaphore & sem,const int count)64 static void InitSemaphore(NamedSemaphore& sem, const int count)
65 {
66 bool res = sem.Open();
67 if (!res) {
68 WuKongMutexFile();
69 res = sem.Create();
70 }
71 if (res) {
72 DEBUG_LOG("Open Semaphore success");
73 int value = sem.GetValue();
74 if (value > count) {
75 DEBUG_LOG_STR("the semaphore value is invalid (%d), and reopen Semaphore", value);
76 res = sem.Create();
77 if (!res) {
78 ERROR_LOG("create sem failed");
79 return;
80 }
81 } else {
82 DEBUG_LOG_STR("Semaphore Value: (%d)", value);
83 }
84 }
85 sem.Close();
86 }
87
IsRunning(NamedSemaphore & sem)88 static bool IsRunning(NamedSemaphore& sem)
89 {
90 bool result = false;
91 sem.Open();
92 // the wukong pidof buffer size.
93 const int bufferSize = 32;
94 int value = sem.GetValue();
95 TRACK_LOG_STR("Semaphore Is Open: (%d)", value);
96 if (value <= 0) {
97 FILE* fp = nullptr;
98 fp = popen("pidof wukong", "r");
99 TRACK_LOG("Run pidof wukong");
100 if (fp == nullptr) {
101 ERROR_LOG("popen function failed");
102 return true;
103 }
104 char pid[bufferSize] = {0};
105 if (fgets(pid, bufferSize - 1, fp) != nullptr) {
106 std::string pidStr(pid);
107 pidStr = OHOS::ReplaceStr(pidStr, "\n", " ");
108 TRACK_LOG_STR("Wukong Pid: (%s)", pidStr.c_str());
109 std::vector<std::string> strs;
110 OHOS::SplitStr(pidStr, " ", strs);
111 for (auto i : strs) {
112 DEBUG_LOG_STR("Pid: (%s)", i.c_str());
113 }
114 if (strs.size() >= NUMBER_TWO) {
115 result = true;
116 } else {
117 sem.Create();
118 result = false;
119 }
120 } else {
121 result = true;
122 }
123 pclose(fp);
124 }
125 return result;
126 }
127
main(int argc,char * argv[])128 int main(int argc, char* argv[])
129 {
130 if (!OHOS::system::GetBoolParameter("const.security.developermode.state", true)) {
131 std::cout << "Not a development mode state, please check device mode." << std::endl;
132 return 0;
133 }
134 std::shared_ptr<WuKongLogger> WuKonglogger = WuKongLogger::GetInstance();
135 // first start logger
136 WuKonglogger->SetLevel(LOG_LEVEL_INFO);
137 bool isStop = false;
138 for (int index = argc - 1; index >= 1; index--) {
139 std::string arg = argv[index];
140 if (arg == "--track") {
141 argv[index][0] = '\0';
142 WuKonglogger->SetLevel(LOG_LEVEL_TRACK);
143 }
144 if (arg == "--debug") {
145 argv[index][0] = '\0';
146 WuKonglogger->SetLevel(LOG_LEVEL_DEBUG);
147 }
148 if (arg == "stop") {
149 isStop = true;
150 }
151 }
152 if (!WuKonglogger->Start()) {
153 return 1;
154 }
155 NamedSemaphore semRun(SEMPHORE_RUN_NAME, 1);
156 InitSemaphore(semRun, 1);
157 NamedSemaphore semStop(SEMPHORE_STOP_NAME, 1);
158 InitSemaphore(semStop, 1);
159 WuKongShellCommand cmd(argc, argv);
160 if (isStop) {
161 std::cout << cmd.ExecCommand();
162 } else {
163 if (IsRunning(semRun)) {
164 ERROR_LOG("error: wukong has running, allow one program run.");
165 } else {
166 semRun.Open();
167 semRun.Wait();
168 std::cout << cmd.ExecCommand();
169 semRun.Post();
170 semRun.Close();
171 }
172 }
173 FreeSingtion();
174 WuKonglogger->Stop();
175 WuKongLogger::DestroyInstance();
176 INFO_LOG("exit main");
177 return 0;
178 }
179