1/*
2 * Copyright (c) 2024 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 <errno.h>
17#include <stdio.h>
18#include <string.h>
19#include <unistd.h>
20#include "begetctl.h"
21#include "init_utils.h"
22#include "control_fd.h"
23#ifdef ENABLE_ENTER_APPSPAWN_SANDBOX
24#include "appspawn.h"
25#endif
26
27#define APPSPAWN_CMD_NUMBER 1
28
29static int SendAppspawnTimeMessage(const CmdAgent *agent, uint16_t type, const char *ptyName)
30{
31#ifdef ENABLE_ENTER_APPSPAWN_SANDBOX
32    if ((agent == NULL) || (ptyName == NULL)) {
33        BEGET_LOGE("Invalid parameter");
34        return -1;
35    }
36
37    AppSpawnClientHandle clientHandle;
38    int ret = AppSpawnClientInit("Appspawn", &clientHandle);
39    BEGET_ERROR_CHECK(ret == 0, return -1, "AppSpawnClientInit error, errno = %d", errno);
40    AppSpawnReqMsgHandle reqHandle;
41    ret = AppSpawnReqMsgCreate(MSG_BEGET_SPAWNTIME, "init", &reqHandle);
42    if (ret != 0) {
43        AppSpawnClientDestroy(clientHandle);
44        return -1;
45    }
46    AppSpawnResult result = {};
47    ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
48    if (ret != 0) {
49        AppSpawnClientDestroy(clientHandle);
50        return -1;
51    }
52    int minAppspawnTime = result.result;
53    int maxAppspawnTime = result.pid;
54    printf("minAppspawnTime: %d, maxAppspawnTime: %d \n", minAppspawnTime, maxAppspawnTime);
55    AppSpawnClientDestroy(clientHandle);
56    return 0;
57#endif
58    return -1;
59}
60
61static int main_cmd(BShellHandle shell, int argc, char* argv[])
62{
63    if (argc != APPSPAWN_CMD_NUMBER) {
64        BShellCmdHelp(shell, argc, argv);
65        return 0;
66    }
67    CmdAgent agent;
68    int ret = InitPtyInterface(&agent, ACTION_APP_SPAWNTIME, "init", (CallbackSendMsgProcess)SendAppspawnTimeMessage);
69    if (ret != 0) {
70        BEGET_LOGE("initptyinterface failed");
71        return -1;
72    }
73    return 0;
74}
75
76MODULE_CONSTRUCTOR(void)
77{
78    CmdInfo infos[] = {
79        {"appspawn_time", main_cmd, "get appspawn time", "appspawn_time", ""},
80    };
81    for (size_t i = 0; i < sizeof(infos) / sizeof(infos[0]); i++) {
82        BShellEnvRegisterCmd(GetShellHandle(), &infos[i]);
83    }
84}
85
86