1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci#include <signal.h>
16d9f0492fSopenharmony_ci#include <stdio.h>
17d9f0492fSopenharmony_ci#include <stdlib.h>
18d9f0492fSopenharmony_ci#include <termios.h>
19d9f0492fSopenharmony_ci
20d9f0492fSopenharmony_ci#include "begetctl.h"
21d9f0492fSopenharmony_ci#include "shell.h"
22d9f0492fSopenharmony_ci#include "shell_utils.h"
23d9f0492fSopenharmony_ci
24d9f0492fSopenharmony_cistatic BShellHandle g_handle = NULL;
25d9f0492fSopenharmony_cistruct termios terminalState;
26d9f0492fSopenharmony_cistatic void signalHandler(int signal)
27d9f0492fSopenharmony_ci{
28d9f0492fSopenharmony_ci    demoExit();
29d9f0492fSopenharmony_ci    exit(0);
30d9f0492fSopenharmony_ci}
31d9f0492fSopenharmony_ci
32d9f0492fSopenharmony_cistatic int32_t ShellInput(char *data, int32_t len)
33d9f0492fSopenharmony_ci{
34d9f0492fSopenharmony_ci    for (int32_t i = 0; i < len; i++) {
35d9f0492fSopenharmony_ci        data[i] = getchar();
36d9f0492fSopenharmony_ci    }
37d9f0492fSopenharmony_ci    return len;
38d9f0492fSopenharmony_ci}
39d9f0492fSopenharmony_ci
40d9f0492fSopenharmony_ciBShellHandle GetShellHandle(void)
41d9f0492fSopenharmony_ci{
42d9f0492fSopenharmony_ci    if (g_handle == NULL) {
43d9f0492fSopenharmony_ci        BShellInfo info = {PARAM_SHELL_DEFAULT_PROMPT, ShellInput};
44d9f0492fSopenharmony_ci        BShellEnvInit(&g_handle, &info);
45d9f0492fSopenharmony_ci    }
46d9f0492fSopenharmony_ci    return g_handle;
47d9f0492fSopenharmony_ci}
48d9f0492fSopenharmony_ci
49d9f0492fSopenharmony_ci#ifndef STARTUP_INIT_TEST
50d9f0492fSopenharmony_ciint main(int argc, char *args[])
51d9f0492fSopenharmony_ci{
52d9f0492fSopenharmony_ci    (void)signal(SIGINT, signalHandler);
53d9f0492fSopenharmony_ci    (void)signal(SIGKILL, signalHandler);
54d9f0492fSopenharmony_ci    if (tcgetattr(0, &terminalState)) {
55d9f0492fSopenharmony_ci        return -1;
56d9f0492fSopenharmony_ci    }
57d9f0492fSopenharmony_ci    struct termios tio;
58d9f0492fSopenharmony_ci    if (tcgetattr(0, &tio)) {
59d9f0492fSopenharmony_ci        return -1;
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci    tio.c_lflag &= ~(ECHO | ICANON | ISIG);
62d9f0492fSopenharmony_ci    tio.c_cc[VTIME] = 0;
63d9f0492fSopenharmony_ci    tio.c_cc[VMIN] = 1;
64d9f0492fSopenharmony_ci    tcsetattr(0, TCSAFLUSH, &tio);
65d9f0492fSopenharmony_ci
66d9f0492fSopenharmony_ci    BSH_LOGV("BShellEnvStart %d", argc);
67d9f0492fSopenharmony_ci    do {
68d9f0492fSopenharmony_ci        BShellHandle handle = GetShellHandle();
69d9f0492fSopenharmony_ci        if (handle == NULL) {
70d9f0492fSopenharmony_ci            printf("Failed to get shell handle \n");
71d9f0492fSopenharmony_ci            return 0;
72d9f0492fSopenharmony_ci        }
73d9f0492fSopenharmony_ci        const ParamInfo *param = BShellEnvGetReservedParam(handle, PARAM_REVERESD_NAME_CURR_PARAMETER);
74d9f0492fSopenharmony_ci        BSH_CHECK(param != NULL && param->type == PARAM_STRING, break, "Failed to get reversed param");
75d9f0492fSopenharmony_ci        BShellEnvSetParam(handle, param->name, param->desc, param->type, (void *)"");
76d9f0492fSopenharmony_ci        if (argc > 1) {
77d9f0492fSopenharmony_ci            int ret = SetParamShellPrompt(handle, args[1]);
78d9f0492fSopenharmony_ci            if (ret != 0) {
79d9f0492fSopenharmony_ci                break;
80d9f0492fSopenharmony_ci            }
81d9f0492fSopenharmony_ci        }
82d9f0492fSopenharmony_ci        BShellParamCmdRegister(handle, 1);
83d9f0492fSopenharmony_ci#ifdef INIT_TEST
84d9f0492fSopenharmony_ci        BShellCmdRegister(handle, 1);
85d9f0492fSopenharmony_ci#endif
86d9f0492fSopenharmony_ci        BShellEnvStart(handle);
87d9f0492fSopenharmony_ci        BShellEnvLoop(handle);
88d9f0492fSopenharmony_ci    } while (0);
89d9f0492fSopenharmony_ci    demoExit();
90d9f0492fSopenharmony_ci    tcsetattr(0, TCSAFLUSH, &terminalState);
91d9f0492fSopenharmony_ci    return 0;
92d9f0492fSopenharmony_ci}
93d9f0492fSopenharmony_ci#endif
94