提交 d7b3b802 创建 作者: kaashoek's avatar kaashoek

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
上级 bdb66433
...@@ -91,11 +91,19 @@ ls : ls.o $(ULIB) ...@@ -91,11 +91,19 @@ ls : ls.o $(ULIB)
$(LD) -N -e main -Ttext 0 -o ls ls.o $(ULIB) $(LD) -N -e main -Ttext 0 -o ls ls.o $(ULIB)
$(OBJDUMP) -S ls > ls.asm $(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 mkfs : mkfs.c fs.h
cc -o mkfs mkfs.c cc -o mkfs mkfs.c
fs.img : mkfs 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 ./mkfs fs.img userfs usertests echo cat readme init sh ls mkdir rm
-include *.d -include *.d
......
...@@ -13,6 +13,7 @@ main(int argc, char *argv[]) ...@@ -13,6 +13,7 @@ main(int argc, char *argv[])
int fd; int fd;
uint off; uint off;
uint sz; uint sz;
int i;
if(argc > 1){ if(argc > 1){
puts("Usage: ls\n"); puts("Usage: ls\n");
...@@ -42,8 +43,13 @@ main(int argc, char *argv[]) ...@@ -42,8 +43,13 @@ main(int argc, char *argv[])
printf(1, "stat: failed\n"); printf(1, "stat: failed\n");
break; break;
} }
printf(1, "%s t %d ino %d sz %d\n", dirent.name, st.st_type, for (i = 0; i < DIRSIZ; i++) {
dirent.inum, st.st_size); 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); close(fd);
......
#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();
}
#include "user.h"
#include "types.h" #include "types.h"
#include "stat.h"
#include "user.h"
static void static void
putc(int fd, char c) putc(int fd, char c)
...@@ -63,6 +64,9 @@ printf(int fd, char *fmt, ...) ...@@ -63,6 +64,9 @@ printf(int fd, char *fmt, ...)
putc(fd, *s); putc(fd, *s);
s++; s++;
} }
} else if(c == 'c'){
putc(fd, *ap);
ap++;
} else if(c == '%'){ } else if(c == '%'){
putc(fd, c); putc(fd, c);
} else { } else {
......
This is the content of file README.
#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();
}
#include "user.h"
#include "types.h" #include "types.h"
#include "stat.h"
#include "user.h"
#include "fs.h" #include "fs.h"
#include "fcntl.h" #include "fcntl.h"
char *args[100]; char *args[100];
void parse(char buf[]);
int int
main(void) main(void)
...@@ -18,8 +20,7 @@ main(void) ...@@ -18,8 +20,7 @@ main(void)
continue; continue;
pid = fork(); pid = fork();
if(pid == 0){ if(pid == 0){
args[0] = buf; parse(buf);
args[1] = 0;
exec(buf, args); exec(buf, args);
printf(1, "%s: not found\n", buf); printf(1, "%s: not found\n", buf);
exit(); exit();
...@@ -28,3 +29,21 @@ main(void) ...@@ -28,3 +29,21 @@ main(void)
wait(); 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();
}
}
}
}
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
char buf[2000]; char buf[2000];
char name[3]; char name[3];
char *echo_args[] = { "echo", "hello", "goodbye", 0 }; char *echo_args[] = { "echo", "hello", "goodbye", 0 };
char *cat_args[] = { "cat", "README", 0 }; char *cat_args[] = { "cat", "readme", 0 };
int int
main(void) main(void)
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论