diff options
| -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); | 
