start on mkdir

stat
This commit is contained in:
kaashoek 2006-08-14 03:00:13 +00:00
parent e4bcd2a3a9
commit d15f0d1033
7 changed files with 73 additions and 7 deletions

18
ls.c
View file

@ -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[])
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);

View file

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

View file

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

16
ulib.c
View file

@ -1,3 +1,6 @@
#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)
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;
}

3
user.h
View file

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

View file

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

1
usys.S
View file

@ -23,3 +23,4 @@ STUB(mknod)
STUB(unlink) STUB(unlink)
STUB(fstat) STUB(fstat)
STUB(link) STUB(link)
STUB(mkdir)