From d7b3b802f414dbf18b5e196ab1a342b19d5f7be8 Mon Sep 17 00:00:00 2001
From: kaashoek <kaashoek>
Date: Mon, 14 Aug 2006 21:22:13 +0000
Subject: [PATCH] user-level programs: mkdir and rm shell parses arguments
 (very simplistic) readme version of README (sh doesn't deal with capital
 characters) printf recognizes %c nicer output format for ls

---
 Makefile | 12 ++++++++++--
 ls.c     | 10 ++++++++--
 mkdir.c  | 22 ++++++++++++++++++++++
 printf.c |  6 +++++-
 readme   |  1 +
 rm.c     | 22 ++++++++++++++++++++++
 sh.c     | 25 ++++++++++++++++++++++---
 userfs.c |  2 +-
 8 files changed, 91 insertions(+), 9 deletions(-)
 create mode 100644 mkdir.c
 create mode 100644 readme
 create mode 100644 rm.c

diff --git a/Makefile b/Makefile
index 059434f..a476cf4 100644
--- a/Makefile
+++ b/Makefile
@@ -91,11 +91,19 @@ ls : ls.o $(ULIB)
 	$(LD) -N -e main -Ttext 0 -o ls ls.o $(ULIB)
 	$(OBJDUMP) -S ls > ls.asm
 
+mkdir : mkdir.o $(ULIB)
+	$(LD) -N -e main -Ttext 0 -o mkdir mkdir.o $(ULIB)
+	$(OBJDUMP) -S mkdir > mkdir.asm
+
+rm : rm.o $(ULIB)
+	$(LD) -N -e main -Ttext 0 -o rm rm.o $(ULIB)
+	$(OBJDUMP) -S rm > rm.asm
+
 mkfs : mkfs.c fs.h
 	cc -o mkfs mkfs.c
 
-fs.img : mkfs userfs usertests echo cat README init sh ls
-	./mkfs fs.img userfs usertests echo cat README init sh ls
+fs.img : mkfs userfs usertests echo cat readme init sh ls mkdir rm
+	./mkfs fs.img userfs usertests echo cat readme init sh ls mkdir rm
 
 -include *.d
 
diff --git a/ls.c b/ls.c
index 9731f6f..607a857 100644
--- a/ls.c
+++ b/ls.c
@@ -13,6 +13,7 @@ main(int argc, char *argv[])
   int fd;
   uint off;
   uint sz;
+  int i;
 
   if(argc > 1){
     puts("Usage: ls\n");
@@ -42,8 +43,13 @@ main(int argc, char *argv[])
 	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);
+      for (i = 0; i < DIRSIZ; i++) {
+	if (dirent.name[i] != '\0')
+	  printf(1, "%c", dirent.name[i]);
+	else
+	  printf(1, " ");
+      }
+      printf(1, "%d %d %d\n", st.st_type, dirent.inum, st.st_size);
     }
   }
   close(fd);
diff --git a/mkdir.c b/mkdir.c
new file mode 100644
index 0000000..1e20832
--- /dev/null
+++ b/mkdir.c
@@ -0,0 +1,22 @@
+#include "types.h"
+#include "stat.h"
+#include "user.h"
+
+main(int argc, char *argv[])
+{
+  int i;
+
+  if(argc < 2){
+    printf(2, "Usage: mkdir files...\n");
+    exit();
+  }
+
+  for(i = 1; i < argc; i++){
+    if (mkdir(argv[i]) < 0) {
+      printf(2, "mkdir: %s failed to create\n", argv[i]);
+      break;
+    }
+  }
+
+  exit();
+}
diff --git a/printf.c b/printf.c
index 0d42236..10e743a 100644
--- a/printf.c
+++ b/printf.c
@@ -1,5 +1,6 @@
-#include "user.h"
 #include "types.h"
+#include "stat.h"
+#include "user.h"
 
 static void
 putc(int fd, char c)
@@ -63,6 +64,9 @@ printf(int fd, char *fmt, ...)
           putc(fd, *s);
           s++;
         }
+      } else if(c == 'c'){
+	putc(fd, *ap);
+	ap++;
       } else if(c == '%'){
         putc(fd, c);
       } else {
diff --git a/readme b/readme
new file mode 100644
index 0000000..ce0bbfb
--- /dev/null
+++ b/readme
@@ -0,0 +1 @@
+This is the content of file README.
diff --git a/rm.c b/rm.c
new file mode 100644
index 0000000..661e88d
--- /dev/null
+++ b/rm.c
@@ -0,0 +1,22 @@
+#include "types.h"
+#include "stat.h"
+#include "user.h"
+
+main(int argc, char *argv[])
+{
+  int i;
+
+  if(argc < 2){
+    printf(2, "Usage: rm files...\n");
+    exit();
+  }
+
+  for(i = 1; i < argc; i++){
+    if (unlink(argv[i]) < 0) {
+      printf(2, "mkdir: %s failed to create\n", argv[i]);
+      break;
+    }
+  }
+
+  exit();
+}
diff --git a/sh.c b/sh.c
index 9d4a308..e2b8959 100644
--- a/sh.c
+++ b/sh.c
@@ -1,9 +1,11 @@
-#include "user.h"
 #include "types.h"
+#include "stat.h"
+#include "user.h"
 #include "fs.h"
 #include "fcntl.h"
 
 char *args[100];
+void parse(char buf[]);
 
 int
 main(void)
@@ -18,8 +20,7 @@ main(void)
       continue;
     pid = fork();
     if(pid == 0){
-      args[0] = buf;
-      args[1] = 0;
+      parse(buf);
       exec(buf, args);
       printf(1, "%s: not found\n", buf);
       exit();
@@ -28,3 +29,21 @@ main(void)
       wait();
   }
 }
+
+void
+parse(char buf[])
+{
+  int j = 1;
+  int i;
+  args[0] = buf;
+  for (i = 0; buf[i] != '\0'; i++) {
+    if (buf[i] == ' ') {
+      buf[i] = '\0';
+      args[j++] = buf + i+1;
+      if (j >= 100) {
+	printf(2, "too many args\n");
+	exit();
+      }
+    }
+  }
+}
diff --git a/userfs.c b/userfs.c
index 5e46814..5d0c859 100644
--- a/userfs.c
+++ b/userfs.c
@@ -9,7 +9,7 @@
 char buf[2000];
 char name[3];
 char *echo_args[] = { "echo", "hello", "goodbye", 0 };
-char *cat_args[] = { "cat", "README", 0 };
+char *cat_args[] = { "cat", "readme", 0 };
 
 int
 main(void)
-- 
GitLab