🆕 完成了ls的功能

This commit is contained in:
fslongjin
2022-05-29 14:36:46 +08:00
parent a4157bb4a7
commit 9ee6d33318
8 changed files with 106 additions and 16 deletions

View File

@ -5,7 +5,7 @@ CFLAGS += -I .
libc_sub_dirs=math
libc: unistd.o fcntl.o malloc.o errno.o printf.o stdlib.o ctype.o string.o
libc: unistd.o fcntl.o malloc.o errno.o printf.o stdlib.o ctype.o string.o dirent.o
@list='$(libc_sub_dirs)'; for subdir in $$list; do \
echo "make all in $$subdir";\
cd $$subdir;\

View File

@ -17,10 +17,15 @@ struct DIR *opendir(const char *path)
{
int fd = open(path, O_DIRECTORY);
if (fd < 0) // 目录打开失败
{
printf("Failed to open dir\n");
return NULL;
}
// printf("open dir: %s\n", path);
// 分配DIR结构体
struct DIR *dirp = (struct DIR *)malloc(sizeof(struct DIR));
// printf("dirp = %#018lx", dirp);
memset(dirp, 0, sizeof(struct DIR));
dirp->fd = fd;
dirp->buf_len = DIR_BUF_SIZE;
@ -59,11 +64,13 @@ int64_t getdents(int fd, struct dirent *dirent, long count)
* @param dir
* @return struct dirent*
*/
struct dirent *reaaddir(struct DIR *dir)
struct dirent *readdir(struct DIR *dir)
{
memset(dir, 0, DIR_BUF_SIZE);
// printf("dir->buf = %#018lx\n", (dir->buf));
memset((dir->buf), 0, DIR_BUF_SIZE);
// printf("memeset_ok\n");
int len = getdents(dir->fd, (struct dirent *)dir->buf, DIR_BUF_SIZE);
// printf("len=%d\n", len);
if (len > 0)
return (struct dirent *)dir->buf;
else

View File

@ -1,6 +1,15 @@
#pragma once
#include <libc/sys/types.h>
/**
* @brief 目录项的属性copy from vfs.h
*
*/
#define VFS_ATTR_FILE (1UL << 0)
#define VFS_ATTR_DIR (1UL << 1)
#define VFS_ATTR_DEVICE (1UL << 2)
#define DIR_BUF_SIZE 256
/**
* @brief 文件夹结构体
@ -22,7 +31,7 @@ struct dirent
off_t d_off; // dir偏移量
unsigned short d_reclen; // 目录下的记录数
unsigned char d_type; // entry的类型
char d_name[256]; // 文件entry的名字
char d_name[]; // 文件entry的名字(是一个零长数组)
};
/**
@ -54,4 +63,4 @@ int closedir(struct DIR *dirp);
* @param dir
* @return struct dirent*
*/
struct dirent* reaaddir(struct DIR* dir);
struct dirent* readdir(struct DIR* dir);