提交 d15f0d10 创建 作者: kaashoek's avatar kaashoek

start on mkdir

stat
上级 e4bcd2a3
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "fs.h" #include "fs.h"
char buf[512]; char buf[512];
struct stat stat; struct stat st;
struct dirent dirent; struct dirent dirent;
int int
...@@ -23,20 +23,26 @@ main(int argc, char *argv[]) ...@@ -23,20 +23,26 @@ main(int argc, char *argv[])
printf(2, "ls: cannot open .\n"); printf(2, "ls: cannot open .\n");
exit(); exit();
} }
if (fstat(fd, &stat) < 0) { if (fstat(fd, &st) < 0) {
printf(2, "ls: cannot open .\n"); printf(2, "ls: cannot open .\n");
exit(); exit();
} }
if (stat.st_type != T_DIR) { if (st.st_type != T_DIR) {
printf(2, "ls: . is not a dir\n"); printf(2, "ls: . is not a dir\n");
} }
for(off = 0; off < stat.st_size; off += sizeof(struct dirent)) { cprintf("size %d\n", st.st_size);
for(off = 0; off < st.st_size; off += sizeof(struct dirent)) {
if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) { if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) {
printf(2, "ls: read error\n"); printf(2, "ls: read error\n");
exit(); exit();
} }
if (dirent.inum != 0) if (dirent.inum != 0) {
printf(1, "%s\n", dirent.name);
if (stat (dirent.name, &st) < 0)
printf(2, "stat: failed\n");
printf(1, "%s t %d\n", dirent.name, st.st_type);
}
} }
close(fd); close(fd);
......
...@@ -290,6 +290,31 @@ sys_mknod(void) ...@@ -290,6 +290,31 @@ sys_mknod(void)
} }
int int
sys_mkdir(void)
{
struct proc *cp = curproc[cpu()];
struct inode *nip;
uint arg0;
int l;
if(fetcharg(0, &arg0) < 0)
return -1;
if((l = checkstring(arg0)) < 0)
return -1;
if(l >= DIRSIZ)
return -1;
nip = mknod (cp->mem + arg0, T_DIR, 0, 0);
// XXX put . and .. in
iput(nip);
return (nip == 0) ? -1 : 0;
}
int
sys_unlink(void) sys_unlink(void)
{ {
struct proc *cp = curproc[cpu()]; struct proc *cp = curproc[cpu()];
...@@ -561,6 +586,9 @@ syscall(void) ...@@ -561,6 +586,9 @@ syscall(void)
case SYS_link: case SYS_link:
ret = sys_link(); ret = sys_link();
break; break;
case SYS_mkdir:
ret = sys_mkdir();
break;
default: default:
cprintf("unknown sys call %d\n", num); cprintf("unknown sys call %d\n", num);
// XXX fault // XXX fault
......
...@@ -13,4 +13,5 @@ ...@@ -13,4 +13,5 @@
#define SYS_unlink 16 #define SYS_unlink 16
#define SYS_fstat 17 #define SYS_fstat 17
#define SYS_link 18 #define SYS_link 18
#define SYS_mkdir 19
#include "types.h"
#include "stat.h"
#include "fcntl.h"
#include "user.h" #include "user.h"
int int
...@@ -54,3 +57,16 @@ gets(char *buf, int max) ...@@ -54,3 +57,16 @@ gets(char *buf, int max)
buf[i] = '\0'; buf[i] = '\0';
return buf; return buf;
} }
int
stat(char *n, struct stat *st)
{
int fd = open(n, O_RDONLY);
int r;
if (fd < 0) return -1;
r = fstat(fd, st);
close(fd);
return r;
}
...@@ -14,9 +14,10 @@ int exec(char *, char **); ...@@ -14,9 +14,10 @@ int exec(char *, char **);
int open(char *, int); int open(char *, int);
int mknod (char*,short,short,short); int mknod (char*,short,short,short);
int unlink (char*); int unlink (char*);
struct stat;
int fstat (int fd, struct stat *stat); int fstat (int fd, struct stat *stat);
int link(char *, char *); int link(char *, char *);
int mkdir(char *);
int stat(char *, struct stat *stat);
int puts(char*); int puts(char*);
char* strcpy(char*, char*); char* strcpy(char*, char*);
......
...@@ -65,7 +65,13 @@ main(void) ...@@ -65,7 +65,13 @@ main(void)
printf(stdout, "read failed\n"); printf(stdout, "read failed\n");
} }
close(fd); close(fd);
printf(stdout, "unlink doesnotexist\n");
unlink("doesnotexist"); unlink("doesnotexist");
printf(stdout, "many creates, followed by unlink\n");
name[0] = 'a'; name[0] = 'a';
name[2] = '\0'; name[2] = '\0';
for (i = 0; i < 52; i++) { for (i = 0; i < 52; i++) {
...@@ -80,6 +86,13 @@ main(void) ...@@ -80,6 +86,13 @@ main(void)
unlink(name); unlink(name);
} }
printf(stdout, "mkdir\n");
if (mkdir("dir0") < 0)
printf(stdout, "mkdir failed\n");
// unlink("dir0");
//exec("echo", echo_args); //exec("echo", echo_args);
printf(stdout, "about to do exec\n"); printf(stdout, "about to do exec\n");
exec("cat", cat_args); exec("cat", cat_args);
......
...@@ -23,3 +23,4 @@ STUB(mknod) ...@@ -23,3 +23,4 @@ STUB(mknod)
STUB(unlink) STUB(unlink)
STUB(fstat) STUB(fstat)
STUB(link) STUB(link)
STUB(mkdir)
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论