add lab answers
This commit is contained in:
46
labcodes_answer/lab8_result/user/libs/dir.c
Normal file
46
labcodes_answer/lab8_result/user/libs/dir.c
Normal file
@@ -0,0 +1,46 @@
|
||||
#include <defs.h>
|
||||
#include <string.h>
|
||||
#include <syscall.h>
|
||||
#include <stat.h>
|
||||
#include <dirent.h>
|
||||
#include <file.h>
|
||||
#include <dir.h>
|
||||
#include <error.h>
|
||||
#include <unistd.h>
|
||||
|
||||
DIR dir, *dirp=&dir;
|
||||
DIR *
|
||||
opendir(const char *path) {
|
||||
|
||||
if ((dirp->fd = open(path, O_RDONLY)) < 0) {
|
||||
goto failed;
|
||||
}
|
||||
struct stat __stat, *stat = &__stat;
|
||||
if (fstat(dirp->fd, stat) != 0 || !S_ISDIR(stat->st_mode)) {
|
||||
goto failed;
|
||||
}
|
||||
dirp->dirent.offset = 0;
|
||||
return dirp;
|
||||
|
||||
failed:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct dirent *
|
||||
readdir(DIR *dirp) {
|
||||
if (sys_getdirentry(dirp->fd, &(dirp->dirent)) == 0) {
|
||||
return &(dirp->dirent);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
closedir(DIR *dirp) {
|
||||
close(dirp->fd);
|
||||
}
|
||||
|
||||
int
|
||||
getcwd(char *buffer, size_t len) {
|
||||
return sys_getcwd(buffer, len);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user