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