File system project updates:
[pintos-anon] / src / examples / ls.c
1 /* ls.c
2   
3    Lists the contents of the directory or directories named on
4    the command line, or of the current directory if none are
5    named.
6
7    By default, only the name of each file is printed.  If "-l" is
8    given as the first argument, the type, size, and inumber of
9    each file is also printed.  This won't work until project 4. */
10
11 #include <syscall.h>
12 #include <stdio.h>
13 #include <string.h>
14
15 static void
16 list_dir (const char *dir, bool verbose) 
17 {
18   int dir_fd = open (dir);
19   if (dir_fd == -1) 
20     {
21       printf ("%s: not found\n", dir);
22       return; 
23     }
24
25   if (isdir (dir_fd))
26     {
27       char name[READDIR_MAX_LEN];
28
29       printf ("%s", dir);
30       if (verbose)
31         printf (" (inumber %d)", inumber (dir_fd));
32       printf (":\n");
33
34       while (readdir (dir_fd, name)) 
35         {
36           printf ("%s", name); 
37           if (verbose) 
38             {
39               char full_name[128];
40               int entry_fd;
41
42               snprintf (full_name, sizeof full_name, "%s/%s", dir, name);
43               entry_fd = open (full_name);
44
45               printf (": ");
46               if (entry_fd != -1)
47                 {
48                   if (isdir (entry_fd))
49                     printf ("directory");
50                   else
51                     printf ("%d-byte file", filesize (entry_fd));
52                   printf (", inumber %d", inumber (entry_fd));
53                 }
54               else
55                 printf ("open failed");
56               close (entry_fd);
57             }
58           printf ("\n");
59         }
60     }
61   else 
62     printf ("%s: not a directory\n", dir);
63   close (dir_fd); 
64 }
65
66 int
67 main (int argc, char *argv[]) 
68 {
69   bool verbose = false;
70   if (argc > 1 && !strcmp (argv[1], "-l")) 
71     {
72       verbose = true;
73       argv++;
74       argc--;
75     }
76   
77   if (argc <= 1)
78     list_dir (".", verbose);
79   else 
80     {
81       int i;
82       for (i = 1; i < argc; i++)
83         list_dir (argv[i], verbose);
84     }
85   return 0;
86 }