From d15f0d1033a7da6448966d9626ec2776781e4188 Mon Sep 17 00:00:00 2001
From: kaashoek <kaashoek>
Date: Mon, 14 Aug 2006 03:00:13 +0000
Subject: [PATCH] start on mkdir stat

---
 ls.c      | 18 ++++++++++++------
 syscall.c | 28 ++++++++++++++++++++++++++++
 syscall.h |  1 +
 ulib.c    | 16 ++++++++++++++++
 user.h    |  3 ++-
 userfs.c  | 13 +++++++++++++
 usys.S    |  1 +
 7 files changed, 73 insertions(+), 7 deletions(-)

diff --git a/ls.c b/ls.c
index 410c5c0..ada61ec 100644
--- a/ls.c
+++ b/ls.c
@@ -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);
 
diff --git a/syscall.c b/syscall.c
index 5cfc20b..0ef2670 100644
--- a/syscall.c
+++ b/syscall.c
@@ -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
diff --git a/syscall.h b/syscall.h
index 01d09ff..d5e2dbe 100644
--- a/syscall.h
+++ b/syscall.h
@@ -13,4 +13,5 @@
 #define SYS_unlink 16
 #define SYS_fstat 17
 #define SYS_link 18
+#define SYS_mkdir 19
 
diff --git a/ulib.c b/ulib.c
index b759f45..eaa33d3 100644
--- a/ulib.c
+++ b/ulib.c
@@ -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;
+}
diff --git a/user.h b/user.h
index 52b804b..6022bc9 100644
--- a/user.h
+++ b/user.h
@@ -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*);
diff --git a/userfs.c b/userfs.c
index 2726de7..5e46814 100644
--- a/userfs.c
+++ b/userfs.c
@@ -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);
diff --git a/usys.S b/usys.S
index 73170c3..8f93713 100644
--- a/usys.S
+++ b/usys.S
@@ -23,3 +23,4 @@ STUB(mknod)
 STUB(unlink)
 STUB(fstat)
 STUB(link)
+STUB(mkdir)
-- 
GitLab