新建项目
This commit is contained in:
1 parent
5e2e890cfc
commit
633d9b872b
1351 files changed
+730564
No files matched your search
@@ -0,0 +1,52 @@
|
||||
# letter shell file system support
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
letter shell文件系统支持
|
||||
|
||||

|
||||
|
||||
- [letter shell file system support](#letter-shell-file-system-support)
|
||||
- [简介](#简介)
|
||||
- [使用](#使用)
|
||||
|
||||
## 简介
|
||||
|
||||
fs_support作为letter shell的插件,用于实现letter shell对常见文件系统操作的支持,比如说cd,ls等命令,fs_support依赖于letter shell的伴生对象功能,并且使用到了内存分配和内存释放,所以请确认已经配置好了letter shell
|
||||
|
||||
fs_support并非一个完全实现的letter shell插件,由于文件系统的接口和操作系统以及具体使用的文件系统相关,所以fs_support仅仅通过接入几个基本的接口以实现`cd`,`ls`命令,具体使用时,可能需要根据使用的文件系统接口修改fs_support,letter shell的[demo/x86-gcc](demo/x86-gcc)下有针对linux平台的移植,可以及进行参考
|
||||
|
||||
## 使用
|
||||
|
||||
1. 声明`ShellFs`对象并申请当前路径数据缓冲区
|
||||
|
||||
```c
|
||||
ShellFs shellFs;
|
||||
char shellPathBuffer[512] = "/";
|
||||
```
|
||||
|
||||
2. 实现`getcwd`,`chdir`,`listdir`函数
|
||||
|
||||
根据文件系统不同,这些函数会有不同的实现,请根据具体使用的环境进行修改
|
||||
|
||||
3. 初始化`ShellFs`对象
|
||||
|
||||
```c
|
||||
shellFs.getcwd = getcwd;
|
||||
shellFs.chdir = chdir;
|
||||
shellFs.listdir = userShellListDir;
|
||||
shellFsInit(&shellFs, shellPathBuffer, 512);
|
||||
```
|
||||
|
||||
4. 初始化`Shell`对象
|
||||
|
||||
设置shell当前路径缓冲,初始化shell,并添加伴生对象
|
||||
|
||||
```C
|
||||
shellSetPath(&shell, shellPathBuffer);
|
||||
shellInit(&shell, shellBuffer, 512);
|
||||
shellCompanionAdd(&shell, SHELL_COMPANION_ID_FS, &shellFs);
|
||||
```
|
||||
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* @file shell_fs.c
|
||||
* @author Letter (nevermindzzt@gmail.com)
|
||||
* @brief shell file system support
|
||||
* @version 0.1
|
||||
* @date 2020-07-22
|
||||
*
|
||||
* @copyright (c) 2020 Letter
|
||||
*
|
||||
*/
|
||||
#include "shell_fs.h"
|
||||
#include "shell.h"
|
||||
#include "stdio.h"
|
||||
|
||||
/**
|
||||
* @brief 改变当前路径(shell调用)
|
||||
*
|
||||
* @param dir 路径
|
||||
*/
|
||||
void shellCD(char *dir)
|
||||
{
|
||||
Shell *shell = shellGetCurrent();
|
||||
ShellFs *shellFs = shellCompanionGet(shell, SHELL_COMPANION_ID_FS);
|
||||
SHELL_ASSERT(shellFs, return);
|
||||
if (shellFs->chdir(dir) != 0)
|
||||
{
|
||||
shellWriteString(shell, "error: ");
|
||||
shellWriteString(shell, dir);
|
||||
shellWriteString(shell, " is not a directory\r\n");
|
||||
}
|
||||
shellFs->getcwd(shellFs->info.path, shellFs->info.pathLen);
|
||||
}
|
||||
SHELL_EXPORT_CMD(
|
||||
SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
|
||||
cd, shellCD, change dir);
|
||||
|
||||
/**
|
||||
* @brief 列出文件(shell调用)
|
||||
*
|
||||
*/
|
||||
void shellLS(void)
|
||||
{
|
||||
size_t count;
|
||||
char *buffer;
|
||||
|
||||
Shell *shell = shellGetCurrent();
|
||||
ShellFs *shellFs = shellCompanionGet(shell, SHELL_COMPANION_ID_FS);
|
||||
SHELL_ASSERT(shellFs, return);
|
||||
|
||||
buffer = SHELL_MALLOC(SHELL_FS_LIST_FILE_BUFFER_MAX);
|
||||
SHELL_ASSERT(buffer, return);
|
||||
count = shellFs->listdir(shellGetPath(shell), buffer, SHELL_FS_LIST_FILE_BUFFER_MAX);
|
||||
|
||||
shellWriteString(shell, buffer);
|
||||
|
||||
SHELL_FREE(buffer);
|
||||
}
|
||||
SHELL_EXPORT_CMD(
|
||||
SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
|
||||
ls, shellLS, list all files);
|
||||
|
||||
/**
|
||||
* @brief 初始化shell文件系统支持
|
||||
*
|
||||
* @param shellFs shell文件系统对象
|
||||
* @param pathBuffer shell路径缓冲
|
||||
* @param pathLen 路径缓冲区大小
|
||||
*/
|
||||
void shellFsInit(ShellFs *shellFs, char *pathBuffer, size_t pathLen)
|
||||
{
|
||||
shellFs->info.path = pathBuffer;
|
||||
shellFs->info.pathLen = pathLen;
|
||||
shellFs->getcwd(shellFs->info.path, pathLen);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* @file shell_fs.h
|
||||
* @author Letter (nevermindzzt@gmail.com)
|
||||
* @brief shell file system support
|
||||
* @version 0.1
|
||||
* @date 2020-07-22
|
||||
*
|
||||
* @copyright (c) 2020 Letter
|
||||
*
|
||||
*/
|
||||
#ifndef __SHELL_FS_H__
|
||||
#define __SHELL_FS_H__
|
||||
|
||||
#include "stddef.h"
|
||||
#include "shell.h"
|
||||
|
||||
#define SHELL_FS_VERSION "1.0.0"
|
||||
|
||||
#define SHELL_COMPANION_ID_FS -1
|
||||
|
||||
#define SHELL_FS_LIST_FILE_BUFFER_MAX 4096
|
||||
|
||||
/**
|
||||
* @brief shell文件系统支持结构体
|
||||
*
|
||||
*/
|
||||
typedef struct shell_fs
|
||||
{
|
||||
size_t (*getcwd)(char *, size_t);
|
||||
size_t (*chdir)(char *);
|
||||
size_t (*listdir)(char *dir, char *buffer, size_t maxLen);
|
||||
|
||||
struct {
|
||||
char *path;
|
||||
size_t pathLen;
|
||||
} info;
|
||||
} ShellFs;
|
||||
|
||||
void shellFsInit(ShellFs *shellFs, char *pathBuffer, size_t pathLen);
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user