From bdb66433031ca96f2fd127995186623cd10c45b3 Mon Sep 17 00:00:00 2001
From: kaashoek <kaashoek>
Date: Mon, 14 Aug 2006 14:13:52 +0000
Subject: [PATCH] set size for directories correctly in wdir and mkfs mkdir ls
 shows stat info for each dir entry

---
 fs.c      |  3 ++-
 ls.c      | 20 +++++++++++---------
 mkfs.c    | 11 ++++++++++-
 syscall.c | 12 +++++++++++-
 ulib.c    |  4 ++--
 5 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/fs.c b/fs.c
index cf717a2..2370e0e 100644
--- a/fs.c
+++ b/fs.c
@@ -355,7 +355,8 @@ writei(struct inode *ip, char *addr, uint off, uint n)
     }
     if (r > 0) {
       if (off > ip->size) {
-	ip->size = off;
+	if (ip->type == T_DIR) ip->size = ((off / BSIZE) + 1) * BSIZE;
+	else ip->size = off;
       }
       iupdate(ip);
     }
diff --git a/ls.c b/ls.c
index ada61ec..9731f6f 100644
--- a/ls.c
+++ b/ls.c
@@ -12,6 +12,7 @@ main(int argc, char *argv[])
 {
   int fd;
   uint off;
+  uint sz;
 
   if(argc > 1){
     puts("Usage: ls\n");
@@ -30,18 +31,19 @@ main(int argc, char *argv[])
   if (st.st_type != T_DIR) {
     printf(2, "ls: . is not a dir\n");
   }
-  cprintf("size %d\n", st.st_size);
-  for(off = 0; off < st.st_size; off += sizeof(struct dirent)) {
+  sz = st.st_size;
+  for(off = 0; off < sz; off += sizeof(struct dirent)) {
     if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) {
-      printf(2, "ls: read error\n");
-      exit();
+      printf(1, "ls: read error\n");
+      break;
     }
     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);
+      if (stat (dirent.name, &st) < 0)  {
+	printf(1, "stat: failed\n");
+	break;
+      }
+      printf(1, "%s t %d ino %d sz %d\n", dirent.name, st.st_type, 
+	     dirent.inum, st.st_size);
     }
   }
   close(fd);
diff --git a/mkfs.c b/mkfs.c
index b048e10..15870d9 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -23,6 +23,7 @@ uint freeinode = 1;
 void balloc(int);
 void wsect(uint, void *);
 void winode(uint, struct dinode *);
+void rinode(uint inum, struct dinode *ip);
 void rsect(uint sec, void *buf);
 uint ialloc(ushort type);
 void iappend(uint inum, void *p, int n);
@@ -53,9 +54,10 @@ xint(uint x)
 main(int argc, char *argv[])
 {
   int i, cc, fd;
-  uint bn, rootino, inum;
+  uint bn, rootino, inum, off;
   struct dirent de;
   char buf[512];
+  struct dinode din;
 
   if(argc < 2){
     fprintf(stderr, "Usage: mkfs fs.img files...\n");
@@ -122,6 +124,13 @@ main(int argc, char *argv[])
     close(fd);
   }
 
+  // fix size of root inode dir
+  rinode(rootino, &din);
+  off = xint(din.size);  
+  off = ((off/BSIZE) + 1) * BSIZE;
+  din.size = xint(off);
+  winode(rootino, &din);
+
   balloc(usedblocks);
 
   exit(0);
diff --git a/syscall.c b/syscall.c
index 0ef2670..0a017c7 100644
--- a/syscall.c
+++ b/syscall.c
@@ -294,8 +294,10 @@ sys_mkdir(void)
 {
   struct proc *cp = curproc[cpu()];
   struct inode *nip;
+  struct inode *pip;
   uint arg0;
   int l;
+  struct dirent de;
 
   if(fetcharg(0, &arg0) < 0) 
     return -1;
@@ -308,7 +310,15 @@ sys_mkdir(void)
 
   nip = mknod (cp->mem + arg0, T_DIR, 0, 0);
 
-  // XXX put . and .. in
+  de.name[0] = '.';
+  de.inum = nip->inum;
+  writei (nip, (char *) &de, 0, sizeof(de));
+
+  pip = namei(".", NAMEI_LOOKUP, 0);
+  de.inum = pip->inum;
+  de.name[1] = '.';
+  iput(pip);
+  writei (nip, (char *) &de, sizeof(de), sizeof(de));
 
   iput(nip);
   return (nip == 0) ? -1 : 0;
diff --git a/ulib.c b/ulib.c
index eaa33d3..004b934 100644
--- a/ulib.c
+++ b/ulib.c
@@ -61,11 +61,11 @@ gets(char *buf, int max)
 int
 stat(char *n, struct stat *st)
 {
-  int fd = open(n, O_RDONLY);
+  int fd;
   int r;
 
+  fd = open(n, O_RDONLY);
   if (fd < 0) return -1;
-
   r = fstat(fd, st);
   close(fd);
   return r;
-- 
GitLab