Browse Source

:new: cat命令

fslongjin 2 năm trước cách đây
mục cha
commit
85707bd8cc

+ 4 - 4
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);
 }
 

+ 1 - 1
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;
 
     // 校验文件描述符范围

+ 54 - 13
user/apps/shell/cmd.c

@@ -7,7 +7,7 @@
 #include <libc/errno.h>
 #include <libc/unistd.h>
 #include <libc/stdlib.h>
-
+#include <libc/fcntl.h>
 #include <libc/dirent.h>
 
 #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 创建空文件的命令

+ 5 - 1
user/apps/shell/cmd_help.c

@@ -1,5 +1,6 @@
 #include "cmd_help.h"
 #include <libc/stdio.h>
+#include <libc/stdlib.h>
 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()

+ 1 - 1
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命令的帮助信息

+ 21 - 14
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;
+    strcpy(dest + strlen(dest), src);
+    return dest;
+}
 
-    for (size_t i = 0; i < src_size; i++)
+/**
+ * @brief 拷贝整个字符串
+ *
+ * @param dst 目标地址
+ * @param src 源地址
+ * @return char* 目标字符串
+ */
+char *strcpy(char *dst, const char *src)
+{
+    while (*src)
     {
-        d[dest_size + i] = src[i];
+        *(dst++) = *(src++);
     }
+    *dst = 0;
 
-    d[dest_size + src_size] = '\0';
-
-    return dest;
+    return dst;
 }

+ 10 - 1
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末尾)