From 85707bd8cc5da4732e41ac0f4265fb936a872383 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Mon, 30 May 2022 17:39:45 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20cat=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/filesystem/fat32/fat32.c | 8 ++-- kernel/syscall/syscall.c | 2 +- user/apps/shell/cmd.c | 67 ++++++++++++++++++++++++++------- user/apps/shell/cmd_help.c | 6 ++- user/apps/shell/cmd_help.h | 2 +- user/libs/libc/string.c | 41 +++++++++++--------- user/libs/libc/string.h | 11 +++++- 7 files changed, 99 insertions(+), 38 deletions(-) diff --git a/kernel/filesystem/fat32/fat32.c b/kernel/filesystem/fat32/fat32.c index 820f92d0..e5ec9739 100644 --- a/kernel/filesystem/fat32/fat32.c +++ b/kernel/filesystem/fat32/fat32.c @@ -336,8 +336,8 @@ find_lookup_success:; // 找到目标dentry finode->first_clus = ((tmp_dEntry->DIR_FstClusHI << 16) | tmp_dEntry->DIR_FstClusLO) & 0x0fffffff; finode->dEntry_location_clus = cluster; finode->dEntry_location_clus_offset = tmp_dEntry - (struct fat32_Directory_t *)buf; //计算dentry的偏移量 - kdebug("finode->dEntry_location_clus=%#018lx", finode->dEntry_location_clus); - kdebug("finode->dEntry_location_clus_offset=%#018lx", finode->dEntry_location_clus_offset); + // kdebug("finode->dEntry_location_clus=%#018lx", finode->dEntry_location_clus); + // kdebug("finode->dEntry_location_clus_offset=%#018lx", finode->dEntry_location_clus_offset); finode->create_date = tmp_dEntry->DIR_CrtDate; finode->create_time = tmp_dEntry->DIR_CrtTime; finode->write_date = tmp_dEntry->DIR_WrtDate; @@ -1079,11 +1079,11 @@ find_dir_success:; // 将文件夹位置坐标加32(即指向下一个目录项) file_ptr->position += 32; // todo: 计算ino_t - if(dentry_type & ATTR_DIRECTORY) + if (dentry_type & ATTR_DIRECTORY) dentry_type = VFS_ATTR_DIR; else dentry_type = VFS_ATTR_FILE; - + return filler(dirent, 0, dir_name, name_len, dentry_type, 0); } diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 9c1ed36e..ec69274d 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -340,7 +340,7 @@ uint64_t sys_lseek(struct pt_regs *regs) long offset = (long)regs->r9; int whence = (int)regs->r10; - kdebug("sys_lseek: fd=%d", fd_num); + // kdebug("sys_lseek: fd=%d", fd_num); uint64_t retval = 0; // 校验文件描述符范围 diff --git a/user/apps/shell/cmd.c b/user/apps/shell/cmd.c index 5ad8cc3f..2bfd6ad3 100644 --- a/user/apps/shell/cmd.c +++ b/user/apps/shell/cmd.c @@ -7,7 +7,7 @@ #include #include #include - +#include #include #include "cmd_help.h" @@ -200,11 +200,10 @@ done:; * @param argv * @return int */ -// todo: int shell_cmd_ls(int argc, char **argv) { struct DIR *dir = opendir(shell_current_path); - + if (dir == NULL) return -1; @@ -214,23 +213,26 @@ int shell_cmd_ls(int argc, char **argv) while (1) { buf = readdir(dir); - if(buf == NULL) + if (buf == NULL) break; - + int color = COLOR_WHITE; - if(buf->d_type & VFS_ATTR_DIR) + if (buf->d_type & VFS_ATTR_DIR) color = COLOR_YELLOW; - else if(buf->d_type & VFS_ATTR_FILE) + else if (buf->d_type & VFS_ATTR_FILE) color = COLOR_INDIGO; - + char output_buf[256] = {0}; sprintf(output_buf, "%s ", buf->d_name); put_string(output_buf, color, COLOR_BLACK); - } printf("\n"); closedir(dir); + + if (argc > 1) + free(argv); + return 0; } @@ -245,8 +247,8 @@ int shell_cmd_pwd(int argc, char **argv) { if (shell_current_path) printf("%s\n", shell_current_path); - - free(argv); + if (argc > 1) + free(argv); } /** @@ -256,8 +258,47 @@ int shell_cmd_pwd(int argc, char **argv) * @param argv * @return int */ -// todo: -int shell_cmd_cat(int argc, char **argv) {} +int shell_cmd_cat(int argc, char **argv) +{ + int cwd_len = strlen(shell_current_path); + + // 计算文件完整路径的长度 + int file_path_len = cwd_len + strlen(argv[1]); + + char *file_path = (char *)malloc(file_path_len + 2); + + memset(file_path, 0, file_path_len + 2); + + strcpy(file_path, shell_current_path); + + // 在文件路径中加入斜杠 + if (cwd_len > 1) + file_path[cwd_len] = '/'; + + // 拼接完整路径 + strcat(file_path, argv[1]); + + // 打开文件 + int fd = open(file_path, 0); + // 获取文件总大小 + int file_size = lseek(fd, 0, SEEK_END); + // 将文件指针切换回文件起始位置 + lseek(fd, 0, SEEK_SET); + + char *buf = (char *)malloc(512); + memset(buf, 0, 512); + while (file_size > 0) + { + int l = read(fd, buf, 511); + buf[l] = '\0'; + + file_size -= l; + printf("%s", buf); + } + + close(fd); + free(buf); +} /** * @brief 创建空文件的命令 diff --git a/user/apps/shell/cmd_help.c b/user/apps/shell/cmd_help.c index 34f2047f..c74a786c 100644 --- a/user/apps/shell/cmd_help.c +++ b/user/apps/shell/cmd_help.c @@ -1,5 +1,6 @@ #include "cmd_help.h" #include +#include struct help_table_item_t { void (*func)(); @@ -10,11 +11,14 @@ struct help_table_item_t help_table[] = { static const int help_table_num = sizeof(help_table) / sizeof(struct help_table_item_t); -void shell_help() +int shell_help(int argc, char **argv) { printf("Help:\n"); for (int i = 0; i < help_table_num; ++i) help_table[i].func(); + + if(argc > 1) + free(argv); } void shell_help_cd() diff --git a/user/apps/shell/cmd_help.h b/user/apps/shell/cmd_help.h index fa2b6096..7cde19b9 100644 --- a/user/apps/shell/cmd_help.h +++ b/user/apps/shell/cmd_help.h @@ -1,7 +1,7 @@ #pragma once #include "cmd.h" -void shell_help(); +int shell_help(int argc, char **argv); /** * @brief cd命令的帮助信息 diff --git a/user/libs/libc/string.c b/user/libs/libc/string.c index 3e41c8e9..48835816 100644 --- a/user/libs/libc/string.c +++ b/user/libs/libc/string.c @@ -59,13 +59,13 @@ void *memset(void *dst, unsigned char C, uint64_t size) /** * @brief 拷贝指定字节数的字符串 - * + * * @param dst 目标地址 * @param src 源字符串 * @param Count 字节数 - * @return char* + * @return char* */ -char *strncpy(char *dst, char *src, long Count) +char *strncpy(char *dst, const char *src, size_t Count) { __asm__ __volatile__("cld \n\t" "1: \n\t" @@ -86,24 +86,31 @@ char *strncpy(char *dst, char *src, long Count) /** * @brief 拼接两个字符串(将src接到dest末尾) - * + * * @param dest 目标串 * @param src 源串 - * @return char* + * @return char* */ char *strcat(char *dest, const char *src) { - unsigned int dest_size = strlen(dest); - unsigned int src_size = strlen(src); - - char *d = dest; - - for (size_t i = 0; i < src_size; i++) - { - d[dest_size + i] = src[i]; - } - - d[dest_size + src_size] = '\0'; - + strcpy(dest + strlen(dest), src); return dest; +} + +/** + * @brief 拷贝整个字符串 + * + * @param dst 目标地址 + * @param src 源地址 + * @return char* 目标字符串 + */ +char *strcpy(char *dst, const char *src) +{ + while (*src) + { + *(dst++) = *(src++); + } + *dst = 0; + + return dst; } \ No newline at end of file diff --git a/user/libs/libc/string.h b/user/libs/libc/string.h index 33ea2647..ade86b6c 100644 --- a/user/libs/libc/string.h +++ b/user/libs/libc/string.h @@ -28,7 +28,16 @@ int strcmp(const char *FirstPart, const char *SecondPart); * @param Count 字节数 * @return char* */ -char *strncpy(char *dst, char *src, long Count); +char *strncpy(char *dst, const char *src, size_t Count); + +/** + * @brief 拷贝整个字符串 + * + * @param dst 目标地址 + * @param src 源地址 + * @return char* 目标字符串 + */ +char* strcpy(char* dst, const char* src); /** * @brief 拼接两个字符串(将src接到dest末尾)