xv6

port of xv6 to x86-64
git clone http://frotz.net/git/xv6.git
Log | Files | Refs | README | LICENSE

ls.c (1537B)


      1 #include "types.h"
      2 #include "stat.h"
      3 #include "user.h"
      4 #include "fs.h"
      5 
      6 char*
      7 fmtname(char *path)
      8 {
      9   static char buf[DIRSIZ+1];
     10   char *p;
     11   
     12   // Find first character after last slash.
     13   for(p=path+strlen(path); p >= path && *p != '/'; p--)
     14     ;
     15   p++;
     16   
     17   // Return blank-padded name.
     18   if(strlen(p) >= DIRSIZ)
     19     return p;
     20   memmove(buf, p, strlen(p));
     21   memset(buf+strlen(p), ' ', DIRSIZ-strlen(p));
     22   return buf;
     23 }
     24 
     25 void
     26 ls(char *path)
     27 {
     28   char buf[512], *p;
     29   int fd;
     30   struct dirent de;
     31   struct stat st;
     32   
     33   if((fd = open(path, 0)) < 0){
     34     printf(2, "ls: cannot open %s\n", path);
     35     return;
     36   }
     37   
     38   if(fstat(fd, &st) < 0){
     39     printf(2, "ls: cannot stat %s\n", path);
     40     close(fd);
     41     return;
     42   }
     43   
     44   switch(st.type){
     45   case T_FILE:
     46     printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size);
     47     break;
     48   
     49   case T_DIR:
     50     if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
     51       printf(1, "ls: path too long\n");
     52       break;
     53     }
     54     strcpy(buf, path);
     55     p = buf+strlen(buf);
     56     *p++ = '/';
     57     while(read(fd, &de, sizeof(de)) == sizeof(de)){
     58       if(de.inum == 0)
     59         continue;
     60       memmove(p, de.name, DIRSIZ);
     61       p[DIRSIZ] = 0;
     62       if(stat(buf, &st) < 0){
     63         printf(1, "ls: cannot stat %s\n", buf);
     64         continue;
     65       }
     66       printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
     67     }
     68     break;
     69   }
     70   close(fd);
     71 }
     72 
     73 int
     74 main(int argc, char *argv[])
     75 {
     76   int i;
     77 
     78   if(argc < 2){
     79     ls(".");
     80     exit();
     81   }
     82   for(i=1; i<argc; i++)
     83     ls(argv[i]);
     84   exit();
     85 }