Files
mkrtos-real/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_port.c

168 lines
3.6 KiB
C
Raw Normal View History

2023-12-02 14:36:49 +08:00
/**
* @file shell_port.c
* @author Letter (NevermindZZT@gmail.com)
* @brief
* @version 0.1
* @date 2019-02-22
*
* @copyright (c) 2019 Letter
*
*/
#include "shell.h"
2023-12-02 23:15:33 +08:00
#include "shell_ext.h"
#include "shell_fs.h"
#include "shell_passthrough.h"
#include "shell_secure_user.h"
#include "log.h"
// #include "telnetd.h"
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <stddef.h>
#include <string.h>
#include <sys/time.h>
#include <pthread.h>
2025-03-09 00:21:55 +08:00
#include <fcntl.h>
#include <sys/types.h>
#include <termios.h>
#include <sys/stat.h>
2023-12-02 14:36:49 +08:00
#include "cons_cli.h"
#include "u_sleep.h"
2025-01-06 19:07:10 +08:00
#include "u_sema.h"
#include "u_task.h"
#include <errno.h>
#include <stdlib.h>
2023-12-02 23:15:33 +08:00
static Shell shell;
static ShellFs shellFs;
static char shellBuffer[1024];
2023-12-03 17:54:26 +08:00
// static char shellPathBuffer[128] = "/";
static struct termios old_settings;
static struct termios new_settings;
int script_sh_fd = STDIN_FILENO;
2023-12-02 14:36:49 +08:00
/**
* @brief shell写
*
* @param data
* @param len
*
* @return unsigned short
*/
signed short userShellWrite(char *data, unsigned short len)
{
// if (script_sh_fd == STDIN_FILENO)
{
return write(STDOUT_FILENO, data, len);
}
2023-12-02 14:36:49 +08:00
}
/**
* @brief shell读
*
* @param data
* @param len
*
* @return unsigned short
*/
signed short userShellRead(char *data, unsigned short len)
{
int rlen;
rlen = read(script_sh_fd, data, len);
if (rlen <= 0)
{
if (errno != ENOTTY && errno != EAGAIN) {
exit(0);
}
}
return rlen;
2023-12-02 14:36:49 +08:00
}
2023-12-02 23:15:33 +08:00
/**
* @brief
*
* @param path
* @param buffer
* @param maxLen
* @return size_t 0
*/
size_t userShellListDir(char *path, char *buffer, size_t maxLen)
{
DIR *dir;
struct dirent *ptr;
int i;
2023-12-02 14:36:49 +08:00
2023-12-02 23:15:33 +08:00
if (!path)
{
return 0;
}
dir = opendir(path);
if (!dir)
{
return 0;
}
memset(buffer, 0, maxLen);
while ((ptr = readdir(dir)) != NULL)
{
strcat(buffer, ptr->d_name);
strcat(buffer, "\t");
}
closedir(dir);
return 0;
}
2025-03-09 00:21:55 +08:00
void tty_set_raw_mode(void)
{
if (script_sh_fd == STDIN_FILENO)
{
new_settings = old_settings;
new_settings.c_lflag &= ~(ICANON | ECHO); // 禁用规范模式和回显
new_settings.c_cc[VMIN] = 1; // 读取的最小字符数
new_settings.c_cc[VTIME] = 0; // 读取的超时时间以10ms为单位
tcsetattr(script_sh_fd, TCSANOW, &new_settings);
}
2025-03-09 00:21:55 +08:00
}
void tty_set_normal_mode(void)
{
if (script_sh_fd == STDIN_FILENO)
{
tcsetattr(script_sh_fd, TCSANOW, &old_settings);
}
2025-03-09 00:21:55 +08:00
}
2023-12-02 14:36:49 +08:00
/**
* @brief shell初始化
*
*/
void userShellInit(int argc, char *args[])
2023-12-02 14:36:49 +08:00
{
if (argc > 1)
{
printf("run script:%s\n", args[1]);
script_sh_fd = open(args[1], O_RDWR, 0777);
if (script_sh_fd < 0)
{
script_sh_fd = STDIN_FILENO;
}
} else {
script_sh_fd = STDIN_FILENO;
}
if (script_sh_fd == STDIN_FILENO)
{
tcgetattr(script_sh_fd, &old_settings);
tty_set_raw_mode();
}
2023-12-03 17:54:26 +08:00
// shellFs.getcwd = getcwd;
// shellFs.chdir = chdir;
// shellFs.listdir = userShellListDir;
// shellFsInit(&shellFs, shellPathBuffer, sizeof(shellPathBuffer));
2023-12-02 14:36:49 +08:00
shell.write = userShellWrite;
shell.read = userShellRead;
2023-12-03 17:54:26 +08:00
// shellSetPath(&shell, shellPathBuffer);
2023-12-02 23:15:33 +08:00
shellInit(&shell, shellBuffer, sizeof(shellBuffer));
2023-12-03 17:54:26 +08:00
// shellCompanionAdd(&shell, SHELL_COMPANION_ID_FS, &shellFs);
2023-12-02 14:36:49 +08:00
while (1)
{
shellTask(&shell);
}
}