• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #include <ctype.h>
16 #include <errno.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <sys/socket.h>
20 
21 #include "init_log.h"
22 #include "init_param.h"
23 #include "init_utils.h"
24 #include "loop_event.h"
25 #include "param_manager.h"
26 #include "param_message.h"
27 #include "trigger_manager.h"
28 #include "securec.h"
29 #ifdef PARAM_SUPPORT_SELINUX
30 #include "selinux_parameter.h"
31 #include <policycoreutils.h>
32 #include <selinux/selinux.h>
33 #endif
34 
35 static ParamService g_paramService = {};
36 
OnClose(ParamTaskPtr client)37 PARAM_STATIC void OnClose(ParamTaskPtr client)
38 {
39     ParamWatcher *watcher = (ParamWatcher *)ParamGetTaskUserData(client);
40     if (client == g_paramService.watcherTask) {
41         ClearWatchTrigger(watcher, TRIGGER_PARAM_WATCH);
42         g_paramService.watcherTask = NULL;
43     } else {
44         ClearWatchTrigger(watcher, TRIGGER_PARAM_WAIT);
45     }
46 }
47 
TimerCallback(const ParamTaskPtr timer,void * context)48 static void TimerCallback(const ParamTaskPtr timer, void *context)
49 {
50     UNUSED(context);
51     UNUSED(timer);
52     int ret = CheckWatchTriggerTimeout();
53     // no wait node
54     if (ret == 0 && g_paramService.timer != NULL) {
55         ParamTaskClose(g_paramService.timer);
56         g_paramService.timer = NULL;
57     }
58 }
59 
CheckAndSendTrigger(uint32_t dataIndex,const char * name,const char * value)60 static void CheckAndSendTrigger(uint32_t dataIndex, const char *name, const char *value)
61 {
62     WorkSpace *workspace = GetWorkSpaceByName(name);
63     PARAM_CHECK(workspace != NULL, return, "Failed to get workspace %s ", name);
64     ParamNode *entry = (ParamNode *)GetTrieNode(workspace, dataIndex);
65     PARAM_CHECK(entry != NULL, return, "Failed to get data %s ", name);
66     uint32_t trigger = 1;
67     if ((ATOMIC_LOAD_EXPLICIT(&entry->commitId, MEMORY_ORDER_RELAXED) & PARAM_FLAGS_TRIGGED) != PARAM_FLAGS_TRIGGED) {
68         trigger = (CheckAndMarkTrigger(TRIGGER_PARAM, name) != 0) ? 1 : 0;
69     }
70     if (trigger) {
71         ATOMIC_SYNC_OR_AND_FETCH(&entry->commitId, PARAM_FLAGS_TRIGGED, MEMORY_ORDER_RELEASE);
72         // notify event to process trigger
73         PostParamTrigger(EVENT_TRIGGER_PARAM, name, value);
74     }
75 
76     int wait = 1;
77     if ((ATOMIC_LOAD_EXPLICIT(&entry->commitId, MEMORY_ORDER_RELAXED) & PARAM_FLAGS_WAITED) != PARAM_FLAGS_WAITED) {
78         wait = (CheckAndMarkTrigger(TRIGGER_PARAM_WAIT, name) != 0) ? 1 : 0;
79     }
80     if (wait) {
81         ATOMIC_SYNC_OR_AND_FETCH(&entry->commitId, PARAM_FLAGS_WAITED, MEMORY_ORDER_RELEASE);
82         PostParamTrigger(EVENT_TRIGGER_PARAM_WAIT, name, value);
83     }
84     PostParamTrigger(EVENT_TRIGGER_PARAM_WATCH, name, value);
85 }
86 
SendResponseMsg(ParamTaskPtr worker,const ParamMessage * msg,int result)87 static int SendResponseMsg(ParamTaskPtr worker, const ParamMessage *msg, int result)
88 {
89     ParamResponseMessage *response = NULL;
90     response = (ParamResponseMessage *)CreateParamMessage(msg->type, msg->key, sizeof(ParamResponseMessage));
91     PARAM_CHECK(response != NULL, return PARAM_CODE_ERROR, "Failed to alloc memory for response");
92     response->msg.id.msgId = msg->id.msgId;
93     response->result = result;
94     response->msg.msgSize = sizeof(ParamResponseMessage);
95     ParamTaskSendMsg(worker, (ParamMessage *)response);
96     PARAM_LOGV("Send response msg msgId %d result %d", msg->id.msgId, result);
97     return 0;
98 }
99 
SendWatcherNotifyMessage(const TriggerExtInfo * extData,const char * content,uint32_t size)100 static int SendWatcherNotifyMessage(const TriggerExtInfo *extData, const char *content, uint32_t size)
101 {
102     PARAM_CHECK(content != NULL, return -1, "Invalid content");
103     PARAM_CHECK(extData != NULL && extData->stream != NULL, return -1, "Invalid extData");
104     uint32_t msgSize = sizeof(ParamMessage) + PARAM_ALIGN(strlen(content) + 1);
105     ParamMessage *msg = (ParamMessage *)CreateParamMessage(MSG_NOTIFY_PARAM, "*", msgSize);
106     PARAM_CHECK(msg != NULL, return -1, "Failed to create msg ");
107 
108     uint32_t offset = 0;
109     int ret;
110     char *tmp = strstr(content, "=");
111     if (tmp != NULL) {
112         ret = strncpy_s(msg->key, sizeof(msg->key) - 1, content, tmp - content);
113         PARAM_CHECK(ret == 0, free(msg);
114             return -1, "Failed to fill value");
115         tmp++;
116         ret = FillParamMsgContent(msg, &offset, PARAM_VALUE, tmp, strlen(tmp));
117         PARAM_CHECK(ret == 0, free(msg);
118             return -1, "Failed to fill value");
119     } else if (content != NULL && strlen(content) > 0) {
120         ret = FillParamMsgContent(msg, &offset, PARAM_VALUE, content, strlen(content));
121         PARAM_CHECK(ret == 0, free(msg);
122             return -1, "Failed to fill value");
123     }
124 
125     msg->id.msgId = 0;
126     if (extData->type == TRIGGER_PARAM_WAIT) {
127         msg->id.msgId = extData->info.waitInfo.waitId;
128     } else {
129         msg->id.msgId = extData->info.watchInfo.watchId;
130     }
131     msg->msgSize = sizeof(ParamMessage) + offset;
132     PARAM_LOGV("SendWatcherNotifyMessage cmd %s, id %d msgSize %d para: %s",
133         (extData->type == TRIGGER_PARAM_WAIT) ? "wait" : "watcher",
134         msg->id.msgId, msg->msgSize, content);
135     ParamTaskSendMsg(extData->stream, msg);
136     return 0;
137 }
138 
SystemSetParam(const char * name,const char * value,const ParamSecurityLabel * srcLabel)139 static int SystemSetParam(const char *name, const char *value, const ParamSecurityLabel *srcLabel)
140 {
141     PARAM_LOGV("SystemWriteParam name %s value: %s", name, value);
142     uint32_t ctrlService = 0;
143     int ret = CheckParameterSet(name, value, srcLabel, &ctrlService);
144     PARAM_CHECK(ret == 0, return ret, "Forbid to set parameter %s", name);
145 
146     unsigned int mode = 0;
147     if (strncmp(name, PARAM_PERSIST_PREFIX, strlen(PARAM_PERSIST_PREFIX)) == 0) {
148         mode |= LOAD_PARAM_PERSIST;
149     }
150     if ((ctrlService & PARAM_CTRL_SERVICE) != PARAM_CTRL_SERVICE) { // ctrl param
151         uint32_t dataIndex = 0;
152         ret = WriteParam(name, value, &dataIndex, mode);
153         PARAM_CHECK(ret == 0, return ret, "Failed to set param %d name %s %s", ret, name, value);
154         ret = WritePersistParam(name, value);
155         PARAM_CHECK(ret == 0, return ret, "Failed to set persist param name %s", name);
156         CheckAndSendTrigger(dataIndex, name, value);
157     }
158     return ret;
159 }
160 
SystemUpdateConstParamter(const char * name,const char * value,const ParamSecurityLabel * srcLabel)161 static int SystemUpdateConstParamter(const char *name, const char *value, const ParamSecurityLabel *srcLabel)
162 {
163     PARAM_LOGV("SystemUpdateConstParam name %s value: %s", name, value);
164     uint32_t ctrlService = 0;
165     int ret = CheckParameterSet(name, value, srcLabel, &ctrlService);
166     PARAM_CHECK(ret == 0, return ret, "Forbid to set parameter %s", name);
167     PARAM_CHECK(IS_READY_ONLY(name), return PARAM_CODE_INVALID_NAME, "only update read only param: %s", name);
168     if ((ctrlService & PARAM_CTRL_SERVICE) != PARAM_CTRL_SERVICE) { // ctrl param
169         uint32_t dataIndex = 0;
170         ret = WriteParam(name, value, &dataIndex, LOAD_PARAM_UPDATE_CONST);
171         PARAM_CHECK(ret == 0, return ret, "Failed to update const param %d name %s %s", ret, name, value);
172         CheckAndSendTrigger(dataIndex, name, value);
173     }
174     return ret;
175 }
176 
HandleParamSet(const ParamTaskPtr worker,const ParamMessage * msg)177 static int HandleParamSet(const ParamTaskPtr worker, const ParamMessage *msg)
178 {
179     uint32_t offset = 0;
180     ParamMsgContent *valueContent = GetNextContent(msg, &offset);
181     PARAM_CHECK(valueContent != NULL, return -1, "Invalid msg for %s", msg->key);
182     ParamSecurityLabel srcLabel = {0};
183     struct ucred cr = {-1, -1, -1};
184     socklen_t crSize = sizeof(cr);
185     if (getsockopt(LE_GetSocketFd(worker), SOL_SOCKET, SO_PEERCRED, &cr, &crSize) < 0) {
186         PARAM_LOGE("Failed to get opt %d", errno);
187 #ifndef STARTUP_INIT_TEST
188         return SendResponseMsg(worker, msg, -1);
189 #endif
190     }
191     srcLabel.sockFd = LE_GetSocketFd(worker);
192     srcLabel.cred.uid = cr.uid;
193     srcLabel.cred.pid = cr.pid;
194     srcLabel.cred.gid = cr.gid;
195     PARAM_LOGI("Handle set param msgId %d pid %d key: %s", msg->id.msgId, cr.pid, msg->key);
196     int ret = SystemSetParam(msg->key, valueContent->content, &srcLabel);
197     return SendResponseMsg(worker, msg, ret);
198 }
199 
AddWatchNode(struct tagTriggerNode_ * trigger,const struct TriggerExtInfo_ * extInfo)200 static int32_t AddWatchNode(struct tagTriggerNode_ *trigger, const struct TriggerExtInfo_ *extInfo)
201 {
202     ParamWatcher *watcher = NULL;
203     if (extInfo != NULL && extInfo->stream != NULL) {
204         watcher = (ParamWatcher *)ParamGetTaskUserData(extInfo->stream);
205     }
206     PARAM_CHECK(watcher != NULL, return -1, "Failed to get param watcher data");
207     if (extInfo->type == TRIGGER_PARAM_WAIT) {
208         WaitNode *node = (WaitNode *)trigger;
209         OH_ListInit(&node->item);
210         node->timeout = extInfo->info.waitInfo.timeout;
211         node->stream = extInfo->stream;
212         node->waitId = extInfo->info.waitInfo.waitId;
213         OH_ListAddTail(&watcher->triggerHead, &node->item);
214     } else {
215         WatchNode *node = (WatchNode *)trigger;
216         OH_ListInit(&node->item);
217         node->watchId = extInfo->info.watchInfo.watchId;
218         OH_ListAddTail(&watcher->triggerHead, &node->item);
219     }
220     return 0;
221 }
222 
AddWatcherTrigger(int triggerType,const char * condition,const TriggerExtInfo * extData)223 static TriggerNode *AddWatcherTrigger(int triggerType, const char *condition, const TriggerExtInfo *extData)
224 {
225     TriggerWorkSpace *workSpace = GetTriggerWorkSpace();
226     TriggerHeader *header = (TriggerHeader *)&workSpace->triggerHead[extData->type];
227     return header->addTrigger(workSpace, condition, extData);
228 }
229 
ExecuteWatchTrigger_(const struct tagTriggerNode_ * trigger,const char * content,uint32_t size)230 static int32_t ExecuteWatchTrigger_(const struct tagTriggerNode_ *trigger, const char *content, uint32_t size)
231 {
232     TriggerExtInfo extData = {};
233     extData.type = trigger->type;
234     if (trigger->type == TRIGGER_PARAM_WAIT) {
235         WaitNode *node = (WaitNode *)trigger;
236         extData.stream = node->stream;
237         extData.info.waitInfo.waitId = node->waitId;
238         extData.info.waitInfo.timeout = node->timeout;
239     } else {
240         WatchNode *node = (WatchNode *)trigger;
241         extData.stream = g_paramService.watcherTask;
242         extData.info.watchInfo.watchId = node->watchId;
243     }
244     if (content == NULL) {
245         return SendWatcherNotifyMessage(&extData, "", 0);
246     }
247     return SendWatcherNotifyMessage(&extData, content, size);
248 }
249 
HandleParamWaitAdd(const ParamTaskPtr worker,const ParamMessage * msg)250 static int HandleParamWaitAdd(const ParamTaskPtr worker, const ParamMessage *msg)
251 {
252     PARAM_CHECK(msg != NULL, return -1, "Invalid message");
253     uint32_t offset = 0;
254 #ifndef STARTUP_INIT_TEST
255     uint32_t timeout = DEFAULT_PARAM_WAIT_TIMEOUT;
256 #else
257     uint32_t timeout = 0;
258 #endif
259     ParamMsgContent *valueContent = GetNextContent(msg, &offset);
260     PARAM_CHECK(valueContent != NULL, return -1, "Invalid msg");
261     PARAM_CHECK(valueContent->contentSize <= PARAM_CONST_VALUE_LEN_MAX, return -1, "Invalid msg");
262     ParamMsgContent *timeoutContent = GetNextContent(msg, &offset);
263     if (timeoutContent != NULL) {
264         timeout = *((uint32_t *)(timeoutContent->content));
265     }
266 
267     PARAM_LOGV("HandleParamWaitAdd name %s timeout %d", msg->key, timeout);
268     TriggerExtInfo extData = {};
269     extData.addNode = AddWatchNode;
270     extData.type = TRIGGER_PARAM_WAIT;
271     extData.stream = worker;
272     extData.info.waitInfo.waitId = msg->id.watcherId;
273     extData.info.waitInfo.timeout = timeout;
274     // first check match, if match send response to client
275     ParamNode *param = SystemCheckMatchParamWait(msg->key, valueContent->content);
276     if (param != NULL) {
277         SendWatcherNotifyMessage(&extData, param->data, param->valueLength);
278         return 0;
279     }
280 
281     uint32_t buffSize = strlen(msg->key) + valueContent->contentSize + 1 + 1;
282     char *condition = calloc(1, buffSize);
283     PARAM_CHECK(condition != NULL, return -1, "Failed to create condition for %s", msg->key);
284     int ret = sprintf_s(condition, buffSize - 1, "%s=%s", msg->key, valueContent->content);
285     PARAM_CHECK(ret > EOK, free(condition);
286         return -1, "Failed to copy name for %s", msg->key);
287     TriggerNode *trigger = AddWatcherTrigger(TRIGGER_PARAM_WAIT, condition, &extData);
288     PARAM_CHECK(trigger != NULL, free(condition);
289         return -1, "Failed to add trigger for %s", msg->key);
290     free(condition);
291     if (g_paramService.timer == NULL) {
292         ret = ParamTimerCreate(&g_paramService.timer, TimerCallback, &g_paramService);
293         PARAM_CHECK(ret == 0, return 0, "Failed to create timer %s", msg->key);
294         ret = ParamTimerStart(g_paramService.timer, MS_UNIT, (uint64_t)-1);
295         PARAM_CHECK(ret == 0,
296             ParamTaskClose(g_paramService.timer);
297             g_paramService.timer = NULL;
298             return 0, "Failed to set timer %s", msg->key);
299     }
300     return 0;
301 }
302 
HandleParamWatcherAdd(const ParamTaskPtr worker,const ParamMessage * msg)303 static int HandleParamWatcherAdd(const ParamTaskPtr worker, const ParamMessage *msg)
304 {
305     PARAM_CHECK(msg != NULL, return -1, "Invalid message");
306     PARAM_CHECK((g_paramService.watcherTask == NULL) ||
307         (g_paramService.watcherTask == worker), return -1, "Invalid watcher worker");
308     g_paramService.watcherTask = worker;
309     TriggerExtInfo extData = {};
310     extData.type = TRIGGER_PARAM_WATCH;
311     extData.addNode = AddWatchNode;
312     extData.stream = worker;
313     extData.info.watchInfo.watchId = msg->id.watcherId;
314     TriggerNode *trigger = AddWatcherTrigger(TRIGGER_PARAM_WATCH, msg->key, &extData);
315     if (trigger == NULL) {
316         PARAM_LOGE("Failed to add trigger for %s", msg->key);
317         return SendResponseMsg(worker, msg, -1);
318     }
319     PARAM_LOGI("HandleParamWatcherAdd name %s watcher: %u", msg->key, msg->id.watcherId);
320     return SendResponseMsg(worker, msg, 0);
321 }
322 
HandleParamWatcherDel(const ParamTaskPtr worker,const ParamMessage * msg)323 static int HandleParamWatcherDel(const ParamTaskPtr worker, const ParamMessage *msg)
324 {
325     PARAM_CHECK(msg != NULL, return -1, "Invalid message");
326     PARAM_LOGV("HandleParamWatcherDel name %s watcher: %u", msg->key, msg->id.watcherId);
327     DelWatchTrigger(TRIGGER_PARAM_WATCH, (const void *)&msg->id.watcherId);
328     return SendResponseMsg(worker, msg, 0);
329 }
330 
HandleParamSave(const ParamTaskPtr worker,const ParamMessage * msg)331 static int HandleParamSave(const ParamTaskPtr worker, const ParamMessage *msg)
332 {
333     PARAM_CHECK(msg != NULL, return -1, "Invalid message");
334     struct ucred cr = {-1, -1, -1};
335     socklen_t crSize = sizeof(cr);
336     if (getsockopt(LE_GetSocketFd(worker), SOL_SOCKET, SO_PEERCRED, &cr, &crSize) < 0) {
337         PARAM_LOGE("Failed to get opt %d", errno);
338 #ifndef STARTUP_INIT_TEST
339         return SendResponseMsg(worker, msg, -1);
340 #endif
341     }
342     PARAM_LOGI("process info:pid = %d, uid = %d, gid = %d", cr.pid, cr.uid, cr.gid);
343     int ret = CheckIfUidInGroup(cr.uid, "servicectrl");
344     PARAM_CHECK(ret == 0, return SendResponseMsg(worker, msg, -1), "Failed to process save parameters : ret %d", ret);
345     CheckAndSavePersistParam();
346     return SendResponseMsg(worker, msg, 0);
347 }
348 
ProcessMessage(const ParamTaskPtr worker,const ParamMessage * msg)349 PARAM_STATIC int ProcessMessage(const ParamTaskPtr worker, const ParamMessage *msg)
350 {
351     PARAM_CHECK((msg != NULL) && (msg->msgSize >= sizeof(ParamMessage)), return -1, "Invalid msg");
352     PARAM_CHECK(worker != NULL, return -1, "Invalid worker");
353     int ret = PARAM_CODE_INVALID_PARAM;
354     switch (msg->type) {
355         case MSG_SET_PARAM:
356             ret = HandleParamSet(worker, msg);
357             break;
358         case MSG_WAIT_PARAM:
359             ret = HandleParamWaitAdd(worker, msg);
360             break;
361         case MSG_ADD_WATCHER:
362             ret = HandleParamWatcherAdd(worker, msg);
363             break;
364         case MSG_DEL_WATCHER:
365             ret = HandleParamWatcherDel(worker, msg);
366             break;
367         case MSG_SAVE_PARAM:
368             ret = HandleParamSave(worker, msg);
369             break;
370         default:
371             break;
372     }
373     PARAM_CHECK(ret == 0, return -1, "Failed to process message ret %d", ret);
374     return 0;
375 }
376 
OnIncomingConnect(LoopHandle loop,TaskHandle server)377 PARAM_STATIC int OnIncomingConnect(LoopHandle loop, TaskHandle server)
378 {
379     ParamStreamInfo info = {};
380 #ifdef STARTUP_INIT_TEST
381     info.flags = PARAM_TEST_FLAGS;
382 #endif
383     info.server = NULL;
384     info.close = OnClose;
385     info.recvMessage = ProcessMessage;
386     info.incomingConnect = NULL;
387     ParamTaskPtr client = NULL;
388     int ret = ParamStreamCreate(&client, server, &info, sizeof(ParamWatcher));
389     PARAM_CHECK(ret == 0, return -1, "Failed to create client");
390 
391     ParamWatcher *watcher = (ParamWatcher *)ParamGetTaskUserData(client);
392     PARAM_CHECK(watcher != NULL, return -1, "Failed to get watcher");
393     OH_ListInit(&watcher->triggerHead);
394     watcher->stream = client;
395 #ifdef STARTUP_INIT_TEST
396     g_paramService.watcherTask = client;
397 #endif
398     return 0;
399 }
400 
LoadSelinuxLabel(const char * op)401 static void LoadSelinuxLabel(const char *op)
402 {
403     // load security label
404 #ifdef PARAM_SUPPORT_SELINUX
405     ParamSecurityOps *ops = GetParamSecurityOps(PARAM_SECURITY_SELINUX);
406     if (ops != NULL && ops->securityGetLabel != NULL) {
407         ops->securityGetLabel(op);
408     }
409 #endif
410 }
411 
InitParamService(void)412 int InitParamService(void)
413 {
414 #ifdef INIT_ASAN
415     // Because the old paramWorkSpace' memory is malloced in libc.so's construction function,
416     // which is before the asan enabled, some error will happen if the memory free after with asan detection.
417     // So, we just reset the flag of the old paramWorkSpace to drop it.
418     PARAM_LOGI("INIT_ASAN is defined, begin to reset global paramWorkSpace");
419     ParamWorkSpace *paramWorkSpace = GetParamWorkSpace();
420     paramWorkSpace->flags = 0;
421 #endif
422     PARAM_LOGI("InitParamService pipe: %s.", PIPE_NAME);
423     CheckAndCreateDir(PIPE_NAME);
424     CheckAndCreateDir(PARAM_STORAGE_PATH"/");
425     // param space
426     PARAM_WORKSPACE_OPS ops = {0};
427     ops.updaterMode = InUpdaterMode();
428     // init open log
429     ops.logFunc = InitLog;
430     ops.getServiceGroupIdByPid = GetServiceGroupIdByPid;
431 #ifdef PARAM_SUPPORT_SELINUX
432     ops.setfilecon = setfilecon;
433 #endif
434     int ret = InitParamWorkSpace(0, &ops);
435     PARAM_CHECK(ret == 0, return ret, "Init parameter workspace fail");
436     ret = InitPersistParamWorkSpace();
437     PARAM_CHECK(ret == 0, return ret, "Init persist parameter workspace fail");
438     // param server
439     if (g_paramService.serverTask == NULL) {
440         ParamStreamInfo info = {};
441         info.server = PIPE_NAME;
442         info.close = NULL;
443         info.recvMessage = NULL;
444         info.incomingConnect = OnIncomingConnect;
445         ret = ParamServerCreate(&g_paramService.serverTask, &info);
446         PARAM_CHECK(ret == 0, return ret, "Failed to create server");
447     }
448 
449     // init trigger space
450     ret = InitTriggerWorkSpace();
451     PARAM_CHECK(ret == 0, return ret, "Failed to init trigger");
452     RegisterTriggerExec(TRIGGER_PARAM_WAIT, ExecuteWatchTrigger_);
453     RegisterTriggerExec(TRIGGER_PARAM_WATCH, ExecuteWatchTrigger_);
454 
455     return 0;
456 }
457 
LoadSpecialParam(void)458 void LoadSpecialParam(void)
459 {
460     // read param area size from cfg and save to dac
461     LoadParamAreaSize();
462     // read selinux label
463     LoadSelinuxLabel("init");
464     // from cmdline
465     LoadParamFromCmdLine();
466     // from build
467     LoadParamFromBuild();
468 }
469 
StartParamService(void)470 int StartParamService(void)
471 {
472 #ifdef STARTUP_INIT_TEST
473     return 0;
474 #endif
475     // read selinux label
476     LoadSelinuxLabel("permission");
477     return ParamServiceStart();
478 }
479 
StopParamService(void)480 void StopParamService(void)
481 {
482     PARAM_LOGI("StopParamService.");
483     ClosePersistParamWorkSpace();
484     CloseParamWorkSpace();
485     CloseTriggerWorkSpace();
486     ParamTaskClose(g_paramService.serverTask);
487     g_paramService.serverTask = NULL;
488     ParamServiceStop();
489 }
490 
SystemWriteParam(const char * name,const char * value)491 int SystemWriteParam(const char *name, const char *value)
492 {
493     return SystemSetParam(name, value, GetParamSecurityLabel());
494 }
495 
SystemUpdateConstParam(const char * name,const char * value)496 int SystemUpdateConstParam(const char *name, const char *value)
497 {
498     return SystemUpdateConstParamter(name, value, GetParamSecurityLabel());
499 }
500 
501 #ifdef STARTUP_INIT_TEST
GetParamService()502 ParamService *GetParamService()
503 {
504     return &g_paramService;
505 }
506 #endif
507