🆕 cat命令

This commit is contained in:
fslongjin 2022-05-30 17:39:45 +08:00
parent 9ee6d33318
commit 85707bd8cc
7 changed files with 99 additions and 38 deletions

View File

@ -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);
}

View File

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

View File

@ -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

View File

@ -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()

View File

@ -1,7 +1,7 @@
#pragma once
#include "cmd.h"
void shell_help();
int shell_help(int argc, char **argv);
/**
* @brief cd命令的帮助信息

View File

@ -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;
}

View File

@ -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末尾