diff options
author | rsc <rsc> | 2007-08-24 20:03:40 +0000 |
---|---|---|
committer | rsc <rsc> | 2007-08-24 20:03:40 +0000 |
commit | 1b789e1d50df4e7b98fa131fc29caf29a5f38bfa (patch) | |
tree | d3a2bd24a03aaede0a51b8e5938db6d55753e96a | |
parent | 8e88f9e2c617cc1002039c6e37c3c831319b1f8f (diff) | |
download | xv6-labs-1b789e1d50df4e7b98fa131fc29caf29a5f38bfa.tar.gz xv6-labs-1b789e1d50df4e7b98fa131fc29caf29a5f38bfa.tar.bz2 xv6-labs-1b789e1d50df4e7b98fa131fc29caf29a5f38bfa.zip |
Remove puts in favor of printf.
Allow multiple arguments to ls.
-rw-r--r-- | cat.c | 35 | ||||
-rw-r--r-- | echo.c | 7 | ||||
-rw-r--r-- | init.c | 8 | ||||
-rw-r--r-- | ls.c | 120 | ||||
-rw-r--r-- | sh.c | 2 | ||||
-rw-r--r-- | ulib.c | 6 | ||||
-rw-r--r-- | user.h | 1 |
7 files changed, 82 insertions, 97 deletions
@@ -2,19 +2,17 @@ #include "stat.h" #include "user.h" -char buf[513]; +char buf[512]; void rfile(int fd) { - int cc; + int n; - while((cc = read(fd, buf, sizeof(buf) - 1)) > 0){ - buf[cc] = '\0'; - puts(buf); - } - if(cc < 0){ - puts("cat: read error\n"); + while((n = read(fd, buf, sizeof(buf))) > 0) + write(1, buf, n); + if(n < 0){ + printf(1, "cat: read error\n"); exit(); } } @@ -26,19 +24,16 @@ main(int argc, char *argv[]) if(argc <= 1) { rfile(0); - } else { - for(i = 1; i < argc; i++){ - fd = open(argv[i], 0); - if(fd < 0){ - puts("cat: cannot open "); - puts(argv[i]); - puts("\n"); - exit(); - } - rfile(fd); - close(fd); - } + exit(); } + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], 0)) < 0){ + printf(1, "cat: cannot open %s\n", argv[i]); + exit(); + } + rfile(fd); + close(fd); + } exit(); } @@ -7,10 +7,7 @@ main(int argc, char *argv[]) { int i; - for(i = 1; i < argc; i++){ - puts(argv[i]); - puts(" "); - } - puts("\n"); + for(i = 1; i < argc; i++) + printf(1, "%s%s", argv[i], i+1 < argc ? " " : "\n"); exit(); } @@ -21,18 +21,18 @@ main(void) dup(0); // stderr for(;;){ - puts("init: starting sh\n"); + printf(1, "init: starting sh\n"); pid = fork(); if(pid < 0){ - puts("init: fork failed\n"); + printf(1, "init: fork failed\n"); exit(); } if(pid == 0){ exec("sh", sh_args); - puts("init: exec sh failed\n"); + printf(1, "init: exec sh failed\n"); exit(); } while((wpid=wait()) >= 0 && wpid != pid) - puts("zombie!\n"); + printf(1, "zombie!\n"); } } @@ -3,83 +3,83 @@ #include "user.h" #include "fs.h" -void -pname(char *n) +char* +fmtname(char *path) { - int i; - - for(i = 0; (i < DIRSIZ) && (n[i] != '\0') ; i++) { - printf(1, "%c", n[i]); - } - for(; i < DIRSIZ; i++) - printf(1, " "); + static char buf[DIRSIZ+1]; + char *p; + + // Find first character after last slash. + for(p=path+strlen(path); p >= path && *p != '/'; p--) + ; + p++; + + // Return blank-padded name. + if(strlen(p) >= DIRSIZ) + return p; + memmove(buf, p, strlen(p)); + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + return buf; } -int -main(int argc, char *argv[]) +void +ls(char *path) { char buf[512], *p; int fd; - uint off, sz; struct dirent de; struct stat st; - - if(argc > 2){ - puts("Usage: ls [dir]\n"); - exit(); + + if((fd = open(path, 0)) < 0){ + printf(2, "ls: cannot open %s\n", path); + return; } - - if(argc == 2) { - fd = open(argv[1], 0); - if(fd < 0){ - printf(2, "ls: cannot open %s\n", argv[1]); - exit(); - } - } else { - fd = open(".", 0); - if(fd < 0){ - printf(2, "ls: cannot open .\n"); - exit(); - } + + if(fstat(fd, &st) < 0){ + printf(2, "ls: cannot stat %s\n", path); + close(fd); + return; } - - if(fstat(fd, &st) < 0) { - printf(2, "ls: cannot stat dir\n"); - exit(); - } - - switch(st.type) { + + switch(st.type){ case T_FILE: - pname(argv[1]); - printf(1, "%d %d %d\n", st.type, st.ino, st.size); + printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size); break; + case T_DIR: - sz = st.size; - for(off = 0; off < sz; off += sizeof(de)) { - if(read(fd, &de, sizeof(de)) != sizeof(de)) { - printf(1, "ls: read error\n"); - break; - } - if(de.inum != 0) { - p = buf; - if(argc == 2) { - strcpy(p, argv[1]); - p += strlen(p); - if(*(p-1) != '/') - *p++ = '/'; - } - memmove(p, de.name, DIRSIZ); - p[DIRSIZ] = 0; - if(stat(buf, &st) < 0) { - printf(1, "stat: failed %s\n", de.name); - continue; - } - pname(de.name); - printf(1, "%d %d %d\n", st.type, de.inum, st.size); + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + printf(1, "ls: path too long\n"); + break; + } + strcpy(buf, path); + p = buf+strlen(buf); + *p++ = '/'; + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + if(de.inum == 0) + continue; + memmove(p, de.name, DIRSIZ); + p[DIRSIZ] = 0; + if(stat(buf, &st) < 0){ + printf(1, "ls: cannot stat %s\n", buf); + continue; } + printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size); } break; } close(fd); +} + +int +main(int argc, char *argv[]) +{ + int i; + + if(argc < 2){ + ls("."); + exit(); + } + for(i=1; i<argc; i++) + ls(argv[i]); exit(); } @@ -51,7 +51,7 @@ main(void) int getcmd(char *buf, int nbuf) { - puts("$ "); + printf(2, "$ "); memset(buf, 0, nbuf); gets(buf, nbuf); if(buf[0] == 0) // EOF @@ -3,12 +3,6 @@ #include "fcntl.h" #include "user.h" -int -puts(char *s) -{ - return write(1, s, strlen(s)); -} - char* strcpy(char *s, char *t) { @@ -21,7 +21,6 @@ char* sbrk(int); // ulib.c int stat(char*, struct stat*); -int puts(char*); char* strcpy(char*, char*); void *memmove(void*, void*, int); char* strchr(const char*, char c); |