summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-14 21:22:13 +0000
committerkaashoek <kaashoek>2006-08-14 21:22:13 +0000
commitd7b3b802f414dbf18b5e196ab1a342b19d5f7be8 (patch)
treeccbb34d956ae638d1fbcb24d850b62edb05e841a
parentbdb66433031ca96f2fd127995186623cd10c45b3 (diff)
downloadxv6-labs-d7b3b802f414dbf18b5e196ab1a342b19d5f7be8.tar.gz
xv6-labs-d7b3b802f414dbf18b5e196ab1a342b19d5f7be8.tar.bz2
xv6-labs-d7b3b802f414dbf18b5e196ab1a342b19d5f7be8.zip
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
-rw-r--r--Makefile12
-rw-r--r--ls.c10
-rw-r--r--mkdir.c22
-rw-r--r--printf.c6
-rw-r--r--readme1
-rw-r--r--rm.c22
-rw-r--r--sh.c25
-rw-r--r--userfs.c2
8 files changed, 91 insertions, 9 deletions
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)