Skip to content
Snippets Groups Projects
Commit d15f0d10 authored by kaashoek's avatar kaashoek
Browse files

start on mkdir

stat
parent e4bcd2a3
No related branches found
No related tags found
No related merge requests found
...@@ -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);
......
...@@ -289,6 +289,31 @@ sys_mknod(void) ...@@ -289,6 +289,31 @@ sys_mknod(void)
return (nip == 0) ? -1 : 0; return (nip == 0) ? -1 : 0;
} }
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 int
sys_unlink(void) sys_unlink(void)
{ {
...@@ -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% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment