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"
char buf[512];
struct stat stat;
struct stat st;
struct dirent dirent;
int
@ -23,20 +23,26 @@ main(int argc, char *argv[])
printf(2, "ls: cannot open .\n");
exit();
}
if (fstat(fd, &stat) < 0) {
if (fstat(fd, &st) < 0) {
printf(2, "ls: cannot open .\n");
exit();
}
if (stat.st_type != T_DIR) {
if (st.st_type != T_DIR) {
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)) {
printf(2, "ls: read error\n");
exit();
}
if (dirent.inum != 0)
printf(1, "%s\n", dirent.name);
if (dirent.inum != 0) {
if (stat (dirent.name, &st) < 0)
printf(2, "stat: failed\n");
printf(1, "%s t %d\n", dirent.name, st.st_type);
}
}
close(fd);

View File

@ -289,6 +289,31 @@ sys_mknod(void)
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
sys_unlink(void)
{
@ -561,6 +586,9 @@ syscall(void)
case SYS_link:
ret = sys_link();
break;
case SYS_mkdir:
ret = sys_mkdir();
break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault

View File

@ -13,4 +13,5 @@
#define SYS_unlink 16
#define SYS_fstat 17
#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"
int
@ -54,3 +57,16 @@ gets(char *buf, int max)
buf[i] = '\0';
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 mknod (char*,short,short,short);
int unlink (char*);
struct stat;
int fstat (int fd, struct stat *stat);
int link(char *, char *);
int mkdir(char *);
int stat(char *, struct stat *stat);
int puts(char*);
char* strcpy(char*, char*);

View File

@ -65,7 +65,13 @@ main(void)
printf(stdout, "read failed\n");
}
close(fd);
printf(stdout, "unlink doesnotexist\n");
unlink("doesnotexist");
printf(stdout, "many creates, followed by unlink\n");
name[0] = 'a';
name[2] = '\0';
for (i = 0; i < 52; i++) {
@ -80,6 +86,13 @@ main(void)
unlink(name);
}
printf(stdout, "mkdir\n");
if (mkdir("dir0") < 0)
printf(stdout, "mkdir failed\n");
// unlink("dir0");
//exec("echo", echo_args);
printf(stdout, "about to do exec\n");
exec("cat", cat_args);

1
usys.S
View File

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